我想基本上包装交互式ssh,自动化登录阶段:
child = pexpect.spawn('ssh ...')
child.expect('Pass prompt: ')
child.sendline(password)
child.expect('shell prompt> ')
child.sendline('cd /some/where')
child.interact()
这很有效。但是,当用户退出shell时(不使用expect的控件字符),它们会出现异常(OSError)。 我的解决方案是:
try:
child.interact()
except OSError as err:
if err.errno == 5 and not child.isalive():
# print 'Child exited'
pass
else:
raise
还有其他清洁解决方案吗?
另外,我想让“cd / some / where”没有回应给用户。我尝试过:
child.setecho(False)
child.sendline('cd /some/where')
child.setecho(True)
但是这个命令仍然被回应。有没有更正确的方法,或者这是setecho中的错误?
答案 0 :(得分:0)
最好的方法是使用pxssh 它可以处理生成SSH进程时所需的一切
请参阅以下代码:
import pxssh
import getpass
def connect():
try:
s = pxssh.pxssh()
s.logfile = open('/tmp/logfile.txt', "w")
hostname = raw_input('hostname: ')
username = raw_input('username: ')
password = getpass.getpass('password: ')
s.login(hostname, username, password)
s.sendline('ls -l') # run a command
s.prompt() # match the prompt
print(s.before) # print everything before the prompt.
s.logout()
except pxssh.ExceptionPxssh as e:
print("pxssh failed on login.")
print(e)
if __name__ == '__main__':
connect()