- Paramiko- How to SSH and transfer files with python
- Работа с ssh в Python
- Модуль paramiko#
- Метод send#
- Метод recv#
- Модуль pysftp в Python – доступ к SFTP-серверу
- Понимание модуля Python pysftp
- Как установить модуль?
- Проверка установки
- Доступ к SFTP-серверу с помощью pysftp
- Загрузка файла с помощью pysftp в Python
- Загрузка удаленного файла
- Удаление файла с помощью pysftp в Python
Paramiko- How to SSH and transfer files with python
So i’m employed at a social media type of company with a product working a lot like facebook and the past week had to sort out an issue with loosing the linking between video urls on our db with the actual content on the server. Some mismatch with Kaltura. But anyways long story short, I had to write a little script which would download videos from a remote server to upload to Kaltura to and get new urls to replace old ones int the db.
SSH is the method typically used to access a remote machine and run commands, retrieve files or upload files.
You can transfer files from the remote machine to the local or vice versa using SFTP (Secure File Transfer Protocol) and SCP(Secure Copy Protocol).
According to paramiko.org, The python paramiko model gives an abstraction of the SSHv2 protocol with both the client side and server side functionality. As a client, you can authenticate yourself using a password or key and as a server you can decide which users are allowed accesss and the channels you allow
In this blog I focus on the client side.
Let’s get on with it
The primary client of Paramiko as documented in the API, is Paramiko.SSHClient. An instance of the Paramiko.SSHClient can be used to make connections to the remote server and transfer files
MAKING A CONNECTION
import paramiko
ssh_client=paramiko.SSHClient()
ssh_client.connect(hostname=’hostname’,username=’mokgadi’,password=’mypassword’)
#Raises BadHostKeyException,AuthenticationException,SSHException,socket error
when you try this, you get the following error:
missing_host_key raise SSHException(‘Server %r not found in known_hosts’ % hostname) paramiko.ssh_exception.SSHException: Server ‘hostname’ not found in known_hosts
Understanding Known Hosts
You see this error because you have not informed your machine that the remote server you “trust” the server you are trying to access. If you go onto you command line or terminal and try to connect to a server for the first time, You will get a message similar to this:
The authenticity of host ‘hostname’ can’t be established.RSA key fingerprint is ‘key’. Are you sure you want to continue connecting (yes/no)?
When you select yes here, you let your machine know that it can trust the machine and you can now access it without the prompt until the key for that machine changes.
Paramiko similarly requires that you validate your trust with the machine. This validation is handled by calling set_missing_host_key_policy() on the SSHClient an passing the policy you want implemented when accessing a new remote machine. By default, the paramiko.SSHclient sets the policy to the RejectPolicy. The policy rejects connection without validating as we saw above. Paramiko does however give you a way to sort of “Trust all” key policy, the AutoAddPolicy. Parsing an instance of the AutoAddPolicy to set_missing_host_key_policy() changes it to allow any host.
import paramiko
ssh_client =paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=’hostname’,username=’mokgadi’,password=’mypassword’)
You should now be in the green
RUNNING COMMANDS ON THE REMOTE MACHINE
To run a command exec_command is called on the SSHClient with the command passed. The response is returned as a tuple (stdin,stdout,stderr)
For example to list all the files in a directory:
Getting the type for each of the returned,
type(stdin) and type(stdout) is ‘paramiko.channel.ChannelFile’
type(stderr) is class ‘paramiko.channel.ChannelStderrFile’
According to paramiko.org they are all python file like objects.
The stdin is a write-only file which can be used for commands requiring input
The stdout file give the output of the command
The stderr gives the errors returned on executing the command. Will be empty if there is no error
for the command above
>>>print(stdout.readlines()) → [u’anaconda-ks.cfg\n’, u’database_backup\n’, u’Desktop\n’, u’Documents\n’, u’Downloads\n’, …. u’Public\n’, u’Templates\n’, u’Videos\n’]
COMMANDS REQUIRING INPUT
Sometimes you need to provide a password or extra input to run a command. This is what stdin is used for. Let’s run the same command above with sudo.
stdin, stdout, stderr = ssh.exec_command(“sudo ls”)
stdin.write(‘mypassword\n’)
print stdout.readlines()
Should return list of files and folders as above.
FILE TRANSFERS
File transfers are handled by the paramiko.SFTPClient which you get from calling open_sftp() on an instance of Paramiko.SSHClient.
Downloading a file from remote machine
Uploading file from local to remote machine
Give it a go and correct me where you must :). Please do follow or subscribe to my blog to get an notified on any new posts
Работа с ssh в Python
Всем добрый день.
Хочу рассказать про paramiko — модуль для работы с ssh в python.
С его помощью можно написать скрипт, который получит доступ к удаленному серверу (или многим) и что-то на нем сделает.
Кому интересно — прошу под кат.
Достаточно часто на работе требовалось выполнить очень однотипные действия на серверах клиентов. Действия пустяковые, наподобие «исправить строчку №12 в конфигурационном файле» или «заменить файл „version_017“ на „version_018“. Это было легко, пока серверов не накопилось *надцать штук. Также подобные задачи надоедали очень быстро, поэтому подобную работу старались поручить новичкам с формулировкой „для приобретения навыков работы с ssh“.
Поначалу самые простые задачи можно было решить стандартными средствами ssh — копированием файла и удаленным исполнением кода. Также пробовали использовать утилиту empty .
Я в то время как раз начинал учить python, решил посмотреть, что в нем есть для этих целей. Гугл услужливо подсказал про paramiko.
Paramiko (комбинация слов языка есперанто „параноик“ и „друг“ — »paranoja» + «amiko») — это модуль для python версии 2.3 и выше, который реализует ssh2 протокол для защищенного (с шифрованием и аутентификацией) соединения с удаленным компьютером. При подключении предоставляется высокоуровневое API для работы с ssh — создается обьект SSHClient. Для большего контроля можно передать сокет (или подобный обьект) классу Transport и работать с удаленным хостом в качестве сервера или клиента. Клиенту для аутентификации можно использовать пароль или приватный ключ и проверку ключа сервера.
Небольшой пример использования этого модуля. Комментарии будут ниже.
Получить данные для доступа к удаленному серверу можно любым удобным способом — прописать напрямую в коде, вынести в конфиг, базу данных и т.д. Очевидно, что если хостов несколько, то для их обхода нужно делать цикл.
Основным классом для подключения и удаленной работы является SSHClient. Он предоставляет нам «сессию» с которой мы можем работать далее.
В строчке client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) мы добавляем ключ сервера в список известных хостов — файл .ssh/known_hosts. Если при соединении с сервером ключа в нем не найдено, то по умолчанию ключ «отбивается» и вызввается SSHException.
Для соединения с сервером используем client.connect(). Авторизироваться можно как по комбинации логин-пароль так и по ключам. При соединении можно задать хост, имя пользователя, пароль, порт, ключ, и прочие параметры.
Строка client.exec_command(‘ls -l’) — выполняет команду на удаленном сервере. Потоки ввода-вывода программы возврашщаются в файлообразные обьекты — stdin, stdout, stderr.
Возможно, я недоразобрался, но у меня не получилось получить права рута на уделенном сервере. Буду благодарен, если мне подскажут, как это сделать. Для выполнения действий с правами суперпользователя делал так:
UPD: meph1st0 в комментариях предложил для этих целей воспользоваться классом Channel
Для передачи файлов по sftp можно использовать класс Transport. Для непосредственной передачи файлов используются команды put и get.
Вкратце всё. Сайт проекта и документация — http://www.lag.net/paramiko/
UPD. В комметариях подсказали, что есть ряд других библиотек инструментов, которые также можно использовать для работы по ssh решения подобных задач. Из перечисленного: fabric, chef, puppet, libbsh2 (pylibbsh2), exscript и net-ssh-telnet на руби. Всем комментаторам спасибо.
Модуль paramiko#
Paramiko — это реализация протокола SSHv2 на Python. Paramiko предоставляет функциональность клиента и сервера. В книге рассматривается только функциональность клиента.
Так как Paramiko не входит в стандартную библиотеку модулей Python, его нужно установить:
Подключение выполняется таким образом: сначала создается клиент и выполняются настройки клиента, затем выполняется подключение и получение интерактивной сессии:
SSHClient это класс, который представляет соединение к SSH-серверу. Он выполняет аутентификацию клиента. Следующая настройка set_missing_host_key_policy не является обязательной, она указывает какую политику использовать, когда выполнятся подключение к серверу, ключ которого неизвестен. Политика paramiko.AutoAddPolicy() автоматически добавляет новое имя хоста и ключ в локальный объект HostKeys.
Метод connect выполняет подключение к SSH-серверу и аутентифицирует подключение. Параметры:
look_for_keys — по умолчанию paramiko выполняет аутентификацию по ключам. Чтобы отключить это, надо поставить флаг в False
allow_agent — paramiko может подключаться к локальному SSH агенту ОС. Это нужно при работе с ключами, а так как в данном случае аутентификация выполняется по логину/паролю, это нужно отключить.
После выполнения предыдущей команды уже есть подключение к серверу. Метод invoke_shell позволяет установить интерактивную сессию SSH с сервером.
Метод send#
Метод send — отправляет указанную строку в сессию и возвращает количество отправленных байт или ноль если сессия закрыта и не удалось отправить команду:
В коде после send надо будет ставить time.sleep, особенно между send и recv. Так как это интерактивная сессия и команды набираются медленно, все работает и без пауз.
Метод recv#
Метод recv получает данные из сессии. В скобках указывается максимальное значение в байтах, которое нужно получить. Этот метод возвращает считанную строку.
Модуль pysftp в Python – доступ к SFTP-серверу
SFTP, сокращенно SSH File Transfer Protocol и известный как Secure File Transfer Protocol, представляет собой сетевой протокол, который позволяет нам получать доступ к файлам, передавать их и управлять ими через любой надежный поток данных. Программа работает в защищенном канале, таком как SSH, сервер уже аутентифицировал клиента и протоколу доступна идентификация пользователя.
Обработка вещей с использованием SFTP со сценариями всегда может поддерживаться, если мы работаем с такими языками программирования, как Python. Python предлагает модуль pysftp, который позволяет нам легко и эффективно работать с этой технологией.
В данном руководстве мы разберемся с модулем pysftp и его использованием в языке программирования Python для доступа к SFTP с некоторыми примерами.
Понимание модуля Python pysftp
Модуль Python pysftp – это простой интерфейс для SFTP. Модуль предоставляет высокоуровневые абстракции и расписания на основе задач для обработки требований SFTP. Протокол SFTP не поддерживает безопасность и аутентификацию; он ожидает, что фундаментальный протокол защитит его.
SFTP наиболее широко используется как подсистемная реализация протокола SSH версии 2, разработанная той же рабочей группой.
Модуль pysftp работает как оболочка вокруг Paramiko с интерфейсом, гораздо более похожим на Python. Библиотека Paramiko – одна из библиотек Python, которая считается основой pysftp. Методы, созданные pysftp, представляют собой абстракции, которые служат продуктивности программиста, инкапсулируя различные варианты использования более высоких функций для взаимодействия с SFTP.
Вовсе необязательно писать скрипт для обхода каталогов и вызова get и put, имея дело не только с Paramiko, но и с модулями ОС и статистики Python, а также писать тест (многие фрагменты кода в Интернете являются неполными и не учитывают крайние случаи). Модуль pysftp предоставляет целую библиотеку для работы со всеми тремя, оставляя нам возможность сосредоточиться на других основных задачах.
Теперь давайте установим модуль Python SFTP или pysftp.
Как установить модуль?
Интерфейс pysftp не раскрывает большинство возможностей Paramiko; тем не менее, он абстрагирует довольно много функций с помощью одного метода. Напротив, модуль pysftp реализует более высокоуровневые функции поверх Paramiko, в частности рекурсивную передачу файлов.
Мы можем установить модуль pysftp с помощью установщика pip, используя следующую команду:
Модуль будет установлен в системе как версия Python и pip.
Проверка установки
Чтобы проверить, правильно ли установлен модуль в системе, мы можем попробовать импортировать модуль и запустить программу.
После завершения установки создайте новый файл Python и введите в него следующий синтаксис.
Теперь сохраните файл и запустите его, используя следующую команду в командной строке.
Если программа запускается без каких-либо ошибок импорта, модуль установлен правильно. В противном случае рекомендуется переустановить модуль и обратиться к его официальной документации.
Доступ к SFTP-серверу с помощью pysftp
Для достижения цели нам нужны имя хоста, имя пользователя и пароль.
Затем мы должны переключиться с направления, используя метод chdir или cwd, и указать первый аргумент в качестве удаленного каталога.
Давайте рассмотрим следующий пример:
Приведенный выше фрагмент кода – это фиктивный сервер, которого не существует. Тем не менее, в реальной жизни мы должны использовать переменные среды для получения исходных учетных данных в любом файле в целях безопасности, а не извлекать все учетные данные в отдельных файлах. Рекомендуется поместить его в файл переменных окружения. Например, файл .env.
Приведенный выше фрагмент кода одинаков для всех, поскольку мы должны предоставить учетные данные, и программа начнет работать.
Сначала мы импортировали модуль pysftp, а затем предоставили переменные для хранения значений имени хоста, имени пользователя и пароля. Затем мы использовали оператор Python with, чтобы открыть безопасное соединение с удаленным сервером, указав имя хоста, имя пользователя и пароль. В случае успеха мы переключим удаленный каталог, извлечем список и напечатаем один за другим в консоли.
Список составлен в произвольном порядке и не включает уникальные записи ‘.’ и ‘..’. Возвращенные объекты SFTPAttributes будут иметь дополнительное поле: longname, которое может состоять из отформатированной строки атрибутов файла в формате UNIX. Содержимое строки будет зависеть от сервера SFTP.
Загрузка файла с помощью pysftp в Python
Мы можем загрузить файл на удаленный сервер через SFTP с помощью pysftp, используя функцию sftp.put() клиента SFTP. Метод put ожидает относительный или абсолютный локальный путь к файлу, который нам нужно загрузить, в качестве первого аргумента, а удаленный путь, по которому файл должен быть загружен, – в качестве второго.
Давайте рассмотрим следующий фрагмент кода для лучшего понимания.
В приведенном выше фрагменте кода мы установили безопасное соединение, а затем определили два пути к файлам – local_File_Path и remote_File_Path.
- local_File_Path: этот путь к локальному файлу.
- remote_File_Path: этот путь к удаленному файлу.
Затем мы использовали функцию sftp.put(), чтобы загрузить файл на сервер.
Загрузка удаленного файла
В предыдущем разделе мы обсудили метод загрузки файла с помощью pysftp. Давайте разберемся в способе загрузки удаленного файла.
Мы можем загрузить удаленный файл с сервера с помощью pysftp, открыв соединение и из экземпляра sftp и используя метод get, ожидая путь к удаленному файлу, который будет загружен. Второй параметр – это локальный путь, по которому мы должны хранить файл.
Давайте рассмотрим следующий пример, демонстрирующий то же самое.
В приведенном выше фрагменте кода мы определили соединение, а затем определили два пути к файлам – remote_File_Path и local_File_Path.
- remote_File_Path: это путь, по которому можно найти файл.
- local_File_Path: этот путь к файлу – это путь, по которому файл будет загружен.
Затем мы использовали функцию sftp.get(), чтобы загрузить файл.
Удаление файла с помощью pysftp в Python
Мы можем удалить файл с помощью pysftp, используя функцию sftp.remove(). Функция remove() ожидает абсолютный путь к удаленному файлу в качестве первого параметра.
В приведенном выше фрагменте кода мы открыли соединение, а затем определили переменную remove_File_Path, которая состоит из пути к файлу, который необходимо удалить.
Затем мы использовали функцию sftp.remove(), чтобы удалить файл с удаленного сервера.
Модуль pysftp имеет большое количество функций, которые мы можем использовать для выполнения различных действий, таких как обработка разрешений и многое другое. Также можно обратиться к официальной документации модуля Python pysftp.