python - 在 Web 服务器上运行时,Paramiko SSH 失败并显示 "Server ' .. .' not found in known_hosts"

标签 python django apache ssh paramiko

我正在尝试使用 Paramiko 在专用网络上的两台服务器之间进行 SSH 通信。客户端服务器是一个 Web 服务器,主机服务器将是一个“工作”服务器。这个想法是不向工作服务器开放 HTTP 连接。唯一需要进行的通信是 Web 服务器需要将字符串传递给工作服务器上的脚本。为此,我希望使用 Paramiko 并通过 SSH 将信息传递给脚本。

我设置了一个新用户并在 Python 3 中创建了一个测试脚本,当我从我自己用户的 SSH session 中从命令行运行它时,该脚本就可以工作。我将相同的代码放入我的 Django Web 应用程序中,认为它应该可以工作,因为它从命令行测试正常,但出现以下错误:

Server 'worker-server' not found in known_hosts

现在,我想我理解了这个错误。在执行测试脚本时,我使用某个用户访问服务器,并且已知主机信息保存到 ~/.ssh/known_hosts 即使该用户实际上是刚刚创建的第 3 方用户为了这一份工作。因此,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" )

最佳答案

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

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(...)
<小时/>

或者,当您在专用网络内连接时,您可以使用 AutoAddPolicy 完全放弃验证主机 key 。 :

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(...)

(只有当您确实不需要安全连接时才可以这样做)

关于python - 在 Web 服务器上运行时,Paramiko SSH 失败并显示 "Server ' .. .' not found in known_hosts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53635843/

相关文章:

python - 一个子类化 abc 的 django 模型,给出了元类冲突

python - form.is_valid() 为 false 时如何访问数据

eclipse - 无法在 Eclipse 中安装 Apache Tomcat

python - 部署 Python Azure 函数时中央目录损坏

python - 逻辑回归的批量梯度下降

Django South 迁移到不同的数据库

php - codeigniter hello world 在 Ubuntu 上失败

php - 在 APACHE2 中创建数据库返回内部服务器错误

python - 将用于 mapreduce 的 Python 脚本传递给 HBase

python - 使用 2D 数组进行 2D Numpy 数组索引