LinuxForum.Fans
Тема

EXPECT передача переменной скрипту

Автор: Munsera 28 сообщений 17650 просмотров
#135307

Здравствуйте. Как реализовать передачу переменной скрипту.
Ну например есть скрипт:

text
#!/usr/bin/expect -f

set timeout -1 spawn telnet $SWITCH_IP match_max 100000 expect -exact "Trying $SWITCH_IP...\r\r Connected to $SWITCH_IP ($SWITCH_IP).\r\r Escape character is '^\]'.\r\r \r \r User Access Verification\r \r Username: " send -- "логин\r" expect -exact "логин\r Password: " send -- "пароль\r" expect -exact "\r \r switch10027#" send -- "conf t\r" expect -exact "conf t\r Enter configuration commands, one per line. End with CNTL/Z.\r switch10027(config)#" send -- "ip acce " expect -exact "\r switch10027(config)#ip access-list " send -- "e " expect -exact "\r switch10027(config)#ip access-list extended " send -- "155\r" expect -exact "155\r switch10027(config-ext-nacl)#" send -- "per " expect -exact "\r switch10027(config-ext-nacl)#permit " send -- "ip g^H" expect -exact "ip g^H ^H" send -- "h " expect -exact "\r switch10027(config-ext-nacl)#permit ip host " send -- "х.х.х.5 a " expect -exact "\r switch10027(config-ext-nacl)#permit ip host х.х.х.5 any " send -- "\r" expect -exact "\r switch10027(config-ext-nacl)#" send -- "exit\r" expect -exact "exit\r switch10027(config)#" send -- "exit\r" expect -exact "exit\r switch10027#" send -- "exit\r" expect eof

Он допустим находится в /home/и называется local
пробую запускать скрипт с параметром
Код:
#/home/local set SWITCH_IP 192.168.0.1

#135310
Munsera написал:
#/home/local set SWITCH_IP 192.168.0.1

экспортировать надо в шелле:
[console]export SWITCH_IP=192.168.1.1[/console]
во вторых:
http://www.unix.com/shell-programming-scripting/28194-using-expect-script-shell-script.html
для Ъ

...just like calling any other command/file/script; something like:

for x in $(cat IP.addresses); do
expect_script $x
done

then in expect_script you'd have something like:

spawn telnet [lindex $argv 0] ## where [lindex $argv 0] = $x
do expect commands
exit 0
#135312

кспортировать надо в шелле:
Консоль:

export SWITCH_IP=192.168.1.1

Написал в консоли

text
export SWITCH_IP=192.168.1.1
[root@localhost ~]# /home/local
can't read "sw": no such variable
    while executing
"spawn telnet $sw"
    (file "/home/local" line 54)

Я просто настраиваю УТМ.А она может только передавать параметры скрипту. Вот как передать я не знаю..

#135316
Munsera написал:
Вот как передать я не знаю..

эх...
вы не знаете не как передать, а как использовать параметр внутри expect скрипта. Правильно? Ответ:

drBatty написал:
spawn telnet [lindex $argv 0] ## where [lindex $argv 0] = $x
#135317

А переменные $1 и $2 не содержат значений передаваемых параметров у тебя?
Это если вызывать так: #/home/local SWITCH_IP 192.168.0.1

#135319
Vascom написал:
А переменные $1 и $2 не содержат значений передаваемых параметров у тебя?

:[

text
 #read the input parameters
 set user [lindex $argv 0]
 set passw [lindex $argv 1]
 set host [lindex $argv 2]
 set location [lindex $argv 3]
 set file1 [lindex $argv 4]
 set file2 [lindex $argv 5]

http://en.wikipedia.org/wiki/Expect

#135320

Если пишу внутри скрипта:
set SWITCH_IP 192.168.0.1
То все работает нормально. Т.е. я присвоил значение переменной SWITCH_IP.
А как присвоить ее при вызове скрипта?
Вот что мне нужно..

А переменные $1 и $2 не содержат значений передаваемых параметров у тебя?

У меня нет таких переменных.

#135321

$1 $2 надо писать в шелле, а в експекте надо писать таки set. А не наоборот. Что непонятно-то?
А лучше поставить ssh, сделать авторизацию по ключу, и не заниматься ерундой.

#135322

А, ну ок, замолкаю и переношу тему в раздел "Программирование".

#135323

drBatty, а можно пример в моем случае? Никак не разберусь...

Главное настроить, а потом конечно же телнет ф топку.

#135325
википедия написал:
Expect унаследовал синтаксис Tcl, который не похож на другие скриптовые языки, такие как bash, csh, и Perl. Приходится постоянно помнить, когда перед переменной должен стоять знак «$», а когда нет. Есть версии Expect доступные для Perl и Python для тех, кто знаком с их синтаксисом.

Другое ограничение состоит в сложности портирования Expect-скриптов между платформами. Например, скрипт Expect, который написан для использования нескольких Unix утилит, может не работать, если будет запущен под Windows. По возможности, программист должен найти приложение, которое имеет интерфейс командной строки, который обеспечивает ту же самую информацию, а это вероятнее всего потребует изменения команды send/expect, которые могут быть главной частью скрипта. Эта проблема не возникает, если Вы используете tcl, perl или python с их posix интерфейсами для получения доступа к файлам (открытие/закрытие) и так далее, а также когда вы используете стандартные posix утилиты (telnet, ftp и т. д.) для удалённого взаимодействия.

Итак, Expect автоматизирует инструменты, которые имеют интерфейс командной строки, но не утилиты, которые имеют графический интерфейс пользователя. В то время как Windows предоставляет множество различных утилит, многие из которых имеют только графический интерфейс и остаются вне зоны применения Expect-а. Графические приложения в Windows могут быть автоматизированы с помощью утилит подобных AutoIt.
[править]
#135326
Munsera написал:
а можно пример в моем случае? Никак не разберусь...

дык я-же привёл:
пишете

text
set SWITCH_IP [lindex $argv 0]

внутри Експектового скрипта, и эта переменная принимает первый параметр.
да, я знаю - идиотизм.

#135327

ТАк писать?

text
[root@localhost ~]# /home/local set SWITCH_IP [lindex $argv 0]

А в скрипте что тогда писать?

#135328
Munsera написал:
ТАк писать?

НЕЕЕТТТ!!!11

text

#!/usr/bin/expect -f

set timeout -1 set SWITCH_IP [lindex $argv 0] spawn telnet $SWITCH_IP match_max 100000 expect -exact "Trying $SWITCH_IP...\r\r Connected to $SWITCH_IP ($SWITCH_IP).\r\r Escape character is '^\]'.\r\r \r \r User Access Verification\r \r Username: " send -- "логин\r" expect -exact "логин\r Password: " send -- "пароль\r" expect -exact "\r \r switch10027#" send -- "conf t\r" expect -exact "conf t\r Enter configuration commands, one per line. End with CNTL/Z.\r switch10027(config)#" send -- "ip acce " expect -exact "\r switch10027(config)#ip access-list " send -- "e " expect -exact "\r switch10027(config)#ip access-list extended " send -- "155\r" expect -exact "155\r switch10027(config-ext-nacl)#" send -- "per " expect -exact "\r switch10027(config-ext-nacl)#permit " send -- "ip g^H" expect -exact "ip g^H ^H" send -- "h " expect -exact "\r switch10027(config-ext-nacl)#permit ip host " send -- "х.х.х.5 a " expect -exact "\r switch10027(config-ext-nacl)#permit ip host х.х.х.5 any " send -- "\r" expect -exact "\r switch10027(config-ext-nacl)#" send -- "exit\r" expect -exact "exit\r switch10027(config)#" send -- "exit\r" expect -exact "exit\r switch10027#" send -- "exit\r" expect eof

#135329

Понятно, спасибо.
А при вызове этого скрипта, как ему передать значение?
Мне нужно чтобы программа вызвала скрипт и передала значение ему. Настраивается это все в командной строке.
[root@localhost ~]# /home/local а дальше что писать?

#135331

ПРосто будет много IP адресов...

#135334

[console]# /home/local 192.168.0.1[/console]
ЗЫЖ зря вы так криво скрипт назвали. могли-бы
/root/script.expect
а то непонятно.

#135335
Munsera написал:
ПРосто будет много IP адресов...

сделайте список list_ip.txt по одному на каждый ip, потом так:

text
#/bin/sh

while read ip do /root/script.expect $ip done <list_ip.txt

#135336

в смысл список должен быть таким:

text
192.168.0.1
231.2.1.43
234.243.1.1
10.0.0.22
#135338

Логика такая:
Программа при определенном событии вызывает скрипт. В програме есть переменная SWITCH_IP, которая принимает значение IP адреса. В базе программы IP адресов много. Но она выбирает один,который подходит под условие.
Вот я написал скрипт, а как сделать так чтобы программа передала значение скрипту незнаю. А сейчас еще больше запутался.

Войдите или зарегистрируйтесь, чтобы ответить.