1

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

#!/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

2

Munsera пишет:

#/home/local set SWITCH_IP 192.168.0.1

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

 Консоль:
export SWITCH_IP=192.168.1.1

во вторых:
http://www.unix.com/shell-programming-s … cript.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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

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

export SWITCH_IP=192.168.1.1

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

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)

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

4

Munsera пишет:

Вот как передать я не знаю..

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

drBatty пишет:

spawn telnet [lindex $argv 0] ## where [lindex $argv 0] = $x

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5

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

6

Vascom пишет:

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

ah

 #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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7

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

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

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

8

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

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

10

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

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

11

википедия пишет:

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.
[править]

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

12

Munsera пишет:

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

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

set SWITCH_IP [lindex $argv 0]

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

13

ТАк писать?

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

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

14

Munsera пишет:

ТАк писать?

НЕЕЕТТТ!!!11

#!/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
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15

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

16

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

17

 Консоль:
# /home/local 192.168.0.1

ЗЫЖ зря вы так криво скрипт назвали. могли-бы
/root/script.expect
а то непонятно.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

18

Munsera пишет:

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

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

#/bin/sh

while read ip
do
 /root/script.expect $ip
done <list_ip.txt
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

19

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

192.168.0.1
231.2.1.43
234.243.1.1
10.0.0.22
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

20

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

21

Все понял!
СПАСИБО БОЛЬШОЕ!!!!!

22

Просто написал

nano /home/local SWITCH_IP 

В программе. И все заработало! Значение передалось!))
Большое спасибо за помощь!!!

23

А можно еще вопрос:
Как сделать так, чтобы expect понимал "*". Т.е. мне нужно:

switch10027(config)#"
send -- "ip acce        "
expect -exact "\r
switch10027(config)#ip access-list "
send -- "e 

А вот так:

*(config)#"
send -- "ip acce        "
expect -exact "\r
*(config)#ip access-list "
send -- "e 

Для того чтобы сделать скрипт универсальным.

24

Munsera пишет:

Как сделать так, чтобы expect понимал "*". Т.е. мне нужно:

вы знает,.. Не помню. Как-то можно, но не нужно. expect я только в крайнем случае юзаю - если надо что-то передать интерактивной программе. В самом крайнем случае, я меняю сам скрипт. Например, как я понимаю, вам нужно сменить switch10027 скажем на switch10028?
ок, пишем

sed -i "s/switch10027/switch10028/g" script.expect

а ещё лучше будет сделать так:

 Консоль:
sed "s/#SWITCH#/$SWITCH/g" script.tpl >script.expect

тут $SWITCH это переменная шелла, с нужным параметром, а script.tpl это шаблон, в котором вместо параметра написано #SWITCH#
т.е. по шаблону мы генерируем нужные скрипты на данный случай. ибо в самом экспекте программировать невозможно - кажется, что его специально запутывали. ac

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

25

Сделал подругому. Правда геморно, но зато все видно и на лицо)))

set sw [lindex $argv 0]
set witch10027 192,168,0,2
set witch10026 192,168,0,5


if {$sw==$witch10027} {set nom switch10027}




$nom#"
send -- "conf t\r"
expect -exact "conf t\r
Enter configuration commands, one per line.  End with CNTL/Z.\r
$nom(config)#"

26

Единственная проблема:
$nom(config)#"
понимает как массив. Как можно переменную вставить в середину слова???

27

Столкнулся со схожей проблемой, пока не могу найти решение
http://www.opennet.ru/openforum/vsluhfo … 447.html#3
суть такова, в теле expect скрипта вызываю любую команду shell, результат который возвращает команда shell нужно присвоить переменной в скрипте expect.

28

Здравствуйте, коллеги!
А expect умеет "выдергивать" из переменной символы?
Допустим есть скрипт, которому передаю значение переменной

# /home/local 192.168.0.1
#!/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

Можно ли сделать так, чтобы при "длинне" переменной выше 11 символов, скрипт "Обрезал" ее до 11.

Допустим мы передаем 

# /home/local 192.168.0.19875

Скрипт проверяет переменную и обрезфет ее до 192.168.0.1.

Спасибо.