Я заметил, что мой сценарий 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
, за исключением ^
персонаж.
Ваша настоящая проблема: шаблон {". {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 комментария.