Python ssh connect windows

Модуль paramiko#

Paramiko — это реализация протокола SSHv2 на Python. Paramiko предоставляет функциональность клиента и сервера. В книге рассматривается только функциональность клиента.

Так как Paramiko не входит в стандартную библиотеку модулей Python, его нужно установить:

Подключение выполняется таким образом: сначала создается клиент и выполняются настройки клиента, затем выполняется подключение и получение интерактивной сессии:

In [2]: client = paramiko.SSHClient() In [3]: client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) In [4]: client.connect(hostname="192.168.100.1", username="cisco", password="cisco", . : look_for_keys=False, allow_agent=False) In [5]: ssh = client.invoke_shell() 

SSHClient это класс, который представляет соединение к SSH-серверу. Он выполняет аутентификацию клиента. Следующая настройка set_missing_host_key_policy не является обязательной, она указывает какую политику использовать, когда выполнятся подключение к серверу, ключ которого неизвестен. Политика paramiko.AutoAddPolicy() автоматически добавляет новое имя хоста и ключ в локальный объект HostKeys.

Метод connect выполняет подключение к SSH-серверу и аутентифицирует подключение. Параметры:

  • look_for_keys — по умолчанию paramiko выполняет аутентификацию по ключам. Чтобы отключить это, надо поставить флаг в False
  • allow_agent — paramiko может подключаться к локальному SSH агенту ОС. Это нужно при работе с ключами, а так как в данном случае аутентификация выполняется по логину/паролю, это нужно отключить.

После выполнения предыдущей команды уже есть подключение к серверу. Метод invoke_shell позволяет установить интерактивную сессию SSH с сервером.

Метод send#

Метод send — отправляет указанную строку в сессию и возвращает количество отправленных байт или ноль если сессия закрыта и не удалось отправить команду:

In [7]: ssh.send("enable\n") Out[7]: 7 In [8]: ssh.send("cisco\n") Out[8]: 6 In [9]: ssh.send("sh ip int br\n") Out[9]: 13 

В коде после send надо будет ставить time.sleep, особенно между send и recv. Так как это интерактивная сессия и команды набираются медленно, все работает и без пауз.

Метод recv#

Метод recv получает данные из сессии. В скобках указывается максимальное значение в байтах, которое нужно получить. Этот метод возвращает считанную строку.

In [10]: ssh.recv(3000) Out[10]: b'\r\nR1>enable\r\nPassword: \r\nR1#sh ip int br\r\nInterface IP-Address OK? Method Status Protocol\r\nEthernet0/0 192.168.100.1 YES NVRAM up up \r\nEthernet0/1 192.168.200.1 YES NVRAM up up \r\nEthernet0/2 unassigned YES NVRAM up up \r\nEthernet0/3 192.168.130.1 YES NVRAM up up \r\nLoopback22 10.2.2.2 YES manual up up \r\nLoopback33 unassigned YES unset up up \r\nLoopback45 unassigned YES unset up up \r\nLoopback55 5.5.5.5 YES manual up up \r\nR1#' 

Метод close#

Метод close закрывает сессию:

Читайте также:  Xml tree in html

Пример использования paramiko#

Пример использования paramiko (файл 3_paramiko.py):

import paramiko import time import socket from pprint import pprint def send_show_command( ip, username, password, enable, command, max_bytes=60000, short_pause=1, long_pause=5, ): cl = paramiko.SSHClient() cl.set_missing_host_key_policy(paramiko.AutoAddPolicy()) cl.connect( hostname=ip, username=username, password=password, look_for_keys=False, allow_agent=False, ) with cl.invoke_shell() as ssh: ssh.send("enable\n") ssh.send(f"enable>\n") time.sleep(short_pause) ssh.send("terminal length 0\n") time.sleep(short_pause) ssh.recv(max_bytes) result = <> for command in commands: ssh.send(f"command>\n") ssh.settimeout(5) output = "" while True: try: part = ssh.recv(max_bytes).decode("utf-8") output += part time.sleep(0.5) except socket.timeout: break result[command] = output return result if __name__ == "__main__": devices = ["192.168.100.1", "192.168.100.2", "192.168.100.3"] commands = ["sh clock", "sh arp"] result = send_show_command("192.168.100.1", "cisco", "cisco", "cisco", commands) pprint(result, width=120) 

Результат выполнения скрипта:

'sh arp': 'sh arp\r\n' 'Protocol Address Age (min) Hardware Addr Type Interface\r\n' 'Internet 192.168.100.1 - aabb.cc00.6500 ARPA Ethernet0/0\r\n' 'Internet 192.168.100.2 124 aabb.cc00.6600 ARPA Ethernet0/0\r\n' 'Internet 192.168.100.3 183 aabb.cc00.6700 ARPA Ethernet0/0\r\n' 'Internet 192.168.100.100 208 aabb.cc80.c900 ARPA Ethernet0/0\r\n' 'Internet 192.168.101.1 - aabb.cc00.6500 ARPA Ethernet0/0\r\n' 'Internet 192.168.102.1 - aabb.cc00.6500 ARPA Ethernet0/0\r\n' 'Internet 192.168.130.1 - aabb.cc00.6530 ARPA Ethernet0/3\r\n' 'Internet 192.168.200.1 - 0203.e800.6510 ARPA Ethernet0/1\r\n' 'Internet 192.168.200.100 18 6ee2.6d8c.e75d ARPA Ethernet0/1\r\n' 'R1#', 'sh clock': 'sh clock\r\n*08:25:22.435 UTC Mon Jul 20 2020\r\nR1#'> 

Постраничный вывод команд#

Пример использования paramiko для работы с постраничным выводом команд show (файл 3_paramiko_more.py):

import paramiko import time import socket from pprint import pprint import re def send_show_command( ip, username, password, enable, command, max_bytes=60000, short_pause=1, long_pause=5, ): cl = paramiko.SSHClient() cl.set_missing_host_key_policy(paramiko.AutoAddPolicy()) cl.connect( hostname=ip, username=username, password=password, look_for_keys=False, allow_agent=False, ) with cl.invoke_shell() as ssh: ssh.send("enable\n") ssh.send(enable + "\n") time.sleep(short_pause) ssh.recv(max_bytes) result = <> for command in commands: ssh.send(f"command>\n") ssh.settimeout(5) output = "" while True: try: page = ssh.recv(max_bytes).decode("utf-8") output += page time.sleep(0.5) except socket.timeout: break if "More" in page: ssh.send(" ") output = re.sub(" +--More--| +\x08+ +\x08+", "\n", output) result[command] = output return result if __name__ == "__main__": devices = ["192.168.100.1", "192.168.100.2", "192.168.100.3"] commands = ["sh run"] result = send_show_command("192.168.100.1", "cisco", "cisco", "cisco", commands) pprint(result, width=120) 

Источник

Работа с ssh в Python

Хочу рассказать про paramiko — модуль для работы с ssh в python.
С его помощью можно написать скрипт, который получит доступ к удаленному серверу (или многим) и что-то на нем сделает.

Кому интересно — прошу под кат.

Достаточно часто на работе требовалось выполнить очень однотипные действия на серверах клиентов. Действия пустяковые, наподобие «исправить строчку №12 в конфигурационном файле» или «заменить файл „version_017“ на „version_018“. Это было легко, пока серверов не накопилось *надцать штук. Также подобные задачи надоедали очень быстро, поэтому подобную работу старались поручить новичкам с формулировкой „для приобретения навыков работы с ssh“.

Поначалу самые простые задачи можно было решить стандартными средствами ssh — копированием файла и удаленным исполнением кода. Также пробовали использовать утилиту empty .

Я в то время как раз начинал учить python, решил посмотреть, что в нем есть для этих целей. Гугл услужливо подсказал про paramiko.

Paramiko (комбинация слов языка есперанто „параноик“ и „друг“ — »paranoja» + «amiko») — это модуль для 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’) — выполняет команду на удаленном сервере. Потоки ввода-вывода программы возврашщаются в файлообразные обьекты — stdin, stdout, stderr.

Возможно, я недоразобрался, но у меня не получилось получить права рута на уделенном сервере. Буду благодарен, если мне подскажут, как это сделать. Для выполнения действий с правами суперпользователя делал так:

stdin, stdout, stderr = ssh.exec_command('sudo -S rm *') stdin.write('password' + '\n') stdin.flush() 

UPD: meph1st0 в комментариях предложил для этих целей воспользоваться классом Channel

import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(. ) channel = сlient.get_transport().open_session() channel.get_pty() channel.settimeout(5) channel.exec_command('sudo ls') channel.send(password+'\n') print channel.recv(1024) channel.close() client.close() 

Для передачи файлов по sftp можно использовать класс Transport. Для непосредственной передачи файлов используются команды put и get.

host = "example.com" port = 22 transport = paramiko.Transport((host, port)) transport.connect(username='login', password='password') sftp = paramiko.SFTPClient.from_transport(transport) remotepath = '/path/to/remote/file.py' localpath = '/path/to/local/file.py' sftp.get(remotepath, localpath) sftp.put(localpath, remotepath) sftp.close() transport.close() 

Вкратце всё. Сайт проекта и документация — http://www.lag.net/paramiko/

UPD. В комметариях подсказали, что есть ряд других библиотек инструментов, которые также можно использовать для работы по ssh решения подобных задач. Из перечисленного: fabric, chef, puppet, libbsh2 (pylibbsh2), exscript и net-ssh-telnet на руби. Всем комментаторам спасибо.

Источник

Как использовать Python для работы с SSH

В данной статье мы рассмотрим, как использовать Python для работы с SSH (Secure Shell) – протоколом, используемым для безопасного удаленного управления системами и передачи данных между компьютерами.

Использование библиотеки Paramiko

Для работы с SSH в Python одной из наиболее популярных библиотек является Paramiko. Для установки этой библиотеки используйте следующую команду:

Создание SSH-соединения

Для создания SSH-соединения с удаленным сервером используйте следующий код:

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('example.com', username='your_username', password='your_password')

🔒 Обратите внимание, что использование пароля для аутентификации может быть небезопасным. Лучше использовать ключи SSH для аутентификации.

Выполнение команд на удаленном сервере

После установления SSH-соединения можно выполнить команды на удаленном сервере. Вот пример выполнения команды ls :

stdin, stdout, stderr = ssh.exec_command('ls') print(stdout.read().decode())

Закрытие SSH-соединения

После выполнения всех необходимых операций не забудьте закрыть SSH-соединение:

Использование библиотеки Fabric

Еще одной популярной библиотекой для работы с SSH является Fabric. Она предоставляет высокоуровневый интерфейс для работы с SSH и упрощает выполнение многих операций. Для установки Fabric используйте следующую команду:

Создание SSH-соединения и выполнение команд с использованием Fabric

Вот пример использования Fabric для создания SSH-соединения и выполнения команды ls на удаленном сервере:

from fabric import Connection with Connection('example.com', user='your_username', connect_kwargs=) as conn: result = conn.run('ls') print(result.stdout.strip())

📝 Fabric также поддерживает использование ключей SSH для аутентификации, что является более безопасным вариантом.

Закрытие SSH-соединения в Fabric

Когда вы используете Fabric с контекстным менеджером with , SSH-соединение автоматически закрывается при выходе из блока кода.

Заключение

Теперь вы знаете, как использовать Python для работы с SSH с помощью таких библиотек, как Paramiko и Fabric. Это позволит вам безопасно управлять удаленными системами и выполнять различные операции с использованием Python-скриптов. Удачного кодирования! 🐍

Источник

Оцените статью