expect: obtém o status do erro quando o comando spawn falha

1

O abaixo é o exemplo de um script que executamos diariamente para obter informações do servidor. Nos últimos dois dias, alguns dados do servidor estão ausentes da saída, que é capturada no arquivo local VS-HV-Report_2017.txt .

É possível obter status de erro quando o script é executado, mas não consegue conectar o servidor? De modo que temos uma linha preta ou e status de erro em vez de saída?

#!/usr/bin/expect
set timeout 5
#find /path/to/files -type f -mtime +10 -delete
set date [exec date "+%d-%B-%Y"]

spawn sh -c "yes | cp -ifr .ssh/VS-HV-config .ssh/config"

spawn sh -c "> VS-HV-Report_2017.txt"

#cat ./info.py 
spawn sh -c "ssh L1n \"./info.py | sed 's/total.*//g'\" >> VS-HV-Report_2017.txt"
expect "Enter passphrase for key '/root/.ssh/id_rsa':"
send "passwd\r"

spawn sh -c "ssh L2n \"./info.py | sed 's/total.*//g'\" >> VS-HV-Report_2017.txt"
expect "Enter passphrase for key '/root/.ssh/id_rsa':"
send "passwd\r"

spawn sh -c "ssh L3n \"./info.py | sed 's/total.*//g'\" >> VS-HV-Report_2017.txt"
expect "Enter passphrase for key '/root/.ssh/id_rsa':"
send "passwd\r"
set timeout 5

#spawn sh -c "./format-VS-HV.sh > format-allinement-output.csv"
#spawn sh -c \"./format-VS-HV.sh\" > format-allinement-output.csv
exec ./format-VS-HV.sh > /root/format-allinement-output/format-allinement-output-$date.csv
    
por Shanker 06.07.2017 / 11:38

1 resposta

0

Seu código é uma mistura curiosa de TCL e shell, e provavelmente deve ser escrito em apenas um ou outro. Com o TCL, pode parecer algo como

#!/usr/bin/expect

set timeout 5

# TCL has time functions, no need to call out to 'date'...
set epoch    [clock seconds]
set outfile  "VS-HV-Report_[clock format $epoch -format "%Y"].txt"
set date     [clock format $epoch -format "%d-%B-%Y"]

# "yes | cp -i ..." is very strange; why the interactive flag and then
# in turn ignoring that with the "yes |" pipe from non-interactive code?
#spawn sh -c "yes | cp -ifr .ssh/VS-HV-config .ssh/config"
exec cp -f .ssh/VS-HV-config .ssh/config

# TCL can do I/O, let's use that instead of forking sh processes...
#spawn sh -c "> VS-HV-Report_2017.txt"
set outfh [open $outfile w+]

# and a TCL loop instead of the duplicated spawn-to-host code...
set hostlist {L1n L2n L3n}
foreach host $hostlist {
    set done_auth 0

    # Spawn sh to spawn ssh is mighty complicated; let's instead just
    # call ssh directly (and catch any errors...)
    #spawn sh -c "ssh L1n \"./info.py | sed 's/total.*//g'\" >> VS-HV-Report_2017.txt"
    if { [catch {spawn ssh $host {./info.py | sed 's/total.*//g'}} msg] } {
        puts $outfh "SSHFAIL $host $msg"
        continue
    }

    while 1 {
        expect {
            -re {Enter passphrase for key '[^']+': } {
                # since in loop (because EOF or timeout could happen
                # anywhere) must only auth once in the event the remote
                # side is up to no good
                if {$done_auth == 0} {
                    send "hasapass\r"
                    set done_auth 1
                }
            }
            # remember that set timeout thing? there's a hook for it.
            timeout {
                puts $outfh "TIMEOUT $host $timeout"
                break
            }
            # dump whatever "server data" returned into the output
            # file (match_max might be relevant reading if there's a
            # lot of data) when the connection closes
            eof {
                puts $outfh $expect_out(buffer)
                break
            }
        }
    }
}

close $outfh

exec ./format-VS-HV.sh > /root/format-allinement-output/format-allinement-output-$date.csv
    
por 07.07.2017 / 19:04

Tags