How to connect Paramiko stdin, stdout and stderr to console?
I use the Paramiko Python package to run commands over SSH. I can get output to stdout but how can I properly get stdout, stderr and stdin redirected to the sys ones? The code below would only display «stdout1» and «stdout2» on stdout. How do I get «stderr» in there properly? And preferably also support for stdin?
import paramiko ssh = paramiko.SSHClient() ssh.load_system_host_keys() ssh.connect("localhost") stdin, stdout, stderr = ssh.exec_command("echo stdout1 >&1; echo stderr >&2; echo stdout2 >&1") ch = stdout.channel while True: bs = ch.recv(1) if not bs: break print(bs.decode("utf-8"), end="")
asked Apr 12, 2019 at 12:16
Per Appelgren Per Appelgren
57 1 1 silver badge 5 5 bronze badges
2 Answers 2
stdin, stdout, stderr = ssh.exec_command("echo stdout1 >&1; echo stderr >&2; echo stdout2 >&1") while True: print(stdout.read().decode(), end='') if stdout.channel.exit_status_ready(): break while True: print(stderr.read().decode(), end='') if stderr.channel.exit_status_ready(): break
answered Apr 14, 2019 at 14:50
1,622 15 15 silver badges 35 35 bronze badges
The problem with that solution was that «stdout2» is printed before «stderr». I found an alternative package called asyncssh which was easier to use for my use case.
Как получить значение консоли через paramiko
Библиотека Paramiko является мощным инструментом, который позволяет программистам взаимодействовать с удаленными серверами через протокол SSH. Эта библиотека написана на языке программирования Python и предлагает удобный и гибкий способ выполнения команд на удаленном сервере и получения результатов.
Одной из важных возможностей Paramiko является возможность получения значения консоли с удаленного сервера. Это особенно полезно для автоматизации задач, таких как проверка состояния сервера, анализ журналов или выполнение команд на сетевых устройствах.
Для использования Paramiko вам необходимо установить эту библиотеку с помощью менеджера пакетов pip. После установки вы сможете создать объект SSHClient, который будет служить для установления соединения с удаленным сервером. Затем вы можете выполнить команды с помощью метода exec_command и получить результаты с помощью методов стандартного потока вывода.
# Установление соединения с сервером
client.connect(hostname=’remote_server’, username=’username’, password=’password’)
# Выполнение команды на удаленном сервере
stdin, stdout, stderr = client.exec_command(‘command’)
# Получение значений консоли
Теперь вы можете использовать библиотеку Paramiko для получения значений консоли с удаленных серверов. Это поможет вам упростить и автоматизировать свои задачи администрирования и управления удаленными устройствами.
Paramiko для работы с консольными значениями
Paramiko – это библиотека для языка Python, которая позволяет работать с протоколом SSH. С ее помощью можно создавать SSH-соединения, передавать команды и получать результаты выполнения с удаленных серверов.
Одной из полезных возможностей библиотеки Paramiko является работа с консольными значениями на удаленном сервере. Для этого можно использовать классы Channel и SSHClient.
Класс Channel представляет собой SSH-канал, через которой можно передавать команды и получать результаты. Для получения значения консоли используется метод exec_command, который принимает на вход команду и возвращает три вывода: стандартный вывод, стандартный вывод ошибок и статус выполнения команды.
import paramiko
# Создание SSH-клиента
client = paramiko.SSHClient()
# Подключение к удаленному серверу
client.connect(‘hostname’, port=22, username=’username’, password=’password’)
# Открытие SSH-канала
channel = client.get_transport().open_session()
# Выполнение команды на удаленном сервере
stdin, stdout, stderr = channel.exec_command(‘command’)
# Чтение значения стандартного вывода
output = stdout.read().decode()
# Печать значения стандартного вывода
print(output)
# Закрытие SSH-канала и отключение от сервера
channel.close()
client.close()
Класс SSHClient обертывает функциональность класса Channel и позволяет упростить работу с удаленными серверами. Он предоставляет методы для установления соединения, выполнения команд и получения результатов.
Пример использования класса SSHClient для получения значения консоли:
import paramiko
# Создание SSH-клиента
client = paramiko.SSHClient()
# Установление доверия к неизвестным хостам
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Подключение к удаленному серверу
client.connect(‘hostname’, port=22, username=’username’, password=’password’)
# Выполнение команды на удаленном сервере
stdin, stdout, stderr = client.exec_command(‘command’)
# Чтение значения стандартного вывода
output = stdout.read().decode()
# Печать значения стандартного вывода
print(output)
# Закрытие соединения с сервером
client.close()
Использование библиотеки Paramiko для работы с консольными значениями позволяет автоматизировать процессы на удаленных серверах и упростить выполнение команд и получение результатов.
Paramiko – библиотека для взаимодействия с удаленными серверами
Paramiko – это библиотека, написанная на языке программирования Python, которая предоставляет возможности для взаимодействия с удаленными серверами по протоколу SSH. Благодаря этой библиотеке можно управлять удаленными серверами через командную строку, передавать команды, получать результаты и многое другое.
Paramiko имеет простой и понятный интерфейс, который позволяет легко взаимодействовать с удаленными серверами и выполнять различные действия. Она может быть использована для автоматизации процессов на удаленных серверах, настройки сетевого оборудования, резервного копирования данных и других задач, требующих удаленного доступа по протоколу SSH.
Преимущества использования Paramiko:
- Простота в использовании: библиотека имеет понятный и интуитивно понятный интерфейс, что делает ее простой в использовании даже для новичков.
- Возможность управления удаленными серверами: с помощью Paramiko вы можете выполнять различные действия на удаленных серверах, такие как передача файлов, выполнение команд, получение результатов и многое другое.
- Поддержка SSH: библиотека полностью поддерживает протокол SSH, что обеспечивает безопасное и зашифрованное соединение между вашим компьютером и удаленным сервером.
Вот простой пример использования Paramiko для подключения к удаленному серверу:
- Установите библиотеку Paramiko через pip:
pip install paramiko
- Импортируйте библиотеку Paramiko в свой код:
import paramiko
- Создайте экземпляр класса SSHClient:
ssh = paramiko.SSHClient()
- Добавьте удаленные серверы в список проверенных хостов:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- Установите соединение с удаленным сервером:
ssh.connect('hostname', username='username', password='password')
- Выполните необходимые операции на удаленном сервере:
stdin, stdout, stderr = ssh.exec_command('ls -l')
Приведенный выше пример подключается к удаленному серверу с заданным именем пользователя и паролем, выполняет команду ls -l и получает результаты выполнения.
В заключение, Paramiko является мощной библиотекой для взаимодействия с удаленными серверами по протоколу SSH. Благодаря своей простоте и функциональности, она часто используется для автоматизации процессов, управления удаленными серверами и других задач, связанных с удаленным доступом.
Использование Paramiko для получения данных из консоли удаленного сервера
Paramiko — это библиотека языка Python, которая позволяет создавать SSH-соединения и выполнять команды на удаленных серверах. Она предоставляет удобный и простой интерфейс для работы с SSH-протоколом.
Чтобы использовать Paramiko для получения данных из консоли удаленного сервера, необходимо выполнить несколько шагов:
- Установить библиотеку Paramiko:
pip install paramiko
- Импортировать необходимые модули:
import paramiko
- Создать объект SSHClient:
client = paramiko.SSHClient()
- Настроить параметры подключения:
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect('hostname', username='username', password='password')
- Открыть канал для выполнения команд:
channel = client.invoke_shell()
- Отправить команду на сервер:
channel.send('command')
- Прочитать ответ сервера:
output = channel.recv(4096).decode()
- Закрыть соединение:
channel.close()client.close()
В итоге, переменная output будет содержать результат выполнения команды на удаленном сервере.
Таким образом, использование библиотеки Paramiko позволяет получить данные из консоли удаленного сервера в удобном формате, а также автоматизировать выполнение команд на удаленных серверах.
Пример использования библиотеки Paramiko для получения консоли
Paramiko — это библиотека на языке Python, предназначенная для работы с протоколом SSH. Она позволяет устанавливать SSH-соединения, выполнять команды на удаленных серверах и получать результаты выполнения.
Для использования Paramiko необходимо установить его с помощью pip:
- Откройте командную строку (терминал) в своем проекте;
- Введите команду:
pip install paramiko
Теперь вы можете использовать Paramiko для установления SSH-соединения и выполнения команд на удаленном сервере. Ниже приведен пример использования библиотеки:
import paramiko# Установка соединения с удаленным сервером
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('hostname', username='username', password='password')
# Открытие сессии
channel = client.invoke_shell()
channel.send('command
')
# Получение результатов выполнения команды
output = channel.recv(1024)
# Печать результатов
print(output)
# Закрытие соединения
channel.close()
client.close()
Вышеуказанный код устанавливает SSH-соединение с удаленным сервером, открывает сессию, отправляет команду и получает результат выполнения команды. Результат сохраняется в переменной «output» и печатается на экране.
Важно отметить, что для использования Paramiko вы должны иметь права доступа к удаленному серверу. Установите корректные значения для hostname, username и password, чтобы успешно установить соединение.
Paramiko весьма гибкая библиотека, которая предоставляет различные функции работы с SSH, включая передачу файлов, прокси-серверы и использование ключей SSH. Используйте официальную документацию Paramiko для более подробной информации и примеров использования.
Вопрос-ответ
Какую функциональность предоставляет библиотека Paramiko?
Библиотека Paramiko позволяет осуществлять SSH-соединение и работу с удаленным сервером. Она предоставляет возможность выполнения команд на удаленном сервере, передачи файлов, управления сессиями SSH и многое другое.
Как получить значение консоли удаленного сервера с помощью библиотеки Paramiko?
Для получения значения консоли удаленного сервера с помощью библиотеки Paramiko нужно открыть SSH-соединение с сервером, выполнить нужные команды на удаленном сервере и получить результат выполнения команд. Для этого используются методы класса SSHClient, например, exec_command() для выполнения команд и получения результатов.
Можно ли использовать библиотеку Paramiko для работы с удаленными серверами без SSH-соединения?
Нет, библиотека Paramiko предназначена специально для работы с удаленными серверами по протоколу SSH. Она не поддерживает другие протоколы, поэтому использование SSH-соединения является обязательным условием для работы с удаленными серверами с помощью Paramiko.
Работа с 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 на руби. Всем комментаторам спасибо.
sudo paramiko
На днях столкнулся с такой проблемой. Нужно было написать скрипт на python с подключением по ssh. Для этого есть библиотека paramiko. Мне необходимо было подключится к серверу по ssh и выполнить определенные действия. Но как оказалось не все так просто. Ибо если используешь команду sudo paramiko необходимо ввести пароль после ввода команды.
Если просто подключаться без указания терминала то будет ошибка sudo: no tty present and no askpass program specified. Означает она что для выполнения sudo нужен терминал. Есть несколько решений, например отключить у sudo проверку терминала. Второй вариант отключить для sudo обязательный ввод пароля.
Третий вариант непосредственно скрип на python. Он позволяет подключаться к серверу по ssh и применять sudo с вводом пароля. Итак приступим к написанию скрипта.
Импорт библиотек
import getpass import paramiko import time
Инициируем ввод пароля и создаем соединение ssh
passw = getpass.getpass(prompt="Введите пароль:") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('newadmin.ru', username='admin', password=passw)
newadmin.ru – имя сервера (меняете на свое), username – логин подключения, password – переменная passw определяется выше путем ручного ввода пароля от сервера
Создаем канал ssh с обработкой команд
channel = ssh.get_transport().open_session() channel.get_pty() channel.settimeout(5) channel.exec_command('sudo ls') channel.send(passw+'\n') channel.recv_exit_status() print(channel.recv(1024))
В пятой строке channel.exec_command(‘sudo ls’) вводим команду с использованием sudo. Далее в строчке channel.send(passw+’\n’) отправляем введенный ранее пароль. Результат вывода просматриваем командой print(channel.recv(1024))
Закрываем канал и подключение ssh
channel.close() ssh.close()
Скрипт полностью
import getpass import paramiko import time passw = getpass.getpass(prompt="Введите пароль:") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('newadmin.ru', username='admin', password=passw) channel = ssh.get_transport().open_session() channel.get_pty() channel.settimeout(5) channel.exec_command('sudo ls') channel.send(passw+'\n') channel.recv_exit_status() print(channel.recv(1024)) channel.close() ssh.close()
В данной статье мы рассмотрели возможности подключения по ssh из python. Используя данный метод можно неплохо автоматизировать свои задачи. Главное не забывать что возможности sudo paramiko не единственные, и есть еще и другие варианты рассмотренные выше.
Данный тип подключения позволяет управлять сервером удаленно. Однако не стоит забывать, что скрипт выполняемый локально значительно быстрее удаленного подключения. Поэтому для оптимизации времени выполнения поставленных задач имеет смысл запускать скрипт локально, для получения более быстрых результатов. В любом случае решать вам. Спасибо за внимание.