내 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
^
답변1
실제 질문: 이 패턴은 {".{8}[0-9]{5}"}
큰따옴표, 8자, 5자리, 큰따옴표가 포함된 문자열과 일치합니다. 이러한 큰따옴표가 패턴에 있어야 합니까? 때때로 사람들은 Tcl 참조에 대해 혼란스러워하므로 내 질문에는 어떤 판단도 필요하지 않습니다.
또한 Expect 블록에 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개의 주석이 포함된 스크립트가 포함된 문자열입니다.pattern
action
#"^"
답변2
기본적으로 pbrun은 터미널 세션에서 실행됩니다. 저는 TCL 전문가는 아니지만 쉘 스크립트를 통해 pbrun을 실행할 때 pbun의 출력을 처리할 때 pbrun이 파이프 모드에서 실행되어야 하는 경우가 있습니다.
"pbrun -p <command> | /usr/local/bin/db_check.sh"
또한 pbrun 명령 전송을 처리할 때 -n(널 입력)을 사용하고 싶을 수도 있으며, stdin을 통한 입력은 없지만 pbrun을 호출하는 스크립트가 깨끗하지 않기 때문에 pbrun은 어떻게든 버퍼링된 데이터를 일부 얻게 됩니다.
-n, --null_input
Redirects the standard input of pbrun to /dev/null. You some‐
times need this option to avoid interactions between pbrun and
the shell that invokes it. For example, if you are running
pbrun and start a pbrun in the background without redirecting
its input away from the terminal, it will block even if no reads
are posted by the remote command. This option corrects this
situation.
-p, --pipe_mode
Pipe mode. Forces the secured task to behave as if it is run in
a pipeline rather than a terminal session. This option also
suppresses utmp entries, so that the session will not be
recorded as a login on the runhost.
마지막 항목인 "Rejected" 메시지는 stdout이 아닌 stderr로 반환됩니다.