TCL Expect не записывает в выходной буфер

Я заметил, что мой сценарий TCL / Expect не выполняет запись в буфер вывода.

`#!/usr/bin/expect -f

exp_internal 1; #Debug Expect

set username [lindex $argv 0]; #Takes Outside Argument
set password [lindex $argv 1]; #Takes Outside Argument
set hostFile [open hosts.txt r]; #Reads from a local file


while { [gets $hostFile hostname] >= 0 } {
spawn ssh -q -o StrictHostKeyChecking=no $username@$hostname
expect "password: "

send  "$password\r"
expect "$ "

send "pbrun /bin/su -"
expect {
 "Operations Team.*" {
  puts "NewLine Was Caught After pbrun /bin/su - command"
  #break #Exit While loop, which will exit the server since there is only one While Loop aprund the whole SSH Session
 }
 "Rejected.*" {
  puts "NewLine & Return Carraige Was Caught After pbrun /bin/su - command"
  #break #Exit While loop, which will exit the server since there is only one While Loop aprund the whole SSH Session
 }
 #"^" { ;#This command will work because in the expect only picks up a    "^" character from the [send "pbrun /bin/su -"] command. This is an issues as the pbrun command has more ouput that just a "^", but expect only picks up the "^" character. You can use any other command like "ls", and expect does not write the ls command ouput to the buffer, only a newline character will be written to the buffer. This is an issue as I am unable to grab anything from expect.
 # puts "Newline Character Met"
 #}
}

send "hostname\r"
expect {
 -re {".{8}[0-9]{5}"} {; #Never Works
  puts "BUFFER:$expect_out(buffer):REFFUB"
 }
 "^" {; #Again, this will be met
  puts "Newline Character Met"
 }
}
}`

Любая помощь приветствуется. Я запустил это в режиме отладки и действительно увидел, что в буфер не записываются выходные данные для команды pbrun / bin / su - или hostname , за исключением ^ персонаж.

0
09.02.2017, 04:35
1 ответ

Ваша настоящая проблема: шаблон {". {8} [0-9] {5}"} будет соответствовать строке, содержащей двойные кавычки, за которыми следуют 8 символов, за которыми следуют 5 цифр, за которыми следует двойная кавычка - эти двойные кавычки должны быть в ваш узор? Иногда людей смущает цитирование Tcl, поэтому мой вопрос не предназначен для вынесения каких-либо суждений.

Кроме того, когда у вас есть 2 шаблона в ожидаемом блоке, любой из них может соответствовать первым: ожидаете ли вы, что 8 символов и 5 чисел будут перед первой новой строкой?

Подождите, ^ будет соответствовать началу первой строки. Если вы хотите явно сопоставить новую строку, используйте \ n .


К сожалению, обработка комментариев в Tcl может сбивать с толку. Символ комментария # только запускает комментарий , если видно, куда может идти команда .

Комментарии, которые вы помещаете в свой ожидаемый блок , не комментируют эти строки .

expect {
 "Operations Team.*" {
  puts "NewLine Was Caught After pbrun /bin/su - command"
  #break #Exit While loop, which will exit the server since there is only one While Loop aprund the whole SSH Session
 }
 "Rejected.*" {
  puts "NewLine & Return Carraige Was Caught After pbrun /bin/su - command"
  #break #Exit While loop, which will exit the server since there is only one While Loop aprund the whole SSH Session
 }
 #"^" { ;#This command will work because in the expect only picks up a    "^" character from the [send "pbrun /bin/su -"] command. This is an issues as the pbrun command has more ouput that just a "^", but expect only picks up the "^" character. You can use any other command like "ls", and expect does not write the ls command ouput to the buffer, only a newline character will be written to the buffer. This is an issue as I am unable to grab anything from expect.
 # puts "Newline Character Met"
 #}
}

По сути, вы передаете команде expect список, содержащий пары шаблон и действие . Третий шаблон - это буквально 4 символа # «^» , а третье действие - это строка, содержащая сценарий, содержащий 3 комментария.

1
28.01.2020, 02:46

Теги

Похожие вопросы