apache Paramiko SSH在Web服务器上运行时失败,并显示“在known_hosts中未找到服务器...”

yduiuuwa  于 2023-01-26  发布在  Apache
关注(0)|答案(1)|浏览(142)

我正在尝试使用Paramiko在专用网络上的2台服务器之间进行SSH通信。客户端服务器是一台Web服务器,主机服务器将是一台"工作"服务器。这个想法是不向HTTP连接开放工作服务器。唯一需要发生的通信,Web服务器需要将字符串传递给工作服务器上的脚本。为此,我希望使用Paramiko并通过SSH将信息传递给脚本。
我用Python 3创建了一个新用户,并创建了一个测试脚本,当我从自己用户的SSH会话的命令行运行它时,它可以工作。我把同样的代码放到我的Django Web应用中,认为它应该可以工作,因为它从命令行测试OK,但我得到了以下错误:
在known_hosts中未找到服务器'worker-server'
现在,我想我理解了这个错误。当执行测试脚本时,我使用了某个用户来访问服务器,已知主机信息被保存到~/.ssh/known_hosts,即使用户实际上是为这一个任务创建的第三方用户。所以Django应用在另一个用户下运行,这个用户找不到保存的已知主机信息,因为它没有访问那个文件夹的权限。据我所知,Apache用来执行Django脚本的文件没有主目录。
有没有办法添加这个已知主机,让Django进程可以看到它?
脚本:

import paramiko

client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('worker-server', 22, 'workeruser', 'workerpass')

code = "123wfdv"
survey_id = 111
stdin, stdout, stderr =
    client.exec_command('python3 /path/to/test_script/test.py %s %s' % ( code, survey_id ))

print( "ssh successful. Closing connection" )

stdout = stdout.readlines()
client.close()
print ( "Connection closed" )

output = ""
for line in stdout:
    output = output + line
if output!="":
    print ( output )
else:
    print ( "There was no output for this command" )
jjhzyzn0

jjhzyzn01#

可以使用HostKeys.add在Python代码中硬编码主机键:

import paramiko
from base64 import decodebytes

keydata = b"""AAAAB3NzaC1yc2EAAAABIwAAAQEA0hV..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
 
client = paramiko.SSHClient()
client.get_host_keys().add('example.com', 'ssh-rsa', key)
client.connect(...)
  • 这是基于我对以下问题的回答:

Paramiko "未知服务器"。

  • 要了解如何获取在代码中使用的指纹,请参阅我对以下问题的回答:

Verify host key with pysftp.

  • 如果使用pysftp,而不是直接使用Paramiko,请参见:

PySFTP failing with "No hostkey for host X found" when deploying Django/Heroku
或者,当您在专用网络中连接时,您可以使用AutoAddPolicy完全放弃验证主机密钥:

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(...)
  • (只有在您确实不需要安全连接时才可以执行此操作)*

相关问题