Если Вам часто приходится заниматься системным администрированием, тогда Вы знаете, что иногда Вам нужен скрипт, который бы перемещал файлы с одного сервера на другой. Я не системный администратор, но мне часто приходится сталкиваться с такой задачей. У 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.
Дополнительное чтение
- Jesse Noller’s Программирование SSH при помощи Paramiko (Перевод)
Комментариев нет:
Отправить комментарий