- Use Paramiko and Python to SSH into a Server
- Before You Begin
- Install Paramiko
- A Paramiko SSH Example: Connect to Your Server Using a Password
- Second Paramiko Example: Connect to your Server Using SSH Keys
- Going Further with Paramiko
- More Information
- Работа с ssh в Python
- Как использовать Python для работы с SSH
- Использование библиотеки Paramiko
- Создание SSH-соединения
- Выполнение команд на удаленном сервере
- Закрытие SSH-соединения
- Использование библиотеки Fabric
- Создание SSH-соединения и выполнение команд с использованием Fabric
- Закрытие SSH-соединения в Fabric
- Заключение
Use Paramiko and Python to SSH into a Server
Estamos traduciendo nuestros guías y tutoriales al Español. Es posible que usted esté viendo una traducción generada automáticamente. Estamos trabajando con traductores profesionales para verificar las traducciones de nuestro sitio web. Este proyecto es un trabajo en curso.
When your Python program needs to run an external password-dependent program, or access a remote server, use Paramiko. Paramiko is a Python module that implements the SSHv2 protocol. Paramiko is not part of Python’s standard library, although it’s widely used. This guide shows you how to use Paramiko in your Python scripts to authenticate to a server using a password and SSH keys.
Before You Begin
- If you have not already done so, create a Linode account and Compute Instance. See our Getting Started with Linode and Creating a Compute Instance guides.
- Follow our Setting Up and Securing a Compute Instance guide to update your system. You may also wish to set the timezone, configure your hostname, create a limited user account, and harden SSH access.
Install Paramiko
You must install Paramiko on your system before being able to use it in your Python programs. Use the command below to install Paramiko with Pip:
If you are not familiar with Pip or do not have it installed on your system, see our How to Manage Python Packages and Virtual Environments on Linux guide.
If your system is configured to use Anaconda, you can use the following command to install Paramiko:
conda install -c anaconda paramiko
A Paramiko SSH Example: Connect to Your Server Using a Password
This section shows you how to authenticate to a remote server with a username and password. To begin, create a new file named first_experiment.py and add the contents of the example file. Ensure that you update the file with your own Linode’s details. Replace the values for YOUR_IP_ADDRESS , YOUR_LIMITED_USER_ACCOUNT , and YOUR_PASSWORD . Use the Find Your Linode’s IP Address guide, if needed.
This file connects to remote server over SSH using the IP address and credentials that you provide. It then uses the df command to generate a report of your server’s free disk space.
Execute the file with the following command:
Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 1921544 0 1921544 0% /dev tmpfs 1936296 0 1936296 0% /dev/shm tmpfs 1936296 211308 1724988 11% /run tmpfs 1936296 0 1936296 0% /sys/fs/cgroup /dev/mapper/cl-root 46110724 20501872 25608852 45% / /dev/sda1 999320 187324 743184 21% /boot
The file above provides a high-level example that you can use to incorporate Paramiko into your Python code. While everything Paramiko does can also be done with shell commands, Paramiko gives you all the power of Python. Python gives you access to structuring data, looping, parsing, and other powerful features that go beyond what is available in shell scripting. For example, if you are writing a program to calculate system usage percentages, Python is better at extracting and calculating values from your system’s output.
Second Paramiko Example: Connect to your Server Using SSH Keys
One of Paramiko’s specific strengths is the correct handling of SSH add keys. The introductory example above depended on the use of your limited user account’s password. It is more secure, however, to use SSH keys for server authentication. The example file below, provides a report that alerts you of any logins by users that are not included in your list of expected users. The Python script relies on Paramiko (notice the key_based_connect() function) to use SSHv2 authentication to connect to any of the servers provided in the code’s server_list list.
Execute the file with the following command:
If a user outside of the Python script’s expected list accesses one of your servers, the Python script returns the following:
Entry user4 pts/0 192.0.2.0 Wed Sep 23 15:13 - 17:28 (02:14)' is a surprise on 192.0.2.0.
Going Further with Paramiko
Paramiko helps you automate repetitive system administration tasks on remote servers. More advanced Paramiko programs send the lines of a script one at a time. It does this rather than transacting all of a command, such as df or last , synchronously to completion. Paramiko is a helpful addition to your system administrator toolchain when working to automate common tasks. You can visit Paramiko’s documentation to learn about its special-purpose methods and variables that go beyond the examples covered in this guide.
More Information
You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.
This page was originally published on Friday, August 13, 2021.
Работа с 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-скриптов. Удачного кодирования! 🐍