SFTP с использованием Python Paramiko непосредственно между двумя удаленными машинами - PullRequest
2 голосов
/ 30 марта 2019

У меня есть код, где я должен войти на сервер Unix.После этого мне нужно зайти на какой-нибудь сервер и загрузить несколько файлов на этот сервер Unix.Я использую команду Pymons Paramiko для входа на сервер Unix.Я знаю, используя sftp.get(filepath, localpath), я могу sftp файлы с SFTP-сервера на локальный компьютер.Тем не менее, моя проблема заключается в том, что я должен отправить эти файлы на сервер Unix, а не на локальный компьютер.

import paramiko

ip = ip
username = username
password = password
port = port


ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)
remotefilepath = remotefilepath
unixserverlocalpath = unixserverlocalpath

transport = paramiko.Transport(host)
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)

stdin,stdout,stderr=ssh.exec_command('some commands')
sftp.get(filepath, localpath)
stdin.write('Password')
stdin.flush()
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)
sftp.close()
transport.close()

Этот код выдает ошибку, поскольку он пытается получить sftp файлы на моем локальном компьютере, а не на сервере Unix.

1 Ответ

1 голос
/ 01 апреля 2019

SFTP не разрешает передачу между двумя удаленными серверами. Таким образом, вы должны инициировать передачу на одном из серверов, используя любой доступный там SFTP-клиент.


Если серверы являются обычными * nix-серверами, они имеют OpenSSH sftp клиент .

Поэтому используйте SSHClient.exec_command для выполнения sftp, а затем используйте stdin.write для подачи sftp команд к нему.

Как:

stdin,stdout,stderr = ssh.exec_command('sftp username@hostname')
stdin.write("get file\n")
stdin.write("quit\n")
stdin.flush()

Хотя вышеперечисленное будет работать только в том случае, если на сервере, на котором вы запускаете sftp, установлена ​​аутентификация с открытым ключом OpenSSH (или любая другая аутентификация без ввода). С аутентификацией по паролю все сложнее, поскольку OpenSSH не позволяет вам автоматически вводить пароль. Вы должны иметь возможность написать пароль для stdin, если вы установите get_pty=True:

stdin,stdout,stderr = ssh.exec_command('sftp username@hostname', get_pty=True)
stdin.write(password + "\n")
stdin.write("get file\n")
stdin.write("quit\n")
stdin.flush()

get_pty может принести некоторые нежелательные побочные эффекты, но я считаю, что в этом случае все должно работать без проблем.

Альтернативные подходы см. Как запустить команду sftp с паролем из скрипта Bash?


Вы также можете использовать любой другой SFTP-клиент, который может быть доступен на серверах, например curl или lftp.

Или вы можете выполнить python на одном из серверов и передать ему код Paramiko / SFTP.

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