Expect + Buffer не совпадает - PullRequest
       9

Expect + Buffer не совпадает

0 голосов
/ 26 сентября 2018

При выполнении приведенного ниже кода он не выполняется в соответствии с первым пунктом, в который я отправляю команду df -h.В то время как второе предложение, которое является условием сброса пароля, работает нормально.

#!/usr/bin/expect
set ip [lindex $argv 0]
spawn ssh  anshm@$ip
set timeout 10
match_max 40000
exp_internal -f debug_info.log 0
expect "*word"
send "5t6y%T^Y\n"
expect {
    "localhost*$" {
        send "df -h\r"
        expect eof
    }
    "(curr*assword:" {
        send "5t6y%T^Y\r"
        expect "*word"
        send "7u8i&U*I\r"
        expect "*word"
        send "7u8i&U*I\r"
        expect eof
    }
}

Отладочная информация ниже:

1034h[anshm@localhost ~]$ " (spawn_id exp4) match glob pattern "localhost*$"? no
"(curr*assword:"? no
expect: timed out

Если вы видите последнюю строку, то этот "localhost * $" появляется вбуфер по-прежнему показывает соответствие NO, а затем время ожидания.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

@ meuh верно: даже в шаблоне глобуса трейлинг $ равен , а не буквальному символу.

$ expect -d <<'END_EXPECT'
spawn sh -c {echo first; echo second localhost other info '$dollar sign '; echo third}
expect "second"
expect {
    {localhost*$}  {puts "found 1: >>$expect_out(0,string)<<"}
    {localhost*$*} {puts "found 2: >>$expect_out(0,string)<<"}
}
END_EXPECT
expect version 5.45
argv[0] = expect  argv[1] = -d
set argc 0
set argv0 "expect"
set argv ""
executing commands from command file
spawn sh -c echo first; echo second localhost other info '$dollar sign '; echo third
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {2595}

expect: does "" (spawn_id exp4) match glob pattern "second"? no
first
second localhost other info $dollar sign
third

expect: does "first\r\nsecond localhost other info $dollar sign \r\nthird\r\n" (spawn_id exp4) match glob pattern "second"? yes
expect: set expect_out(0,string) "second"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "first\r\nsecond"

expect: does " localhost other info $dollar sign \r\nthird\r\n" (spawn_id exp4) match glob pattern "localhost*$"? no
"localhost*$*"? yes
expect: set expect_out(0,string) "localhost other info $dollar sign \r\nthird\r\n"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " localhost other info $dollar sign \r\nthird\r\n"
found 2: >>localhost other info $dollar sign
third
<<

Iрекомендую использовать шаблон регулярных выражений вместо добавления * в конец шаблона глобуса:

expect -re {localhost.*\$} {...}
0 голосов
/ 28 сентября 2018

Спасибо, ребята, за ваши ценные ответы.Но я сделал некоторую отладку и обнаружил, что ожидаю не рассматривать его как символ, поэтому я использовал только localhost, и проблема решена.Но если у кого-то есть идея назначить ожидаемый o / p в переменной и использовать его для выражения условия, например: If {$ variable

Любые ценные предложения приветствуются заранее.

0 голосов
/ 27 сентября 2018

Вы, похоже, страдаете ошибкой / особенностью expect сопоставления с шаблоном глобуса.

Почему ввод "...nshm@localhost ~]$ " не соответствует шаблону глобуса "localhost*$"?Когда символ $ является последним символом в шаблоне glob, это означает конец строки ввода , поэтому в принципе * должен совпадать абсолютно с любым значением, следующим за localhost,Однако по какой-то причине *$ в конце шаблона не работает таким образом, хотя, например, x$ действительно соответствует только x в конце ввода.

Однако,Вы действительно хотели соответствовать буквальному символу $.Для этого используйте \\$.Таким образом, ваш шаблон шарика должен быть

"localhost*\\$"
...