Python: модуль paramiko – пример sftp с авторизацией по ключу

Автор: | 16/06/2015
 

PythonУстанавливаем paramiko:

# pip install paramiko

Для начала – пример с авторизацией по логину-паролю.

Создаём пустой файл:

$ touch scp_file.txt
$ file /home/setevoy/scp_file.txt
/home/setevoy/scp_file.txt: empty

И копируем его на удалённую машину:

>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect('77.***.***.40', port=2222, username='setevoy', password='password')
>>> sftp = ssh.open_sftp()
>>> sftp.put('/home/setevoy/scp_file.txt', '/home/setevoy/scp_file.txt')
<SFTPAttributes: [ size=0 uid=500 gid=500 mode=0100644 atime=1434220036 mtime=1434220036 ]>

У Windows-пользователей может возникнуть ошибка при вызове ssh.connect():

NameError: global name ‘descriptor’ is not defined

Решение описано в посте Python: модуль paramiko – NameError: global name ‘descriptor’ is not defined.

На удалённом сервере проверяем:

$ ls -l /home/setevoy/ | grep scp
-rw-r--r--.  1 setevoy setevoy         0 Jun 13 21:27 scp_file.txt

Изменим вызов ssh.connect(), указав вместо пароля ключ:

>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect('77.***.***.40', port=2222, username='setevoy', key_filename='/home/setevoy/.ssh/setevoy_akira')
>>> sftp = ssh.open_sftp()
>>> sftp.put('/home/setevoy/scp_file.txt', '/home/setevoy/scp_file.txt')
<SFTPAttributes: [ size=0 uid=500 gid=500 mode=0100644 atime=1434220036 mtime=1434225080 ]>

Загрузить файл с удалённого сервера на локальную машину – sftp.get().

На удалённой машине создадим файл:

$ touch scp_from_remote.txt

И копируем его на локальную машину:

...
>>> sftp.get('/home/setevoy/scp_to_remote.txt', '/home/setevoy/scp_from_remote.txt')

Файл загружен:

$ ls -l scp_from_remote.txt
-rw-rw-r-- 1 setevoy setevoy 0 Jun 13 19:12 scp_from_remote.txt