Копирование файлов между двумя удаленными серверами Linux через SCP с использованием Python Paramiko

У меня 3 машины:

  • Сервер A (машина сборки, на которой будет выполняться код)
  • Сервер B (Linux)
  • Сервер C (Linux)

Мой код работает на сервере A. Я хочу использовать ssh на сервере B, а затем скопировать файлы на сервер C. Я хочу использовать пароль сервера B и сервера C, а НЕ ключи.

В моем случае я могу написать код для копирования файлов с локального компьютера на удаленный с помощью Paramiko. Я искал много решений в stackoverflow, как показано ниже:

import paramiko
from scp import SCPClient
def createSSHClient(server, port, user, password):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(server, port, user, password)
    return client
ssh = createSSHClient(server, port, user, password)
scp = SCPClient(ssh.get_transport())
cp.get(r'/nfs_home/appers/xxxx/test2.txt', r'C:\Users\xxxx\Desktop\MR_Test')

Но снова файлы копируются с локального (где выполняется код) на удаленный, а не с удаленного на удаленный.


person Pankaj Kumar    schedule 26.03.2018    source источник
comment
Я попытался использовать ssh с помощью paramiko и отправить команду scp, а затем пароль с помощью stdin. Но проблема в том, что scp (и поэтому ssh в задней части) принимает пароль непосредственно с терминала, а не со стандартного ввода (в отличие от sudo -S)   -  person Pankaj Kumar    schedule 26.03.2018


Ответы (1)


Вы не можете использовать для этого класс SCPClient.

Вам необходимо войти на сервер B и запустить там scp клиент командной строки, чтобы загрузить файл (локальный - как на сервере B) на сервер C.

См. команду запуска python paramiko.

У вас возникнут проблемы с передачей пароля scp. Вам лучше использовать ключи. Если вы не хотите использовать ключи, вы должны использовать некоторые из приемов, описанных, например, здесь:

(и множество других подобных вопросов от отчаявшихся, которые настаивают на том, чтобы не пользоваться ключами)

person Martin Prikryl    schedule 26.03.2018
comment
scp не работал у меня по причинам, указанным в моем комментарии к вопросу (scp принимает пароль непосредственно с терминала, а не со стандартного ввода). Также я не хочу использовать sshpass -p password scp -r [email protected]: / some / remote / path / some / local / path, потому что потребуется установить sshpass как на клиентских, так и на серверных машинах. Кроме того, из-за множества вопросов я не мог получить должного ответа на этот сценарий. Не знаю, возможно ли это с помощью paramiko. - person Pankaj Kumar; 26.03.2018
comment
Я все это знаю. Используйте ключи! Если вы все еще настаиваете на том, чтобы взломать это с помощью пароля, используйте get_pty=True при вызове exec_command. - person Martin Prikryl; 26.03.2018