Question

I'm steadily working on how to ssh and parse data on a device by running a command. I have had a few questions along the way of this endeavor and much help with the questions I have asked. I'm now working with pexpect and I'm not seeing much in documentation with what I am doing. Basically I need to ssh in, as I said, and then run a command that will print out data, then get that data to print to my console.

Here is my code:

import pexpect
import pxssh
import getpass

child = pexpect.spawn('ssh www.example.com')
password = getpass.getpass('password: ')
child.sendline ('foo bar')
data = (child.read_nonblocking(size=1000, timeout=100))
print data

OUTPUT:

password:
foo bar

In the foo bar command the first line of the print out is foo bar so I am wondering if this is trying to print this data but only printing the first line. I add the read_nonblocking(size=1000, timeout=100) trying to set the size to be greater and a timeout to let the data print.

UPDATE with PXSSH

I have also tried to use the pxssh samples to do this and get only the list of commands that foo can run. I need to get the print out of foo bar which is the list of configs. My guess is that you can't have commands with spaces? Here is the code I have tried:

import pxssh
import getpass
try:
    s = pxssh.pxssh()
    s.force_password = True
    hostname = raw_input('hostname: ')
    username = raw_input('username: ')
    password = getpass.getpass('password: ')
    s.login (hostname, username, password)
    s.sendline ('foo bar')  # run a command
    s.prompt()             # match the prompt
    print s.before         # print everything before the prompt.
    s.logout()
except pxssh.ExceptionPxssh, e:
    print "pxssh failed on login."
    print str(e)

Which gives me this back in console:

pxssh failed on login.
could not set shell prompt
:

Session idle time out is disabled

SSH> unset PROMPT_COMMAND
   Error - Command [unset PROMPT_COMMAND] not found.
   foo [ bar | bart | ran | up
         | cmd | bee | hvac | monkey
         | selective | list | help ]
   check[v,nv,beep] [ list | help ]
   delete [ all | bee | neewb | stuff
          | up | cmd | fooconfig | root
          | app | list | hvac | monkey
          | selective | <filename> | confirmed | list | help ]
   exit [ help ]
   get [ vcf | nvcf | snmpcf | help ] [<filename>]
   verbose [ help ]
   help [ <command> | help ]
     up arrow - brings up old command lines
     down arrow - brings up newer command lines
     right arrow - moves cursor to the right
     left arrow - moves cursor to the left
     insert - inserts a space at the cursor
     delete - deletes character at the cursor
SSH> PS1='[PEXPECT]\$ '
   Error - Command [PS1='[PEXPECT]\$ '] not found.
   foo [ bar | bart | ran | up
         | cmd | bee | hvac | monkey
         | selective | list | help ]
   check[v,nv,beep] [ list | help ]
   delete [ all | bee | neewb | stuff
          | up | cmd | fooconfig | root
          | app | list | hvac | monkey
          | selective | <filename> | confirmed | list | help ]
   exit [ help ]
   get [ vcf | nvcf | snmpcf | help ] [<filename>]
   verbose [ help ]
   help [ <command> | help ]
     up arrow - brings up old command lines
     down arrow - brings up newer command lines
     right arrow - moves cursor to the right
     left arrow - moves cursor to the left
     insert - inserts a space at the cursor
     delete - deletes character at the cursor

And as I mentioned I'm just trying to get the console to print out the foo bar command configs. This is the code I had working with python-exscript before finding out I needed to work in older Python 2.4.

CODE THAT I HAD WORKING IN EXSCRIPT THAT I NEED PEXPECT TO DO

account = read_login()              
conn = SSH2()                       
conn.connect('example.com')     
conn.login(account)           

conn.execute('foo bar')
data = conn.response
conn.send('exit\r')               
conn.close()
print data

Any help on how to get this code to work is greatly appreciated! Thanks!

Was it helpful?

Solution

Figured out the issue. I was missing a s.prompt()

try:
    s = pxssh.pxssh(timeout=60, maxread=2000000)
    s.force_password = True
    hostname = raw_imput('hostname: ')
    username = raw_input('password: ')
    password = getpass.getpass('password: ')
    s.PROMPT= 'SSH> '
    s.login (hostname, username, password, auto_prompt_reset=False)
    s.prompt()
    s.sendline('foo bar')
    s.prompt()
    data = s.before
    print data
    s.logout()
except pxssh.ExceptionPxssh, e:
    print "pxssh failed on login."
    print str(e)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top