Работаем с ssh в Python
Примеры Python » Модули » Python для начинающих python ssh, python примеры, ssh туннель
В этой статье мы поговорим о paramiko – модуле, позволяющем работать с ssh в python. Он поможет создать скрипт, который сможет соединяться с удаленным сервером (или серверами) и выполнять на нем некоторые действия.
Довольно часто нам нужно выполнять много практически одинаковых действий на разных серверах. Работа по сути простейшая, вроде редактирования определенной строки в файле настроек или, например, замены файла «version_019» на «version_20». Если вам нужно это сделать на 1-2 серверах, то никаких проблем не возникнет, а вот когда серверов уже несколько десятков, наверняка вам быстро надоест. Конечно же можно просто нанять какого-нибудь новичка для этих целей, пусть работает, но такой вариант может не подойти.
Самые легкие задачи можно попробовать решить через стандартные средства ssh – скопировать файл или удаленно выполнить код. Можно еще попробовать утилиту empty.
Но, если вы знакомы с python, хотя бы на базовом уровне, то он поможет нам все сделать более продвинуто. Для этого есть модуль paramiko. Подходит он для python начиная с версии 2.3. Выполняет протокол ssh2, чтобы установить защищенное соединение (то есть будет шифрование и аутентификация) с удаленным сервером. В ходе создания подключения предоставляется высокоуровневое API, позволяющее работать с ssh – создается объект SSHClient. Чтобы получить больше контроля вы можете еще передать сокет (можно другой похожий объект) классу Transport, это позволить при работе быть клиентом или сервером. Чтобы аутентифицироваться как клиент потребуется пароль с личным ключом, а также проверка серверного ключа.
Вот маленький пример, как можно воспользоваться данным модулем. Ниже по небу будут комментарии.
import paramiko
host = '192.168.0.8'
user = 'login'
secret = 'password'
port = 22
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Подключение
client.connect(hostname=host, username=user, password=secret, port=port)
# Выполнение команды
stdin, stdout, stderr = client.exec_command('ls -l')
# Читаем результат
data = stdout.read() + stderr.read()
client.close()
Для получения данных для входа вы можете воспользоваться любым подходящим вам методом – указать это прямо в коде, выделить в базе данных, конфиге и т.д. Понятно, что при большом количестве хостов, чтобы обойти их нам потребуется сделать цикл.
SSHClient – это основной класс, который нам нужен чтобы подключаться и работать удаленно. Он дает нам «сессию» для дальнейшей работы.
В строке client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) вносим ключ сервера в перечень известных нам хостов - файл .ssh/known_hosts. Может случится, что во время установки соединения ключ не найдется, в этом случае он будет «отбит» и запустится SSHException.
Чтобы соединится с сервером нам понадобится client.connect(). Чтобы войти можно использовать как ключи, так и логины с паролями. Все параметры, такие как ключ, порт, логин, пароль, хост и прочие мы можем задавать при соединении.
В строчке client.exec_command('ls -l') указано, что нужно выполнить команду на удаленном сервере.
А если вам нужно готовое решение, чтобы быстро создать качественный сайт для бизнеса, заходите на Reg.ru. Здесь вы сможете получить сразу готовый сайт на популярной CMS Joomla для решения любых задач. Это может быть сайт визитка, интернет магазин или другой проект. Вы получите продуманный дизайн, широкие возможности по развитию, удобную систему управления и все остальное, что нужно для успешного ведения бизнеса.
Получаю ответ:
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/paramiko/kex_ecdh_nist.py:39: CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.
m.add_string(self.Q_C.public_numbers().encode_point())
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/paramiko/kex_ecdh_nist.py:96: CryptographyDeprecationWarning: Support for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_point
self.curve, Q_S_bytes
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/paramiko/kex_ecdh_nist.py:111: CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.
hm.add_string(self.Q_C.public_numbers().encode_point())