Архив метки: paramiko

Программирование работы с SSH при помощи Paramiko (Перевод)

OpenSSH — это вездесущий метод удалённого безопасного доступа к машине и передачи файлов. Многие — системные администраторы, инженеры автоматизации тестов, веб-разработчики и другие люди используют этот методы ежедневно. Написание скриптов для ssh на Python может быть тяжёлым занятием, но модуль Paramiko позволяет решить эту задачу проще.
Это репринт статьи, написанной для Python Mag­a­zine в колонку Com­pletely Dif­fer­ent и опубликованной в октябрьском выпуске 2008 года. Тут она приводится в оригинальной форме, со всеми ошибками и т.д.

Читать

Python 101: Перемещение файлов между серверами (Перевод)

Если Вам часто приходится заниматься системным администрированием, тогда Вы знаете, что иногда Вам нужен скрипт, который бы перемещал файлы с одного сервера на другой. Я не системный администратор, но мне часто приходится сталкиваться с такой задачей. У Python есть сторонний пакет для этой цели. Мы посмотрим на paramiko, который зависит от PyCrypto (скачать PyCrypto можно с PyPI).

Пишем код

Предположим, что у Вас уже всё установлено, так что мы можем приступать к работе. Вот код, основанный на том, что я сам использую на работе. Давайте посмотрим на него:
import paramiko
 
########################################################################
class SSHConnection(object):
""""""
 
#----------------------------------------------------------------------
def __init__(self, host, username, password, port=22):
"""Инициализируем и настраиваем соединение"""
self.sftp = None
self.sftp_open = False
 
# открываем поток SSH Transport
self.transport = paramiko.Transport((host, port))
 
self.transport.connect(username=username, password=password)
 
#----------------------------------------------------------------------
def _openSFTPConnection(self):
"""
Открываем SFTP соединение, если этого ещё не сделано
"
""
if not self.sftp_open:
self.sftp = paramiko.SFTPClient.from_transport(self.transport)
self.sftp_open = True
 
#----------------------------------------------------------------------
def get(self, remote_path, local_path=None):
"""
Копируем файл с удалённого хоста к нам
"
""
self._openSFTPConnection()
self.sftp.get(remote_path, local_path)
 
#----------------------------------------------------------------------
def put(self, local_path, remote_path=None):
"""
Копируем файл от нас на удалённый хост
"
""
self._openSFTPConnection()
self.sftp.put(local_path, remote_path)
 
#----------------------------------------------------------------------
def close(self):
"""
Закрываем SFTP и ssh соединения
"
""
if self.sftp_open:
self.sftp.close()
self.sftp_open = False
self.transport.close()
 
if __name__ == "__main__":
host = "myserver"
username = "mike"
pw = "dingbat!"
 
origin = '/home/mld/projects/ssh/random_file.txt'
dst = '/home/mdriscoll/random_file.txt'
 
ssh = SSHConnection(host, username, pw)
ssh.put(origin, dst)
ssh.close()
Достаточно просто, правда? В методе  __init__ нашего класса мы всего лишь задаём параметры соединения. В нашем случае нам надо указать хост, логин и пароль. После чего мы открываем потоковый объект SSH Transport. Затем мы вызываем наш метод put для отправки файла на удалённый сервер. С обратной задачей нам поможет справиться метод get. И, наконец, мы вызываем наш метод close, чтобы закрыть соединение. Можно заметить, что в наших методах put и get мы используем частный метод для проверки наличия соединения, чтобы открыть его в случае, если оно было по какой-то причине закрыто.

Итог

Paramiko реально облегчает нашу работу. Я очень рекомендую прочитать статью Jesse’а на эту тему (ссылка ниже), так как там всё это описывается более подробно. Мы интересно, как ещё можно решить эту задачу при помощи ssh и scp, так что я буду рад вашим комментариям. Сам я слышал хорошие отзывы о Fabric.

Дополнительное чтение

Автор: Ishayahu Lastov