我正在使用此代码将服务器添加到known_hosts:
subprocess.Popen(['sshpass', '-p', password, 'ssh', '-o', 'StrictHostKeyChecking=no', add_key], stdout=subprocess.PIPE).communicate()[0]
这会将主机名添加到known_hosts,但服务器在尝试进入主机时会挂起。我只想将主机名添加到known_hosts并继续我的其他代码。我怎样才能做到这一点?感谢
答案 0 :(得分:0)
这应该可以胜任。此解决方案使用pexpect库,这是一种自动执行命令的好方法。您基本上使用要添加的主机,用户和密码调用add_known_hosts。它将尝试ssh到该主机并输入密码或响应添加到已知主机连接的是,然后输入密码。最后,它通过发送exit命令干净地退出连接。你可以修改它,不需要用户名和密码,只需对继续连接问题回答是,然后结束ssh过程,而不是继续密码提示。
import pexpect, time
def add_known_hosts(host, user, password):
child = pexpect.spawn('ssh %s@%s' % (user, host))
i = child.expect(['.* password:', '.* continue connecting (yes/no)?'])
if i == 1:
child.sendline('yes')
child.expect('.* password:')
child.sendline(password)
child.expect('%s@%s' % (user, host))
time.sleep(1)
child.sendline('exit')
add_known_hosts('myhost', 'myusername', 'mypassword')
<强>调试强>
从下面的评论中看来,您在系统中使用pexpect时遇到了问题。只是做一个简单的测试以确认pexpect与ssh正常工作的好方法是运行下面的代码。使用适当的设置填写主机,用户,然后运行代码,您应该能够与ssh会话进行交互。此时,您可以从此处进行构建,并准确查看您希望从ssh获取哪些文本以及您希望在响应中发送的文本。
import pexpect
host, user = 'myhost', 'myusername'
child = pexpect.spawn('ssh %s@%s' % (user, host))
child.interact()
答案 1 :(得分:0)
没关系,自己解决了。这是我做的:
test = subprocess.Popen(['sshpass', '-p', password, 'ssh', '-o', 'StrictHostKeyChecking=no', add_key])
time.sleep(5.0)
test.kill()
谢谢!