Esperar erro de script - caracteres extras após uma citação aproximada

0

Erro ao executar o comando send if, Não tenho certeza se estou faltando alguma sintaxe tcl.

#!/usr/bin/expect -f
# Get the list of hosts, one per line #####
set f [open "/tmp/host.txt"]
set hosts [read $f]
close $f

# Iterate over the hosts
foreach host $hosts {
spawn ssh $host
expect "password: "
send "abcd@123\r"
expect "$ "
send "if [ 'df -Ph / | grep -vE '^Filesystem' | awk '{ print $5 " " $1 }' |cut -d'%' -f1' -ge 60 ] ;then  echo "Hi Team- Please check root file system space on 'hostname' " | mailx -s "Alert: Almost out of disk space on 'hostname'" [email protected] ;fi\r" 
expect "$ " 
send "exit\r" 
expect eof     }

=== Erro ===

[root@hzavks01~]# extra characters after close-quote
    while executing
"send "if [ 'df -Ph / | grep -vE '^Filesystem' | awk '{ print $5 " " $1 }' |cut -d'%' -f1' -ge 60 ] ;then  echo "Hi Team- Please check root file system..."
    ("foreach" body line 6)
    invoked from within
"foreach host $hosts {
spawn ssh $host
expect "password: "
send "abcd@123\r"
expect "$ "
send "if [ 'df -Ph / | grep -vE '^Filesystem' | awk '{ print $5..."
    (file "./test.sh" line 10)
    
por muku 30.10.2018 / 08:19

1 resposta

1

O TCL é simples . Nesse caso, como mosvy indica nos comentários, use {...} para desativar a interpolação do código de shell complicado. No entanto, o \r para inserir o comando não deve ter escape, e o procedimento send deseja uma única cadeia, portanto, junte a cadeia juntos ou use dois send chamadas:

#!/usr/bin/env expect
catch {exec rm foo}
log_file expect.log
spawn -noecho sh
expect -ex {$ }
send {df | awk '/\//{print $NF}' > foo}
send "\r"
expect -ex {$ }
send -- {exit}
send "\r"
expect eof

Isso pode ser melhorado com um procedimento sendline para a tarefa que impede que o \r atrapalhe o código:

#!/usr/bin/env expect
proc sendline {line} { send -- "$line\r" }
spawn -noecho sh
expect -ex {$ }
sendline {df | awk '/\//{print $NF}' > foo}
expect -ex {$ }
sendline "exit"
expect eof

Se você precisar de interpolação, então o backwhacking será necessário, embora, nesse caso, seja melhor eliminar o código do shell e, em vez disso, chamar um programa diretamente no sistema remoto que execute a tarefa necessária ou produza a saída necessária consumir forma.

    
por 30.10.2018 / 15:36