我有以下代码(更新为包括 pexpect):
import sys
import subprocess
import pexpect
print "0"
ssh = subprocess.Popen("ssh -A -t [email protected] /cdn-cgi/l/email-protection ssh -A -X [email protected] /cdn-cgi/l/email-protection",
shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE).communicate()
print "1"
child = pexpect.spawn(ssh)
print "2"
child.expect ('password')
print "3"
child.sendline ('password2')
print "4"
result = ssh.stdout.readlines()
if result == []:
error = ssh.stderr.readlines()
print >>sys.stderr, "ERROR: %s" % error
else:
print result
当我运行它时,我看到打印了零,然后屏幕上显示了密码提示。打印 One 的行永远不会执行,因此以下 pexpect 代码也不会执行。我可以作为用户输入密码,但随后它挂起。当我使用 Ctrl+C 终止它时,在返回命令提示符之前会出现带有第二个密码提示的第二个登录横幅。有人可以解释一下如何捕获第一个密码提示,以便程序可以发送密码而不是用户吗?另外,有人可以解释一下为什么我在杀死程序之前没有得到结果变量吗?
密码提示不会写入标准输出。你需要像 pexpect 这样的东西来捕获它。该线程有更多信息:使用 subprocess.Popen 通过 SSH 或 SCP 发送密码 https://stackoverflow.com/questions/15166973/sending-a-password-over-ssh-or-scp-with-subprocess-popen
编辑:
关于更新的 pexpect 代码,首先,如果您阅读 subprocess 的文档,您会看到 communications() 等待进程终止,这就是您的程序挂起直到您终止 ssh 会话的原因。
并且您对 pexpect.spawn 的调用看起来错误,它需要一个字符串,而不是 Popen 对象。这里根本不需要子进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)