Я постоянно работаю над тем, как 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
Любая помощь в том, как заставить этот код работать, очень ценится! Спасибо!
child.expect(x)
, где x — это то, что будет напечатано в конце вашего вывода (например, в следующем приглашении), а затем взять вывод изchild.before
. - person Thomas K   schedule 22.01.2014pexpect
запустить команду и получить результат для печати? - person tjoenz   schedule 22.01.2014conn.execute('foo bar') data = conn.response print data
сpython-exscript
, что эквивалентноpexpect
? Спасибо! - person tjoenz   schedule 22.01.2014foo bar
и выведет на консоль ВСЕ доступные командыfoo
. Он не будет печатать фактическую полную конфигурациюfoo bar
, которую должен. - person tjoenz   schedule 22.01.2014s.auto_prompt_reset = False; s.PROMPT='SSH> '
перед вызовомs.login()
. - person Thomas K   schedule 23.01.2014SSH>
- person tjoenz   schedule 23.01.2014unset PROMPT_COMMAND Error - Command [unset PROMPT_COMMAND] not found.
- person tjoenz   schedule 23.01.2014auto_prompt_reset=False
вs.login()
, а не устанавливать его как атрибут. Это ошибка в документах. - person Thomas K   schedule 23.01.2014