esperar: obtener estado de error cuando falla el comando de generación

esperar: obtener estado de error cuando falla el comando de generación

El siguiente es un ejemplo de un script que ejecutamos diariamente para obtener información del servidor. Durante los últimos días, faltan algunos datos del servidor en la salida capturada en el archivo local VS-HV-Report_2017.txt.

¿Es posible obtener un estado de error cuando se ejecuta el script, pero no se puede conectar el servidor? ¿Para que tengamos una línea negra o un estado de error en lugar de salida?

#!/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

Respuesta1

Su código es una curiosa mezcla de TCL y shell, y probablemente debería escribirse sólo en uno u otro. Con TCL, podría verse así

#!/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

información relacionada