Выполнять команды на удаленном хосте через telnet с помощью скрипта python

Я пытался написать сценарий, чтобы упростить набор моей работы. Я попробовал это с командами оболочки, но код выглядит слишком прямолинейным и, если честно, слишком любительским. Я пытаюсь изучить Python для написания сценариев, и с вашей помощью я надеюсь, что эта моя проблема может превратиться в объяснительную практику.

Ниже приведен код оболочки, который я написал:

#!/usr/bin/expect 

spawn telnet IPaddress
sleep 0.1
expect "Enter username and password"
send "username password \n"
sleep 0.1
send "debug; \n"
sleep 0.1
send "def t1 suspend_loader \n"
expect "enter subcommands"
send "traceback \n \n;"
sleep 1
send "act t1 \n"
sleep 0.1
send "quit \n"
sleep 0.1
send "stor2tst;audit_modules \n"
expect "PS Checksum audit completed"
send "quit \n"
sleep 0.1
send "debug"
sleep 0.1
send "print t1 \n"
sleep 0.5
send "quit \n"
sleep 0.1
send "logutil;open MOD;back all;quit \n"
sleep 0.1
send "debug \n"
sleep 0.1
send "di modules:pr.514 d 1 (&0) char n=68 \n"
send "quit \n"
sleep 1
send "quit \n"
send "logout \n"



interact

Как вы уже могли догадаться, этот код предназначен для конкретного интерфейса коммутатора. Имя пользователя и пароль приходят в одну строку. Существуют определенные уровни оболочки (например, уровень отладки), которые мне требуются для выполнения нескольких команд. Я также использовал модуль ожидания здесь, но я думаю, что он просто проходит без проверки строки в ожидаемой части.

ЧТО Я ПЫТАЮСЬ ДЕЛАТЬ?
Мне нужно подключиться по telnet к списку известных IP-адресов (20 серверов).
На всех серверах одинаковые имя пользователя и пароль.
Мне нужно чтобы выполнить этот набор команд на каждом сервере и вернуть любые выходные данные в отдельные файлы журналов в указанном каталоге (например, /tmp/dir).
Кроме того, для выполнения некоторых команд требуется "двойной ввод"! Вот почему я использовал \n\n после команды traceback.

Будем признательны за любую помощь.
Заранее спасибо,


person Okan Akca    schedule 26.08.2015    source источник
comment
Итак, вы просите кого-нибудь перевести сценарий ожидания в сценарий Python?   -  person Eric Renouf    schedule 26.08.2015
comment
Взгляните на Python telnetlib и поместите все свои команды и т. д. в итерируемый (например, диктант). Попробуйте перебрать эти «наборы» данных и выполнить свои действия в этом цикле for.   -  person albert    schedule 26.08.2015
comment
В качестве альтернативы, просто продолжайте использовать expect и научитесь любить язык TCL, который, как и Python, является динамическим языком сценариев, поддерживающим делать все, что вам нужно (включая цикл, обработку аргументов командной строки и т. д.).   -  person larsks    schedule 26.08.2015
comment
Пробовали ли вы pexpect?   -  person primero    schedule 26.08.2015
comment
Я согласен с @albert, telnetlib это правильный путь. stackoverflow.com/questions/10952514/telnetlib-python-example   -  person Joseph Farah    schedule 26.08.2015
comment
Я также хотел бы добавить, что это очень хорошо написанный вопрос. хорошая работа, ОП.   -  person Joseph Farah    schedule 26.08.2015
comment
@EricRenouf, на самом деле нет. Я включил то, что я сделал, чтобы получить то, что мне нужно, чтобы мы могли реализовать версию этой задачи на Python.   -  person Okan Akca    schedule 27.08.2015
comment
@Albert, спасибо за ваш комментарий. Теперь я проверю области, которые вы упомянули. С уважением,   -  person Okan Akca    schedule 27.08.2015
comment
@larsks, я хочу учиться и любить python mate .. :) Я постараюсь сформировать подходящий цикл цикла, соответствующий моим потребностям. С уважением,   -  person Okan Akca    schedule 27.08.2015
comment
@silentphoenix, спасибо за внимание! Я рассмотрю пример, который вы указали, а также telnetlib. С уважением,   -  person Okan Akca    schedule 27.08.2015


Ответы (2)


Я написал себе следующий код, надеюсь, это поможет людям, которые могут искать подобное решение:

#!/usr/bin/expect

set timeout 150

array set hosts {0 <IPaddr> 1 <IPaddr> 2 <IPaddr> 3 <IPaddr> 4 <IPaddr> 5 <IPaddr> 6 <IPaddr> 7 <IPaddr> 8 <IPaddr> 9 <IPaddr> 10 <IPaddr> 11 <IPaddr>}

for {set i 0} {$i < 12 } { incr i } {

spawn telnet $hosts($i)
expect "Enter username and password"
send "root toor \n"
sleep 2
expect ">" {send "print '****************$hosts($i)****************' \n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect "enter subcommands"
expect ">" {send "command \n\n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect ">" {send "print '****************$hosts($i)****************' \n"}
interact
}

Как я упоминал в своем описании проблемы, этот код был специально разработан для работы с коммутаторами типа Nortel DMS, поэтому, пожалуйста, извините меня за возможный низкоуровневый дизайн кода. Все, что имеет значение, это то, что он работает и удовлетворяет наши потребности. . :)

Ваше здоровье!

person Okan Akca    schedule 03.09.2015

Вы должны иметь возможность использовать ткань для запуска одной и той же команды для нескольких серверов.

http://www.fabfile.org/

http://docs.fabfile.org/en/1.10/usage/execution.html#roles

person yilmazhuseyin    schedule 27.08.2015
comment
Спасибо дружище, никогда о таком не слышал. Я проверю это сейчас. - person Okan Akca; 27.08.2015
comment
На самом деле это не сервер. То, что он пытается сделать, запускает кучу команд через telnet. Я не думаю, что Fab поддерживает telnet в качестве транспортного механизма. Все эти утилиты работают через SSH. - person Eren T.; 28.08.2015