Pexpect ssh包装优雅的戒烟和沉默的命令

时间:2014-10-22 15:47:54

标签: pexpect

我想基本上包装交互式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中的错误?

1 个答案:

答案 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()