似乎无法从命令中打印数据

时间:2014-01-21 20:32:12

标签: python ssh pexpect

我正在稳步研究如何通过运行命令来ssh和解析设备上的数据。在这项努力的过程中,我遇到了一些问题,并对我提出的问题提出了很多帮助。我现在正在使用pexpect,我在文档中看不到我正在做的事情。基本上我需要ssh,正如我所说,然后运行一个命令,打印出数据,然后将数据打印到我的控制台。

这是我的代码:

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

输出:

password:
foo bar

foo bar命令中,打印输出的第一行是foo bar所以我想知道这是否正在尝试打印此数据但只打印第一行。我添加read_nonblocking(size=1000, timeout=100)试图将大小设置为更大,并添加超时以打印数据。

使用PXSSH更新

我还尝试使用pxssh示例执行此操作,并仅获取foo可以运行的命令列表。我需要从foo bar打印出来,这是配置列表。 我的猜测是你不能有空格的命令?这是我试过的代码:

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)

这让我回到了控制台:

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

正如我所提到的,我只是想让控制台打印出foo bar命令配置。这是我在使用python-exscript之前与Python 2.4合作的代码。

我在EXSCRIPT中工作的代码,我需要做到这一点

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

非常感谢有关如何使此代码工作的任何帮助!谢谢!

1 个答案:

答案 0 :(得分:3)

找出问题所在。我错过了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)