我正试图通过paramiko运行一个交互式命令.cmd执行尝试提示输入密码但我不知道如何通过paramiko的exec_command提供密码并且执行挂起.如果cmd执行需要交互式输入,有没有办法将值发送到终端?
ssh = paramiko.SSHClient() ssh.connect(server, username=username, password=password) ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql")
有谁知道如何解决这个问题?谢谢.
完整的paramiko发行版附带了很多很好的演示.
在demos子目录中,demo.py
并interactive.py
有完整的交互式TTY示例,这可能对您的情况有点过分.
在上面的示例中,ssh_stdin
行为类似于标准的Python文件对象,ssh_stdin.write
因此只要通道仍处于打开状态,它就应该工作.
我从来不需要写入stdin,但是文档建议一旦命令退出就关闭一个通道,所以使用标准stdin.write
方法发送密码可能不起作用.通道本身有较低级别的paramiko命令,可以为您提供更多控制 - 请参阅如何SSHClient.exec_command
为所有血腥细节实施该方法.
尝试使用ssh(Paramiko的一个分支)进行交互式ssh会话时遇到了同样的问题.
我挖了一遍,找到了这篇文章:
http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/
要继续你的榜样,你可以做到
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql") ssh_stdin.write('password\n') ssh_stdin.flush() output = ssh_stdout.read()
本文更深入,描述了exec_command周围的完全交互式shell.我发现这比源代码中的示例更容易使用.
您需要Pexpect才能兼得两者(expect和ssh包装器)。