Я пытаюсь использовать 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" )