J. Sheridan, commander of the Babylon 5 station (j_sheridan) wrote,
J. Sheridan, commander of the Babylon 5 station
j_sheridan

Categories:

Автоматизация обхода свичей по телнету

Нарисовал немного такого вот полезного кода, попутно несколько изучив tcl вообще и expect в частности, и истощив запас лучей диареи, высланных в сторону разработчиков терминала dlink’ов. Сначала все шло хорошо, и код набросался минут за 15, включая гугл. А вот потом я наступил на змеиное логово, оттуда выпрыгнули пауки и замотали меня в паутину, сволочи. Терминал не хотел переваривать \r. Тоесть  в ответ на «login» отсылаю я ему »admin\r». А там оно это не хавает и чегототам еще ждет. Уж как я не извращался, грешил на то, что не \r отправлять надо, пытался управляющие символы подменить, колдовал над stty и вообще грешным делом думал уже в православную веру перла удариться, проявив малодушие и отбросив в сторону упертость.

А потом взял wireshark и сравнил траффик. Тот который при ручном коннекте и который скрипт генерирует. Оказывается червь, переваривающий внутри длинков терминальные комманды настолько ленив (ну или с ЖКТ у него чегото не так), что переваривать может только команды, отосланные посимвольно. Отослали символ, подождали, отослали-подождали… Причем ждать надо не сколькототам секунд, а желательно пока червь не подтвердит принятие очередного символа. Вообщем, битва была долгой, но неравной. Под катом то, что вышло.

Собственно, сеанс телнета. Конкретно тут просто у dir-100 выдергивает описание интерфейсов.

#!/usr/bin/expect -f

set server   [lindex $argv 0]
set port     [lindex $argv 1]
set login    [lindex $argv 2]
set password [lindex $argv 3]

proc send_chars {str} {
set strlen [string length $str]
set prev_letter ""
for {set i 0} {$i < $strlen} {incr i} {     set letter [string index $str $i]     if { [string length $prev_letter] == 1 } {       expect $prev_letter { send $letter; set prev_letter $letter }     } else {       send $letter       after 50     }   }   send "\r"   after 100 } spawn telnet $server $port expect "login:"    { send_chars $login } expect "Password:" { send_chars $password } expect "CMD>" { send_chars "net" }
expect "NET>" { send_chars "show eth0"; }
expect "NET>" { send_chars "show eth1" }
expect "NET>" { send_chars "show eth2" }
expect "NET>" { send_chars "show eth3" }
expect "NET>" { send_chars "quit" }

expect eof

Ну и так сказать «управляющий» скрипт:

#!/bin/sh

USERNAME="admin"
PASSWORD="пароль"

function term_exec()
{
server=$1; shift
port=$1; shift
./request ${server} ${port} ${USERNAME} ${PASSWORD}
}

for i in 128 129 130
do
term_exec "192.168.17.$i" "23"
done

Оригинал записи - в личном блоге. Комментировать можно тут, но желательно там.

Tags: Администрирование, Программирование, Работа
Subscribe

  • Авторазбитие дисков fdisk'ом

    Я просто положу это здесь. Думаю, все понятно будет. root# cat ./autofdiskpart #!/bin/bash fdisk /dev/$1 << EOF d 1 d 2 d 3 d 4 p n p 1…

  • Полный лог bind

    Просто скопируйте это в конфиг named и создайте /var/log/named/ с правами соответствующими и будете в курсе всего что творится в бинде. logging {…

  • Формат списка mc

    Чтобы самому не забыть... ИМХО самый правильный формат. Панель: "type mark name | mtime | bsize" Строка статуса: "type name | nlink |…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments