Сбой Paramiko SSH с "Сервер" ... не найден в known_hosts "при запуске на веб-сервере - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь использовать Paramiko для установления связи SSH между 2 серверами в частной сети.Клиентский сервер является веб-сервером, а хост-сервер будет «рабочим» сервером.Идея состояла в том, чтобы не открывать рабочий сервер для HTTP-соединений.Единственное взаимодействие, которое должно произойти, это то, что веб-серверу необходимо передать строки в сценарий на рабочем сервере.Для этого я надеялся использовать Paramiko и передать информацию в скрипт через SSH.

Я настроил нового пользователя и создал тестовый скрипт в Python 3, который работает, когда я запускаю его из командной строки изсессия SSH моего собственного пользователя.Я поместил этот же код в свое веб-приложение Django, думая, что оно должно работать, так как оно проверяет OK из командной строки, и я получаю следующую ошибку:

Сервер 'работник-сервер' не найденв known_hosts

Теперь, я думаю, я понимаю эту ошибку.При выполнении тестового сценария я использовал определенного пользователя для доступа к серверу, и информация об известных хостах сохраняется в ~/.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 succuessful. 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" )

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете жестко закодировать ключ хоста в своем коде Python, используя HostKeys.add:

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:

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

(Это можно сделать, только если вам не нужно безопасное соединение, как при подключении в частной сети)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...