如何使用Python将主机名添加到known_hosts?

时间:2012-11-28 03:05:24

标签: python ssh

我正在使用此代码将服务器添加到known_hosts:

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

这会将主机名添加到known_hosts,但服务器在尝试进入主机时会挂起。我只想将主机名添加到known_hosts并继续我的其他代码。我怎样才能做到这一点?感谢

2 个答案:

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

谢谢!