воскресенье, 28 октября 2012 г.

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.

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

Комментариев нет:

Отправить комментарий

[フレーム]

AltStyle によって変換されたページ (->オリジナル) /