Вопрос по expect

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
alexroot
рядовой
Сообщения: 12
Зарегистрирован: 2009-05-11 18:37:10

Вопрос по expect

Непрочитанное сообщение alexroot » 2010-07-08 16:36:04

Здраствуйте уважаемые форумчане . Возник вопос по expect . Ранее не сталкивался .
Суть вопоса в следующем . Есть в сети коммутаторы нужно массово их перепрошить .
скрипт справляется но в ручную вводить ip коммутатора долго и можно запутаться . Как передать аргумент или команду что б Ip брались из файла ip.txt к примеру

Код: Выделить всё

#!/usr/local/bin/expect -f
spawn telnet 10.10.5.1
expect  "Username:" { send "test\n}
expect  "Password:" { send "test\r}
expect ">" {send "tftp 192.168.0.1 get S300-V100R003.bin\n}
expect ">" {send "quit\r}

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

alexroot
рядовой
Сообщения: 12
Зарегистрирован: 2009-05-11 18:37:10

Re: Вопрос по expect

Непрочитанное сообщение alexroot » 2010-07-08 19:18:22

так сделал немного по иному и вопрос звучит поиному
сделал скрипт на bash и на expect
1 скрипт на bash updatesw.sh

Код: Выделить всё

#!/usr/local/bin/bash
#
for ip in `cat /usr/local/etc/scripts/ip.txt`; 
do echo $ip;
done
expect ./script.exp $ip 
второй скрипт script.exp

Код: Выделить всё

#!/usr/local/bin/expect -f
#
set ip [lrange $argv 0 0]
spawn telnet $ip
expect  "Username:" { send "test\n}
expect  "Password:" { send "test\r}
expect ">" {send "tftp 192.168.0.1 get S300-V100R003.bin\n}
expect ">" {send "quit\r}
все работает прошивка заливается но есть одно но . из файла ip.txt он обращается к последнему ip в списке как сделать что бы скрипт по списку брал ip и выполнял эту процедуру ?

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Вопрос по expect

Непрочитанное сообщение skeletor » 2010-07-09 21:37:36

Попробуй вот так http://www.wellho.net/forum/The-Tcl-pro ... -with.html. Если не поможет - тогда можно через perl.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35439
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Вопрос по expect

Непрочитанное сообщение Alex Keda » 2010-07-13 18:57:51

оффтоп

а не стрёмно, вот так - на автопилоте железки перешивать?
Убей их всех! Бог потом рассортирует...

alexroot
рядовой
Сообщения: 12
Зарегистрирован: 2009-05-11 18:37:10

Re: Вопрос по expect

Непрочитанное сообщение alexroot » 2010-07-15 13:18:36

Alex Keda писал(а):оффтоп

а не стрёмно, вот так - на автопилоте железки перешивать?
Стремно ну а что делать еще . Когда она 1 или 2 еще ладно но когда их больше 2 сотен и нужно все прошить сразу иначе не будет авторизации у абонентов так как брас настроен на новую прошивку то выхода нет .
Сделал так теперь все работает
cat upsw.sh
[14:15] /usr/local/etc/scripts/sw >cat upsw.sh

Код: Выделить всё

#!/usr/local/bin/bash
#
for ip in `cat /usr/local/etc/scripts/sw/ip.txt `;
do
expect ./upsw.exp $ip
done
cat upsw.exp

Код: Выделить всё

#!/usr/local/bin/expect -f
#


set force_conservative 0 
                         

if {$force_conservative} {
        set send_slow {1 .1}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}


set timeout -1
set ip [lrange $argv 0 0]
match_max 100000
sleep .1
spawn telnet $ip\n
expect  "Username:" { send "test\r"}
expect  "Password:" { send "test\r"}
sleep .1
expect ">" {send "tftp 192.168.0.1 get S2300-VC00SPC.cc\r"}
sleep .1
expect ">" {send "system-view\r"}
sleep .1
expect "]" {send "upgrade basic-bootrom S2300-VC00SPC.cc\r"}
sleep .1
expect "]" {send "Y\r"}
sleep .1
expect "]" {send "quit\r"}
sleep .1
expect ">" {send "reboot\r"}
sleep .1
expect "]" {send "Y\r"}
sleep .1
expect "]" {send "Y\r"}
expect ""  {send "--\r"}
expect ""  {send "^C\r"}
expect eof
Прошивал свитчи huawei s2300
и еще Ip адреса в файле ip.txt должны идти списком без пробелов

Код: Выделить всё

192.168.0.2
192.168.0.3
192.168.0.4

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35439
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Вопрос по expect

Непрочитанное сообщение Alex Keda » 2010-07-15 20:43:16

alexroot писал(а): и еще Ip адреса в файле ip.txt должны идти списком без пробелов

Код: Выделить всё

192.168.0.2
192.168.0.3
192.168.0.4
в смысле - без пробелов? пробелы будут разделителем, как и перевод строки, и не будут восприняты как часть строки.
по крайней мере в sh так. если баш и тут по своему извратился - это его проблемы, и тех кто на нём пишет.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Вопрос по expect

Непрочитанное сообщение FreeBSP » 2010-08-05 14:39:54

для конструкции

Код: Выделить всё

for var in $str; do
строка должна иметь следующий вид

Код: Выделить всё

str="value1 valie2      lalala ...... N-th_value";
если ипы списокм по ипу на строку, то надо собрать пайплайн из ката и рида

Код: Выделить всё

cat ips.list | {
while read ip;
do
  upd_switch_fw_cmd --parameters right --with $ip
  may_be_other_cmds lalala
done;
}
сей фиче найчился в статье Лехи про портапгрейд, за что ему отдельное Спасибо!
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Sled
рядовой
Сообщения: 12
Зарегистрирован: 2010-11-22 12:39:30
Откуда: Москва

Re: Вопрос по expect

Непрочитанное сообщение Sled » 2010-11-22 12:53:04

Всем привет, решил поднять тему.
У меня есть скрипт на экспекте, который принимает параметры из командной строки:
1 user
2 ip
3 password
4 sriptname
5 options
Который выполняет на удаленной *nix машине с авторизацией определенную команду, но нужно, чтобы он эту же команду выполнял на некотором количестве машин(которые задаются произвольно)
Вот скрипт:

Код: Выделить всё

 #!/usr/bin/expect -f
# ----------------------------------------------------------------------

set user [lindex $argv 0]
set ipaddr [lindex $argv 1]
set password [lindex $argv 2]
set scriptname [lindex $argv 3]
set option [lindex $argv 4]
set dozor_path "/opt/dozor/smap/bin/"
set oracle_path "/opt/dozor/smap/schema/oracle/shell/"
set dozor_init "/etc/init.d/"
set httpdsa "/opt/dozor/smap/admin-httpd/bin/httpdctl"
set date [timestamp -format "%C%y-%m-%d %X"]
set LOG_FILE "/var/log/expect.log"
proc USAGE {} {
        send_user "Warning: command line paramaters incorrect\n"
        send_user "Usage:\n"
        send_user "\t - sender \n"
        send_user "\t - archiver \n"
        send_user "\t - smtpgw \n"
        send_user "\t - mailfilter \n"
        send_user "\t - smap  \n"
        send_user "\t - actions  \n"
        send_user "\t - httpd  \n"
        send_user "\t - monitor  \n"
        send_user "\t - tikaserver  \n"
        send_user "\t - sooo \n"
        send_user "\t - dozor \n"
        send_user "\t - httpdsa \n"
        send_user "For Oracle:\n"
        send_user "\t - upgrade<plN>-<plM> \n"
        send_user "\t - upgrade-ctx38 \n"
        send_user "\t - disk_free \n"
        send_user "\n"
        send_user "\n"
        exit
}
log_file -a $LOG_FILE
log_user 0
#log_file -info
send_log "\r\n------------------------------------------------------\r\n $date\r\n ipaddr=$ipaddr, user=$user, scriptname=$scriptname, option=$option\r\n"

# set whoami [exec id -u]
# if {$whoami!=0} {
#   send_user "You must be a root user to run this script\n"
#   exit
# }
   if { $user == "" } {
    puts "Usage: <user> <ipaddr> <password> <scriptname> <option>\n"
      exit 1
      }
    if { $ipaddr == "" } {
   puts "Usage: <ipaddr> <password> <scriptname> <option>\n"
      exit 1
      }
    if { $password == "" } {
   puts "Usage: <password> <scriptname> <option>\n"
      exit 1
      }
    if { $scriptname != "sender" && $scriptname != "archiver" && $scriptname != "smtpgw"
         && $scriptname != "mailfilter" && $scriptname != "smap" && $scriptname != "actions" && $scriptname != "httpd"
         && $scriptname != "monitor" && $scriptname != "tikaserver" && $scriptname != "sooo" && $scriptname != "httpdsa"
         && $scriptname != "ifconfig" && $scriptname != "dozor"
        } then {
        send_error "\nAborted.\n"
        USAGE
        exit 1
        }
set timeout -1
log_user 0
spawn ssh $user@$ipaddr
match_max 100000
set timeout -1

expect {
        "Are you sure you want to continue connecting (yes/no)" {
                exp_send "yes\n"
                expect "password:" {exp_send "$password\n"}
                }
        "password:" {exp_send "$password\n"}
}

expect -re "# $"
set timeout -1

send "\r"
     if {
         $scriptname == "sender"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "archiver"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "smtpgw"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "mailfilter"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "smapctl"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "actions"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "httpd"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "monitor"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "tikaserver"} {
         send "$dozor_path$scriptname\ctl $option\r"
      }  elseif {
         $scriptname == "sooo"} {
         send "$dozor_path$scriptname\ctl $option\r"
      } elseif {
         $scriptname == "httpdsa"} {
         send "$httpdsa $option\r"
      } elseif {
         $scriptname == "ifconfig"} {
         send "$scriptname $option\r"
      } elseif {
         $scriptname == "tree"} {
         send "$scriptname $option\r"
      } elseif {
         $scriptname == "dozor"} {
         send "$dozor_init $option\r"
      }
set timeout -1
set results $expect_out(buffer)
log_user 1
expect -re "# $"
set timeout -1
send "exit\r"
expect eof

Sled
рядовой
Сообщения: 12
Зарегистрирован: 2010-11-22 12:39:30
Откуда: Москва

Re: Вопрос по expect

Непрочитанное сообщение Sled » 2010-11-23 10:50:03

есть ли у кого-нибудь мысли?

Sled
рядовой
Сообщения: 12
Зарегистрирован: 2010-11-22 12:39:30
Откуда: Москва

Re: Вопрос по expect

Непрочитанное сообщение Sled » 2010-11-26 17:09:14

Дописал скрипт, работает!