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 не единственные, и есть еще и другие варианты рассмотренные выше.
Данный тип подключения позволяет управлять сервером удаленно. Однако не стоит забывать, что скрипт выполняемый локально значительно быстрее удаленного подключения. Поэтому для оптимизации времени выполнения поставленных задач имеет смысл запускать скрипт локально, для получения более быстрых результатов. В любом случае решать вам. Спасибо за внимание.