Как скопировать файл в удаленный сервер в Python с помощью SCP или SSH?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
95
задан ayhan 7 August 2016 в 09:05
поделиться

5 ответов

Если Вы хотите простой подход, это должно работать.

Вы захотите к ".close ()" файл сначала, таким образом, Вы будете знать, что он сбрасывается к диску из Python.

import os
os.system("scp FILE USER@SERVER:PATH")
#e.g. os.system("scp foo.bar joe@srvr.net:/path/to/foo.bar")

необходимо генерировать (на исходной машине) и установка (на целевой машине) ssh ключ заранее так, чтобы scp автоматически аутентифицировался с общественностью ssh ключ (другими словами, таким образом, сценарий не просит пароль).

ssh-keygen пример

48
ответ дан pdq 24 November 2019 в 05:46
поделиться

Существует несколько различных способов приблизиться к проблеме:

  1. программы командной строки Обертки
  2. пользуются библиотекой Python, которая обеспечивает возможности SSH (например, - Paramiko или Скрученная Раковина )

, Каждый подход имеет свои собственные причуды. Необходимо будет установить ключи SSH для включения логинов пароля меньше при обертывании системных команд как "ssh", "scp" или "rsync". Можно встроить пароль в сценарий с помощью Paramiko или некоторой другой библиотеки, но Вы могли бы найти отсутствие срыва документации, особенно если Вы не знакомы с основами соединения SSH (например, - ключевые обмены, агенты, и т.д.). Вероятно, само собой разумеется, что ключи SSH являются почти всегда лучшей идеей, чем пароли для этого вида материала.

ПРИМЕЧАНИЕ: его твердое для избиения rsync, если Вы планируете передачу файлов через SSH, особенно если альтернатива является простым scp.

я использовал Paramiko глазом к замене системных вызовов, но нашел меня отодвинутым к обернутым командам из-за их простоты использования и непосредственного знакомства. Вы могли бы отличаться. Я дал Раковине поверхностный осмотр некоторое время назад, но это не обратилось ко мне.

При выборе путь системного вызова, Python предлагает массив опций, таких как os.system или модули команд/подпроцесса. Я пошел бы с модулем подпроцесса при использовании версии 2.4 +.

11
ответ дан 24 November 2019 в 05:46
поделиться

Вид hacky, но следующее должен работать:)

import os
filePath = "/foo/bar/baz.py"
serverPath = "/blah/boo/boom.py"
os.system("scp "+filePath+" user@myserver.com:"+serverPath)
-3
ответ дан Drew Olson 24 November 2019 в 05:46
поделиться

Сделать это в Python (т.е. не переносящийся scp посредством подпроцесса. Popen или подобный) с библиотека Paramiko , Вы сделали бы что-то вроде этого:

import os
import paramiko

ssh = paramiko.SSHClient() 
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, password=password)
sftp = ssh.open_sftp()
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()

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

137
ответ дан CivFan 24 November 2019 в 05:46
поделиться

Вы, вероятно, использовали бы модуль подпроцесса . Что-то вроде этого:

import subprocess
p = subprocess.Popen(["scp", myfile, destination])
sts = os.waitpid(p.pid, 0)

, Где destination, вероятно, имеет форму user@remotehost:remotepath. Благодаря @Charles Duffy для указания на слабость в моем исходном ответе, который использовал единственный аргумент строки для определения scp операции shell=True - который не обработает пробел в путях.

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

Гарантируют, что Вы настроили надлежащие учетные данные так, чтобы можно было выполнить необслуживаемый, passwordless scp между машинами . Уже существует stackoverflow вопрос для этого .

31
ответ дан Community 24 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: