У меня есть текстовый файл на моем локальном компьютере, который создается ежедневным сценарием Python, запускаемым в cron.
Я хотел бы добавить немного кода, чтобы этот файл безопасно отправлялся на мой сервер по SSH.
python
ssh
automation
scp
Алок
источник
источник
Ответы:
Вы можете вызвать команду
scp
bash (она копирует файлы через SSH ) с помощьюsubprocess.run
:Если вы создаете файл, который хотите отправить, в той же программе Python, вам нужно вызвать
subprocess.run
команду внеwith
блока, который вы используете для открытия файла (или.close()
сначала вызвать файл, если вы не используетеwith
block), чтобы вы знали, что он сброшен на диск из Python.Вам необходимо заранее сгенерировать (на исходном компьютере) и установить (на конечном компьютере) ключ ssh, чтобы scp автоматически аутентифицировался с помощью вашего открытого ключа ssh (другими словами, чтобы ваш скрипт не запрашивал пароль) .
источник
subprocess.check_call(['scp', srcfile, dest])
может использоваться начиная с Python 2.5 вместоrc = Popen(..).wait(); if rc != 0: raise ..
Чтобы сделать это в Python (т.е. не обертывать scp через subprocess.Popen или подобное) с библиотекой Paramiko , вы должны сделать что-то вроде этого:
(Вы, вероятно, захотите иметь дело с неизвестными хостами, ошибками, созданием любых необходимых каталогов и т. Д.).
источник
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
после создания экземпляраssh
.Вы, вероятно, использовали бы модуль подпроцесса . Что-то вроде этого:
Где
destination
видимо формыuser@remotehost:remotepath
. Спасибо @Charles Duffy за указание на слабость в моем исходном ответе, в котором для указания операции scp использовался единственный строковый аргументshell=True
, который не обрабатывал пробелы в путях.В документации модуля есть примеры проверки ошибок, которые вы, возможно, захотите выполнить вместе с этой операцией.
Убедитесь, что вы настроили правильные учетные данные, чтобы можно было выполнять автоматические сеансы scp без пароля между машинами . Для этого уже есть вопрос о переполнении стека .
источник
subprocess.check_call(['scp', myfile, destination])
можно было бы использовать вместо этого, начиная с Python 2.5 (2006)Есть несколько разных подходов к решению проблемы:
У каждого подхода есть свои особенности. Вам нужно будет настроить ключи SSH, чтобы разрешить вход без пароля, если вы обертываете системные команды, такие как «ssh», «scp» или «rsync». Вы можете встроить пароль в скрипт с помощью Paramiko или какой-либо другой библиотеки, но отсутствие документации может расстроить вас, особенно если вы не знакомы с основами SSH-соединения (например, обмен ключами, агенты и т. Д.). Само собой разумеется, что ключи SSH почти всегда лучше, чем пароли для такого рода вещей.
ПРИМЕЧАНИЕ: его сложно превзойти rsync, если вы планируете передавать файлы через SSH, особенно если альтернативой является старый добрый scp.
Я использовал Paramiko с прицелом на замену системных вызовов, но обнаружил, что меня снова привлекают обернутые команды из-за их простоты использования и непосредственного знакомства. Ты можешь быть другим. Некоторое время назад я осмотрел Конча, но мне это не понравилось.
Если вы выбираете путь системного вызова, Python предлагает массив параметров, таких как os.system или модули команд / подпроцесса. Я бы пошел с модулем подпроцесса при использовании версии 2.4+.
источник
Достигнута та же проблема, но вместо "взлома" или эмуляции командной строки:
Нашел этот ответ здесь .
источник
Вы можете сделать что-то вроде этого, чтобы обрабатывать проверку ключа хоста
источник
fabric
может использоваться для загрузки файлов по ssh:источник
Вы можете использовать пакет vassal, который как раз для этого предназначен.
Все, что вам нужно, это установить вассала и сделать
Кроме того, это избавит вас от аутентификации учетных данных и вам не придется вводить их снова и снова.
источник
Я использовал sshfs для монтирования удаленного каталога через ssh и shutil для копирования файлов:
Затем в питоне:
Преимущество этого метода заключается в том, что вы можете передавать данные в потоковом режиме, если генерируете данные, а не кэшируете локально и отправляете один большой файл.
источник
Попробуйте это, если вы не хотите использовать сертификаты SSL:
источник
Использование внешнего ресурса paramiko;
источник
Вызов
scp
команды через подпроцесс не позволяет получить отчет о проделанной работе внутри скрипта.pexpect
можно использовать для извлечения этой информации:См. Файл копии python в локальной сети (linux -> linux)
источник
Очень простой подход заключается в следующем:
Библиотеки python не требуются (только os), и она работает, однако использование этого метода требует установки другого клиента ssh. Это может привести к нежелательному поведению при запуске в другой системе.
источник
Вроде хаки, но должно работать следующее :)
источник