Paramiko help - processing multiple commands

J. Clifford Dyer jcd at sdf.lonestar.org
Thu Jun 25 09:37:58 EDT 2009


On Wed, 2009-06-24 at 15:22 -0700, Frank Ruiz wrote:
> 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
> 

It looks like you are trying to create a configuration class, but going
through extra gyrations to use global variables instead.  Perl's class
system is rather convoluted, but it is straightforward in python, and
will make your code easier to maintain.  I recommend you take a look at
the section on classes in the python tutorial, and play around with it.
Not everything needs to be a class in python, but in certain cases (and
this is one of them) it will make things much cleaner.

> 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()
> 

You just did it.  You processed two commands.  The only problem is that
you wrote values to stdin, stdout, and stderr with the show command, and
then immediately overwrote them with the help command.  Use different
variable names for each command (like stdout_show and stdout_help), and
you should be fine.

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




More information about the Python-list mailing list