Безопасное копирование файла с удаленного сервера через модуль scp и os в Python - PullRequest
5 голосов
/ 24 ноября 2011

Я довольно новичок в Python и программировании.Я пытаюсь скопировать файл между двумя компьютерами через скрипт Python.Однако код

os.system("ssh " + hostname + " scp " + filepath + " " + user + "@" + localhost + ":" cwd)

не будет работать.Я думаю, что для этого нужен пароль, как описано в Как скопировать файл на удаленный сервер в Python, используя SCP или SSH? .Я не получил никаких журналов ошибок, файл просто не будет отображаться в моем текущем рабочем каталоге.

Однако любая другая команда с os.system("ssh " + hostname + "command") или os.popen("ssh " + hostname + "command") работает.-> command = e.g. ls

Когда я пытаюсь ssh hostname scp file user@local:directory в командной строке, он работает без ввода пароля.

Я пытался объединить команды os.popen с модулем getpass и pxssh для установки sshподключение к удаленному серверу и использование его для прямой отправки команд (я проверял это только для простой команды):

import pxssh
import getpass

ssh = pxssh.pxssh()
ssh.force_password = True
hostname = raw_input("Hostname: ")
user = raw_input("Username: ")
password = getpass.getpass("Password: ")
ssh.login(hostname, user, password)
test = os.popen("hostname")
print test

Но я не могу передавать команды на удаленный сервер (print testпоказывает, что hostname = локальный, а не удаленный сервер), однако я уверен, что соединение установлено.Я подумал, что будет проще установить соединение, чем всегда использовать "ssh " + hostname в командах bash.Я также попробовал некоторые из обходных путей в Как скопировать файл на удаленный сервер в Python с использованием SCP или SSH? , но я должен признать, что из-за отсутствия опыта я не смог заставить их работать.

Большое спасибо за помощь.

1 Ответ

4 голосов
/ 24 ноября 2011

Я думаю, что самый простой (чтобы не вводить пароль) и самый безопасный способ сделать это - сначала установить аутентификация с открытым / закрытым ключом . Как только это будет сделано, и вы сможете войти в удаленную систему, выполнив ssh user@hostname, следующая команда bash сделает это:

scp some/complete/path/to/file user@remote_system:some/remote/path

Соответствующий код Python будет:

import subprocess

filepath = "some/complete/path/to/file"
hostname = "user@remote_system"
remote_path = "some/remote/path"

subprocess.call(['scp', filepath, ':'.join([hostname,remote_path])])
...