Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
alexroot
- рядовой
- Сообщения: 12
- Зарегистрирован: 2009-05-11 18:37:10
Непрочитанное сообщение
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}
alexroot
-
Хостинг HostFood.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
Непрочитанное сообщение
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 и выполнял эту процедуру ?
alexroot
-
skeletor
- майор
- Сообщения: 2548
- Зарегистрирован: 2007-11-16 18:22:04
skeletor
-
Alex Keda
- стреляли...
- Сообщения: 35439
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
-
Контактная информация:
Непрочитанное сообщение
Alex Keda » 2010-07-13 18:57:51
оффтоп
а не стрёмно, вот так - на автопилоте железки перешивать?
Убей их всех! Бог потом рассортирует...
Alex Keda
-
alexroot
- рядовой
- Сообщения: 12
- Зарегистрирован: 2009-05-11 18:37:10
Непрочитанное сообщение
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 должны идти списком без пробелов
alexroot
-
Alex Keda
- стреляли...
- Сообщения: 35439
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
-
Контактная информация:
Непрочитанное сообщение
Alex Keda » 2010-07-15 20:43:16
alexroot писал(а):
и еще Ip адреса в файле ip.txt должны идти списком без пробелов
в смысле - без пробелов? пробелы будут разделителем, как и перевод строки, и не будут восприняты как часть строки.
по крайней мере в sh так. если баш и тут по своему извратился - это его проблемы, и тех кто на нём пишет.
Убей их всех! Бог потом рассортирует...
Alex Keda
-
FreeBSP
- майор
- Сообщения: 2020
- Зарегистрирован: 2009-05-24 20:20:19
- Откуда: Москва
Непрочитанное сообщение
FreeBSP » 2010-08-05 14:39:54
для конструкции
строка должна иметь следующий вид
Код: Выделить всё
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 системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!
FreeBSP
-
Sled
- рядовой
- Сообщения: 12
- Зарегистрирован: 2010-11-22 12:39:30
- Откуда: Москва
Непрочитанное сообщение
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
-
Sled
- рядовой
- Сообщения: 12
- Зарегистрирован: 2010-11-22 12:39:30
- Откуда: Москва
Непрочитанное сообщение
Sled » 2010-11-23 10:50:03
есть ли у кого-нибудь мысли?
Sled
-
Sled
- рядовой
- Сообщения: 12
- Зарегистрирован: 2010-11-22 12:39:30
- Откуда: Москва
Непрочитанное сообщение
Sled » 2010-11-26 17:09:14
Дописал скрипт, работает!
Sled