如何使用Python添加主机名的known_hosts?(How to add hostname t

2019-10-17 10:36发布

我使用此代码添加服务器到known_hosts中:

subprocess.Popen(['sshpass', '-p', password, 'ssh', '-o', 'StrictHostKeyChecking=no', add_key], stdout=subprocess.PIPE).communicate()[0]

这增加了主机名到的known_hosts但服务器挂起,因为它试图进入主机。 我只是想添加主机名到known_hosts中,继续与我的其他代码。 我怎样才能做到这一点? 谢谢

Answer 1:

这应该做的工作。 该解决方案使用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()


Answer 2:

没关系,我自己解决了这个问题。 这是我做的:

test = subprocess.Popen(['sshpass', '-p', password, 'ssh', '-o', 'StrictHostKeyChecking=no', add_key])
            time.sleep(5.0)
            test.kill()

谢谢!



文章来源: How to add hostname to known_hosts using Python?
标签: python ssh