Paramiko help - processing multiple commands

F

Frank Ruiz

Greetings,

I am trying to process multiple commands using paramiko. I have
searched other threads, and I think my use case is a little different.
I am trying to login to a storage node that has a special shell, and
as such I cant execute a script on the storage node side.

I am also trying to avoid using pexpect because I hate making system
calls.. hence my leaning towards paramiko.

Was hoping someone could help me identify a way to process multiple
commands using paramiko.

I have two commands listed below, however only one is getting processed.

Any help is much appreciated.

Thanks!

Here is my script:

#!/usr/bin/env python


#-Modules---------------------------------------------------------------------
import optparse
import sys
import paramiko


#-Variables-------------------------------------------------------------------
plog = 'storagessh.log'
suser = 'root'


#-Config----------------------------------------------------------------------

#-Subs-Defined----------------------------------------------------------------
def options():
global hostname
global goldenimage
global lunclone
global sshport

usage = "usage: %prog [options] -n <nodename> -g <goldenimage> -l <lun>"

parser = optparse.OptionParser(usage)

parser.add_option("-n", "--node",
dest="hostname",
help="Name of storage node you are connecting to.")
parser.add_option("-g", "--gold",
dest="goldenimage",
help="Name of goldenimage to clone.")
parser.add_option("-l", "--lun",
dest="lunclone",
help="Name of lun to create.")
parser.add_option("-p", "--port",
dest="sshport",
default=22,
help="SSH port number.")
options, args = parser.parse_args()

if not options.hostname:
parser.error("Missing hostname argument.")
exit
elif not options.goldenimage:
parser.error("Missing goldenimage argument.")
exit
elif not options.lunclone:
parser.error("Missing lun argument.")
exit

hostname = options.hostname
goldenimage = options.goldenimage
lunclone = options.lunclone
sshport = options.sshport

def storagessh():
paramiko.util.log_to_file(plog)
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect(hostname, sshport, suser)
stdin, stdout, stderr = client.exec_command('show')
stdin, stdout, stderr = client.exec_command('help')
print stdout.read()
client.close()




#--Initialization-------------------------------------------------------------
if __name__ == "__main__":
options()
storagessh()
 
J

Jon Clements

Greetings,

I am trying to process multiple commands using paramiko. I have
searched other threads, and I think my use case is a little different.
I am trying to login to a storage node that has a special shell, and
as such I cant execute a script on the storage node side.

I am also trying to avoid using pexpect because I hate making system
calls.. hence my leaning towards paramiko.

Was hoping someone could help me identify a way to process multiple
commands using paramiko.

I have two commands listed below, however only one is getting processed.

Any help is much appreciated.

Thanks!

Here is my script:

#!/usr/bin/env python

#-Modules---------------------------------------------------------------------
import optparse
import sys
import paramiko

#-Variables-------------------------------------------------------------------
plog = 'storagessh.log'
suser = 'root'

#-Config----------------------------------------------------------------------

#-Subs-Defined----------------------------------------------------------------
def options():
    global hostname
    global goldenimage
    global lunclone
    global sshport

    usage = "usage: %prog [options] -n <nodename> -g <goldenimage> -l <lun>"

    parser = optparse.OptionParser(usage)

    parser.add_option("-n", "--node",
                      dest="hostname",
                      help="Name of storage node you are connecting to.")
    parser.add_option("-g", "--gold",
                      dest="goldenimage",
                      help="Name of goldenimage to clone.")
    parser.add_option("-l", "--lun",
                      dest="lunclone",
                      help="Name of lun to create..")
    parser.add_option("-p", "--port",
                      dest="sshport",
                      default=22,
                      help="SSH port number.")
    options, args = parser.parse_args()

    if not options.hostname:
        parser.error("Missing hostname argument.")
        exit
    elif not options.goldenimage:
        parser.error("Missing goldenimage argument.")
        exit
    elif not options.lunclone:
        parser.error("Missing lun argument.")
        exit

    hostname = options.hostname
    goldenimage = options.goldenimage
    lunclone = options.lunclone
    sshport = options.sshport

def storagessh():
    paramiko.util.log_to_file(plog)
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.connect(hostname, sshport, suser)
    stdin, stdout, stderr = client.exec_command('show')
    stdin, stdout, stderr = client.exec_command('help')
    print stdout.read()
    client.close()

#--Initialization-------------------------------------------------------------
if __name__ == "__main__":
    options()
    storagessh()

Again, as you were asked on the original post -- full tracebacks and
explain "what is not working".

The use of global variables scares me -- why are those needed?
 
F

Frank Ruiz

Hi Jon,

Thanks for the reply. So there are no errors. Essentially everything
runs as planned. Sorry for being ignorant, but I am not sure if there
is another way for providing trace data. I will look into what other
debugging I can provide.

Essentially what happens is that only the second command gets
processed and the first is ignored.

As far as the global variables are concerned, I am not too sure what
the best way is to allow my variables to be seen by another sub. In
the script I am using optparse, however in order for the variables to
make any sense to my storagessh sub, I have to declare them as global,
since all the variables within my options sub have a local scope.

I am not too sure of a better way to do this. I don't like it much
either. Hopefully you can help me shed some light on this in terms of
best practice.

Normally I declare variable scope outside of my subroutines where required.

However since variable scope is local within a subroutine, seems like
I have to declare them global in order for the other subs to see it.

Anyhow.. your feedback has been much appreciated.. The script is still
a work in progress, so I plan to do so more cosmetic enhancements once
I review it a few more times.

Thanks!

Greetings,

I am trying to process multiple commands using paramiko. I have
searched other threads, and I think my use case is a little different.
I am trying to login to a storage node that has a special shell, and
as such I cant execute a script on the storage node side.

I am also trying to avoid using pexpect because I hate making system
calls.. hence my leaning towards paramiko.

Was hoping someone could help me identify a way to process multiple
commands using paramiko.

I have two commands listed below, however only one is getting processed.

Any help is much appreciated.

Thanks!

Here is my script:

#!/usr/bin/env python

#-Modules---------------------------------------------------------------------
import optparse
import sys
import paramiko

#-Variables-------------------------------------------------------------------
plog = 'storagessh.log'
suser = 'root'

#-Config----------------------------------------------------------------------

#-Subs-Defined----------------------------------------------------------------
def options():
    global hostname
    global goldenimage
    global lunclone
    global sshport

    usage = "usage: %prog [options] -n <nodename> -g <goldenimage> -l <lun>"

    parser = optparse.OptionParser(usage)

    parser.add_option("-n", "--node",
                      dest="hostname",
                      help="Name of storage node you are connecting to.")
    parser.add_option("-g", "--gold",
                      dest="goldenimage",
                      help="Name of goldenimage to clone.")
    parser.add_option("-l", "--lun",
                      dest="lunclone",
                      help="Name of lun to create.")
    parser.add_option("-p", "--port",
                      dest="sshport",
                      default=22,
                      help="SSH port number.")
    options, args = parser.parse_args()

    if not options.hostname:
        parser.error("Missing hostname argument.")
        exit
    elif not options.goldenimage:
        parser.error("Missing goldenimage argument.")
        exit
    elif not options.lunclone:
        parser.error("Missing lun argument.")
        exit

    hostname = options.hostname
    goldenimage = options.goldenimage
    lunclone = options.lunclone
    sshport = options.sshport

def storagessh():
    paramiko.util.log_to_file(plog)
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.connect(hostname, sshport, suser)
    stdin, stdout, stderr = client.exec_command('show')
    stdin, stdout, stderr = client.exec_command('help')
    print stdout.read()
    client.close()

#--Initialization-------------------------------------------------------------
if __name__ == "__main__":
    options()
    storagessh()

Again, as you were asked on the original post -- full tracebacks and
explain "what is not working".

The use of global variables scares me -- why are those needed?
 
N

Noah Dain

Hi Jon,

Thanks for the reply. So there are no errors. Essentially everything
runs as planned. Sorry for being ignorant, but I am not sure if there
is another way for providing trace data. I will look into what other
debugging I can provide.

Essentially what happens is that only the second command gets
processed and the first is ignored.

As far as the global variables are concerned, I am not too sure what
the best way is to allow my variables to be seen by another sub. In
the script I am using optparse, however in order for the variables to
make any sense to my storagessh sub, I have to declare them as global,
since all the variables within my options sub have a local scope.

I am not too sure of a better way to do this. I don't like it much
either. Hopefully you can help me shed some light on this in terms of
best practice.

Normally I declare variable scope outside of my subroutines where required.

However since variable scope is local within a subroutine, seems like
I have to declare them global in order for the other subs to see it.

Anyhow.. your feedback has been much appreciated.. The script is still
a work in progress, so I plan to do so more cosmetic enhancements once
I review it a few more times.

Thanks!

Greetings,

I am trying to process multiple commands using paramiko. I have
searched other threads, and I think my use case is a little different.
I am trying to login to a storage node that has a special shell, and
as such I cant execute a script on the storage node side.

I am also trying to avoid using pexpect because I hate making system
calls.. hence my leaning towards paramiko.

Was hoping someone could help me identify a way to process multiple
commands using paramiko.

I have two commands listed below, however only one is getting processed..

Any help is much appreciated.

Thanks!

Here is my script:

#!/usr/bin/env python

#-Modules---------------------------------------------------------------------
import optparse
import sys
import paramiko

#-Variables-------------------------------------------------------------------
plog = 'storagessh.log'
suser = 'root'

#-Config----------------------------------------------------------------------

#-Subs-Defined----------------------------------------------------------------
def options():
    global hostname
    global goldenimage
    global lunclone
    global sshport

    usage = "usage: %prog [options] -n <nodename> -g <goldenimage> -l <lun>"

    parser = optparse.OptionParser(usage)

    parser.add_option("-n", "--node",
                      dest="hostname",
                      help="Name of storage node you are connecting to.")
    parser.add_option("-g", "--gold",
                      dest="goldenimage",
                      help="Name of goldenimage to clone.")
    parser.add_option("-l", "--lun",
                      dest="lunclone",
                      help="Name of lun to create.")
    parser.add_option("-p", "--port",
                      dest="sshport",
                      default=22,
                      help="SSH port number.")
    options, args = parser.parse_args()

    if not options.hostname:
        parser.error("Missing hostname argument.")
        exit
    elif not options.goldenimage:
        parser.error("Missing goldenimage argument.")
        exit
    elif not options.lunclone:
        parser.error("Missing lun argument.")
        exit

    hostname = options.hostname
    goldenimage = options.goldenimage
    lunclone = options.lunclone
    sshport = options.sshport

def storagessh():
    paramiko.util.log_to_file(plog)
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.connect(hostname, sshport, suser)
    stdin, stdout, stderr = client.exec_command('show')
    stdin, stdout, stderr = client.exec_command('help')
    print stdout.read()
    client.close()

#--Initialization-------------------------------------------------------------
if __name__ == "__main__":
    options()
    storagessh()

Again, as you were asked on the original post -- full tracebacks and
explain "what is not working".

The use of global variables scares me -- why are those needed?

this works for me:

def storagessh():
paramiko.util.log_to_file(plog)
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect(hostname, sshport, suser)
stdin, stdout, stderr = client.exec_command('ps')
print stdout.read()
stdin, stdout, stderr = client.exec_command('help')
print stdout.read()
client.close()

1) you reassign stdin, stdout, stderr so with your code you will never
see the stdout of the first command ('show')
2) the 'show' command did not exist on my system, so no output. I
substituted 'ps' and added the print statement

also, using user 'root' for dev code is a Bad Thing.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top