2009-08-21 2 views
7

У меня googled «python ssh». Существует замечательный модуль pexpect, который может получить доступ к удаленному компьютеру с помощью ssh (с паролем).Как получить консольный вывод с удаленного компьютера (ssh + python)

После подключения удаленного компьютера я могу выполнять другие команды. Однако я не могу получить результат в python снова.

p = pexpect.spawn("ssh [email protected]_computer") 
print "connecting..." 
p.waitnoecho() 
p.sendline(my_password) 
print "connected" 
p.sendline("ps -ef") 
p.expect(pexpect.EOF) # this will take very long time 
print p.before 

Как получить результат от ps -ef в моем случае?

+0

hmm? p.before должен дать результат –

+0

python возвращает «None» – stanleyxu2005

ответ

1

Возможно, вы также захотите исследовать paramiko, который является еще одной библиотекой SSH для Python.

+0

После того, как вы попробовали так много разных решений, я думаю, что эта библиотека сейчас является лучшей практикой. Мне даже не нужно настраивать вход без пароля для запуска любого скрипта на чужие узлы по локальной сети. – stanleyxu2005

1

Попробуйте отправить

p.sendline("ps -ef\n") 

IIRC, текст отправленное истолковано дословно, поэтому другой компьютер, вероятно, ждет вас, чтобы завершить команду.

8

Вы пробовали еще более простой подход?

>>> from subprocess import Popen, PIPE 
>>> stdout, stderr = Popen(['ssh', '[email protected]_computer', 'ps -ef'], 
...      stdout=PIPE).communicate() 
>>> print(stdout) 

Конечно, это работает только потому, что у меня есть ssh-agent работает поджат с помощью закрытого ключа, что удаленный хост знает.

+1

Спасибо за этот отзыв. Есть ли простой способ настройки секретных ключей для многих клиентов? Я должен проверять файлы журналов по 20 машин каждую неделю. Это мотивация написания скрипта python. – stanleyxu2005

+0

Ну ... вам просто нужно добавить свой открытый ключ в ~/.ssh/authorized_keys на каждой из машин. Возможно, если ваш рабочий набор машин не сильно изменится, это будет одноразовое упражнение. BTW, это довольно аккуратная статья о создании агента SSH и т. Д.: http://unixwiz.net/techtips/ssh-agent-forwarding.html –

3
child = pexpect.spawn("ssh [email protected]_computer ps -ef") 
print "connecting..." 
i = child.expect(['[email protected]_computer\'s password:']) 
child.sendline(user_password) 
i = child.expect([' .*']) #or use i = child.expect([pexpect.EOF]) 
if i == 0: 
    print child.after # uncomment when using [' .*'] pattern 
    #print child.before # uncomment when using EOF pattern 
else: 
    print "Unable to capture output" 


Hope this help..