Ожидайте в bash-скрипте: ожидаем, что не выводится буфер - PullRequest
3 голосов
/ 08 апреля 2011

Я пытаюсь перехватить вывод команды "dir", войдя в коммутатор, но я не могу этого сделать. Я использую ожидание в Баш. Я использую wait_out для захвата вывода этой команды в буфер и распечатать его. На самом деле я хочу захватить вывод и выполнить некоторые операции над ним.
SCript:

#!/bin/bash  
expect -c "  
spawn telnet 1.1.1.1 2000  
sleep 1  
send \"\r\"  
send \"\r\"  
expect {  
Prompt> { send \"dir\r\"  }  
}  
set output $expect_out(buffer)  
"    
echo "$output"  

Выход:

spawn telnet 1.1.1.1 2000  
Trying 1.1.1.1...  
Connected to 1.1.1.1 (1.1.1.1).  
Escape character is '^]'.  




Prompt>  

Prompt>  

После отображения этих подсказок сценарии просто завершаются. Пожалуйста, помогите.

EDIT:

Теперь я разделил его, чтобы использовать подстановку параметров и одинарные кавычки. Теперь я сталкиваюсь с другой ошибкой.

Сценарий:

expect -c "
spawn telnet $IP $PORT1
sleep 1
send \"\r\"
send \"\r\"
"
expect -c '
expect {
Prompt> { send \"dir\r\" }
set output $expect_out(buffer)
puts "$output"
}
'

Выход:

spawn telnet 172.23.149.139 2033
can't read "expect_out(buffer)": no such variable
while executing
"expect {
Prompt> { send \"dir\r\" }
set output $expect_out(buffer)
puts "$output"
}
"

РЕДАКТИРОВАТЬ 2: Привет Крис / все,

Я изменил его в соответствии с вашими предложениями. Но я все еще сталкиваюсь с ошибками.

Сценарий:

output=$(expect -c '  
spawn telnet '"$IP $PORT1"'  
sleep 1  
send '"\r"'  
send '"\r"'  

expect Prompt> { send '"dir\r"'  }  
expect '"\n"'  
expect -indices Prompt>  
puts '"[string range $expect_out(buffer) 0 [expr $expect_out(0,end) - 1]]"'  

')  

echo "======="  
echo "$output"  
echo "======="  

Вывод:

syntax error in expression "(0,end) - 1"  
    while executing  
"expr (0,end) - 1"  
    invoked from within  
"string range (buffer) 0 [expr (0,end) - 1]"  
    invoked from within    
"puts [string range (buffer) 0 [expr (0,end) - 1]]"  

=======
spawn telnet 1.1.1.1 2000
Trying 1.1.1.1...
Connected to 1.1.1.1 (1.1.1.1).
Escape character is '^]'.




Prompt>

Prompt>

=======

Следовательно, чтобы обойти ошибку, я изменил строку

puts '"[string range $expect_out(buffer) 0 [expr $expect_out(0,end) - 1]]"'

до

puts '"$expect_out(buffer)"'

Но тогда я не получаю ошибки, но вывод dir также не печатается. Что-то вроде:

Prompt>

Prompt> (buffer)

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

Вторая из ваших «сплит» программ Expect не имеет доступа к порожденному процессу telnet .Когда вы разделяете их таким образом, вы делаете их независимыми (один не может получить доступ к переменным или состоянию другого; фактически к тому времени, когда второй запустил первый, и его telnet процесс больше не работаетсуществовать).


Оболочка автоматически объединит все строки (которые не разделены пробелами без кавычек / без экранирования) независимо от вида кавычек (если они есть), которые они используют.Это означает, что вы можете начать помещать первую часть вашей программы Expect в одинарные кавычки, переключаться на двойные кавычки для подстановки параметров, а затем возвращаться к одинарным кавычкам для остальной части программы (чтобы избежать экранирования любого из "$\`которые встречаются в вашем коде Expect).

expect -c '
spawn telnet '"$HOST $PORT"'
sleep 1
⋮ (rest of Expect program)
'

Он использует одинарные кавычки для защиты большей части программы, но переключается обратно на двойные кавычки, чтобы позволить оболочке подставить свои параметры HOST и IP в текстПрограмма Expect.


Затем оболочка, которая запустилась Ожидает , не может получить доступ к переменной, установленной внутри программы Expect.Обычный способ сбора выходных данных дочернего процесса состоит в том, чтобы он записывал в stdout или stderr, а оболочка собирала выходные данные с помощью подстановки команд ($()).

В Tcl (и Expect) выможно использовать puts для отправки строки на стандартный вывод.Но по умолчанию Expect также отправляет на стандартный вывод «взаимодействия» (что он получает от любых порожденных команд и что он отправляет им; т.е. что вы увидите, если будете запускать порожденную команду вручную).Вы можете отключить ведение журнала по умолчанию с помощью log_user 0.

Вы можете написать свою программу следующим образом:

#!/bin/sh
output=$(expect -c '
# suppress the display of the process interaction
log_user 0

spawn telnet '"$HOST $PORT"'
sleep 1
send "\r"
send "\r"
# after a prompt, send the interesting command
expect Prompt> { send "dir\r"  }
# eat the \n the remote end sent after we sent our \r
expect "\n"
# wait for the next prompt, saving its position in expect_out(buffer)
expect -indices Prompt>

# output what came after the command and before the next prompt
# (i.e. the output of the "dir" command)
puts [string range $expect_out(buffer) \
                   0 [expr $expect_out(0,start) - 1]]
')
echo "======="
echo "$output"
echo "======="
0 голосов
/ 08 апреля 2011

Поскольку ожидаемый скрипт заключен в двойные кавычки, оболочка расширяется $expect_out до пустой строки.Поместите тело сценария ожидаемого в одинарные кавычки.

Когда вы устанавливаете переменную в ожидаемом, оболочка не будет знать.Когда ожидаемый скрипт завершается, его переменные тоже исчезают.Вы должны puts ожидать_ буфера.

...