TCL não espera escrever no buffer de saída

0

Eu notei que meu TCL / Expect Script não está gravando no buffer de saída.

'#!/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"
 }
}
}'

Qualquer ajuda é muito apreciada. Eu executei isso no modo de depuração e realmente vi que não há saída sendo gravada no buffer para o comando pbrun /bin/su - ou hostname , exceto o caractere ^ .

    
por chromechris 09.02.2017 / 03:35

1 resposta

1

Seu problema real: o padrão {".{8}[0-9]{5}"} corresponderá a uma sequência contendo aspas duplas seguida por 8 caracteres seguidos por 5 dígitos seguidos por aspas duplas - essas aspas duplas devem estar em seu padrão? Às vezes as pessoas ficam confusas com a citação de Tcl, então minha pergunta não é para levar qualquer julgamento com ela.

Além disso, quando você tem 2 padrões em um bloco de expectativa, qualquer um pode corresponder primeiro: você espera que os 8 caracteres e 5 números sejam vistos antes da primeira nova linha?

Espere, ^ coincidirá no início da primeira linha. Se você quiser corresponder explicitamente uma nova linha, use \n .

Infelizmente, o tratamento de comentários do Tcl pode ser confuso. O caractere de comentário # somente inicia um comentário se for visto onde um comando pode ir .

Os comentários que você coloca dentro do bloco de espera não comentam essas linhas .

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"
 #}
}

Você está essencialmente passando para o comando expect uma lista contendo pattern e action pares. O terceiro padrão é literalmente os 4 caracteres #"^" e a terceira ação é uma string contendo um script que contém 3 comentários.

    
por 09.02.2017 / 16:31