Pull to refresh

Comments 15

«исправить строчку №12 в конфигурационном файле» или «заменить файл „version_017“ на „version_018“
звучит как «нам нужна VCS» =)

client.connect(hostname='192.168.0.8', username='login', password='password'
вот прям так у вас в скрипте и лежит?
Спасибо за статью. Мои 5 копеек: насколько я знаю, версии paramiko для python3 еще нет (и не известно, когда будет). Есть только несколько сторонних давно заброшенных портов.
Попробуйте fabric. Он кстати внутри тоже paramiko использует.
уже не использует, они на pypi.python.org/pypi/ssh перешли (будет в след версии), теперь конфиги ssh не игнорятся
Статья практически туториал по парамико…

Для целей: «поменять 3 строчки» используйте fabric, быстрее, проще, надежнее

Сам использую paramico, довльно удобно. Но для описавыемых вами задач менеджмента большого парка серверов («исправить строчку №12 в конфигурационном файле» или «заменить файл „version_017“ на „version_018“.) лучше использовать chef или puppet.
libbsh2 биндинговые либы намного стабильнее имхо.
Пробовал и paramiko, и pylibssh2
UFO just landed and posted this here
И это правильно, и это красиво.
Но где шагов побольше и нужно какая-то логика, я применяю библиотеку net-ssh-telnet на руби. Приведу здесь же для коллекции и сравнения.

require 'net/ssh'
require 'net/ssh/telnet'
s = Net::SSH.start('hostname', 'user', :password => 'secret')
t = Net::SSH::Telnet.new("Session" => s)

t.cmd("su - another_user") # можно переключиться на другой аккаунт
puts t.cmd("ls -l")  # и вывести stdout удаленной команды


Хотя в целом это оболочка для упрощения net-ssh. Основной пакет поддерживает и scp, и sftp, и проброску туннелей, и вообще все что угодно.
Лично мне fabric не подошел, когда нужно было автоматизировать обновлений на сетевых устройствах cisco.
Пока остановился на exscript-е github.com/knipknap/exscript
Но его еще нужно доводить до ума, чтобы было можно работать с Cisco ASA например. (или с чем другим, где нет стандартного shell-а или стандартного приглашения)
> Возможно, я недоразобрался, но у меня не получилось получить права рута на уделенном сервере.

Не работать может по нескольким причинам, вероятно stderr.read() вернет 'sudo: no tty present and no askpass program specified\n', т.е. нужен псевдотерминал.

У SSHClient нет (или я плохо искал?) возможности получить pty, но можно воспользоваться классом Channel, экземпляр которого легко получить из SSHClient. Код ниже иллюстрирует данный способ:

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()

Код отлаживал в терминале, кажется ничего не пропустил при копировании. В реальных условиях нужно смотреть, что sudo отдает в stdin и stderr и писать в stdin только в ответ на «вопросы».
добавил Ваш пример в топик.
Я бы не назвал chef и puppet библиотеками для работы по ssh :)
Sign up to leave a comment.

Articles