TCL은 출력 버퍼에 쓸 것으로 예상되지 않습니다.

TCL은 출력 버퍼에 쓸 것으로 예상되지 않습니다.

내 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개의 주석이 포함된 스크립트가 포함된 문자열입니다.patternaction#"^"

답변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로 반환됩니다.

관련 정보