Если Вам часто приходится заниматься системным администрированием, тогда Вы знаете, что иногда Вам нужен скрипт, который бы перемещал файлы с одного сервера на другой. Я не системный администратор, но мне часто приходится сталкиваться с такой задачей. У 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