25 апреля 2015 г.

Python. Подключаемся по OpenSSH используя модуль Paramiko в Ubuntu





SSH (Secure SHell) — сетевой протокол, который позволяет производить удаленное управление операционной системой компьютера по зашифрованному соединению. Также при помощи зашифрованного соединения можно осуществлять передачу файлов на удаленный компьютер по протоколу SFTP(Secure File Transfer Protocol) или копирование SCP(Secure Copy).

В Python для работы с ssh используется модуль Paramiko. Ссылка на GitHub. Документацию по модулю вы можете почитать тут.

Paramiko так же предоставляет реализацию ssh и sftp. Paramiko присутствует в стандартных репозиториях Ubuntu и Debian, и установить его можно командой:
$ sudo apt-get install python-paramiko

Для работы с ssh в модуле предусмотрен класс — SSHClient.
SSHClient – это основной класс, который нам нужен чтобы подключаться и работать удаленно. Он дает нам «сессию» для дальнейшей работы: для установки соединения и передачи файлов.  

#!/usr/bin/env python
import paramiko
host = '10.0.3.25'
user = 'root'
psw = '12345'
port = 22
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Подключение
ssh.connect(hostname=host, port=port, username=user, password=psw)
# Выполнение команды
stdin, stdout, stderr = ssh.exec_command('ls -l')
# Читаем результат так:
result = stdout.read() + stderr.read()
#или так:
result = stdout.read().splitlines()
ssh.close()

Cоздаем объект ssh класса SSHClient
ssh=paramiko.SSHClient()

Модуль Paramiko позволяет авторизоваться как при помощи «имя пользователя — пароль», так и при помощи ключа.

Когда вы подключаетесь к удаленной машине по ssh в первый раз, то перед запросом логина и пароля, предлагается принять ключ в целях безопасности. На утвердительный ответ ssh-клиент скопирует к себе ключ в файл .ssh/known_hosts в вашей домашней директории.

Для автоматизации принятия ключа в Paramiko предусмотрено удобное решение:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
Не используйте эту политику если вы работаете с машинами, которые вам не известны или которым вы не доверяете.

Если нужно явно запретить принятие ключа:
ssh.set_missing_host_key_policy(paramiko.RejectPolicy())

Чтобы соединится с сервером нам понадобится ssh.connect()
ssh.connect(host='сервер', port=порт, username='имя пользователя', password='пароль')

Ответ от клиента возвращается в виде - (stdin, stdout, stderr) - где: 
stdin - это содержимое стандартного ввода
stdout - это содержимое стандартного вывода
stderr - это содержимое стандартного вывода ошибок

В строчке client.exec_command('ls -l') указано, что нужно выполнить команду на удаленном сервере. При вызове ”exec_command()”, открывается канал к хосту, который представляет безопасный тоннель и создается новый объект ”paramiko.Channel”, а обратно мы получаем ”paramiko.ChannelFile” файлоподобный объект, который представляет данные. Пока открыт  тоннель, объект ChannelFile читает данные из stderr и stdout. Если удаленный хост пошлет обратно достаточно информации, чтобы забить буфер, то хост подвиснет, ожидая, пока ваша программа считает посланные данные. Чтобы справиться с этим нужно вызывать read() или readlines().

Для перезагрузки удаленной машины используем следующий код:

stdin, stdout, stderr = ssh.exec_command('sudo -S reboot')
stdin.write('пароль пользователя\n')
stdin.flush()

Для SFTP протокола используем следующий код:

ftp=ssh.open_sftp()            
fileList=ftp.listdir()         
ftp.chdir('/var/log')          
currentDir = ftp.getcwd()      
ftp.get('my.log','test1.log'
ftp.put('my.log', 'test1.log'
ftp.unlink('test1.log')        
ftp.mkdir('folder_name')              
ftp.rmdir('folder_name')              

#метод listdir() - возвращает список файлов - кортеж
#команда - chdir - переход в директорию /var/log
#метод getcwd - путь к текущей директории
#метод get() - скачиваем файл с сервера, (имя файла куда скачивать, что скачивать)
#метод put() - загружаем файл на сервер, (куда загружаем, что загружаем)
#метод unlink() - удаляем файл
#метод mkdir() - создание директории
#метод rmdir() - удаление директории

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

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

Оставить отзыв