Как EXPECT может интерпретировать экранированный символ в командный символ - PullRequest
1 голос
/ 24 ноября 2010

Я хотел бы быть в состоянии передать длинную команду, чтобы ожидать.Это как-то множественная команда.Сначала вот мой ожидаемый сценарий


#!/usr/bin/expect -f
set timeout -1
spawn telnet xxx.xxx.xxx.xxx
expect "*?username:*"
send "someusername\r"
expect "*?assword:*"
send "somepassword\r"
# Here's the command I'd like to pass from the command prompt
set command [lindex $argv 0]
send "$command\r"
send "exit\r"

Затем я запустил бы этот сценарий так:

./expectscript "mkdir /usr/local/dir1\ncd /usr/local/dir1\ntouch testfile"

Обратите внимание, что я поставил "\ n", чтобы инициировать ввод, как будтоОбрабатываю команду перед переходом к следующему.

Я знаю, что вы можете разделить команды с помощью ";", но для этого конкретного упражнения я бы хотел иметь возможность интерпретировать "\ n"с "\ r", так что ожидаемый будет вести себя так, как если бы это было так:

send "mkdir /usr/local/dir1\r"
send "cd /usr/local/dir1\r"
send "touch testfile\r"

Тогда возникает вопрос: как можно ожидать, что интерпретация "\ n" будет "\ r"?Я попытался поставить "\ r" в аргументе вместо "\ n", но это не сработало.

Спасибо за ввод.

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

Когда я делаю простой эксперимент, я обнаруживаю, что \n в аргументе не конвертируется моей оболочкой (bash) в новую строку;это остается буквальным.Вы можете убедиться в этом сами, просто набрав puts для вывода аргумента командной строки, например:

puts [lindex $argv 0]

Чтобы обойти это, нужно немного поработать, чтобы разбить вещи.Увы, команда Tcl split делает не разбиение по многосимвольным последовательностям (вместо этого она разделяется на много разных символов одновременно), поэтому нам потребуется другой подход.Однако у Tcllib есть именно то, что нам нужно: команда splitx.После этого мы сделаем это (основываясь на ответе @ tenaix2j):

#!/usr/bin/expect -f
package require Expect;            # Good practice to put this explicitly
package require textutil::split;   # Part of Tcllib

# ... add your stuff here ...
foreach line [textutil::split::splitx [lindex $argv 0] {\\n}] {
    send "$line\r"
    # Wait for response and/or prompt?
}
# ... add your stuff here ...

Если у вас не установлен и не настроен Tcllib для использования с Expect, вы также можете напрямую перехватить код для splitxкода (найдите его в Интернете здесь ), если вы внутренне признаете лицензию, на которую он распространяется (стандартные правила лицензирования Tcl).

0 голосов
/ 24 ноября 2010
foreach cmd [ split $command \n ] {
send "$cmd\r\n"
}
...