
Unten sehen Sie ein Beispiel für ein Skript, das wir täglich ausführen, um Informationen vom Server abzurufen. In den letzten Tagen fehlten in der Ausgabe, die in der lokalen Datei erfasst wurde, einige Serverdaten VS-HV-Report_2017.txt
.
Ist es möglich, einen Fehlerstatus zu erhalten, wenn das Skript ausgeführt wird, aber keine Verbindung zum Server herstellen kann? So dass wir statt der Ausgabe eine schwarze Linie oder einen Fehlerstatus erhalten?
#!/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
Antwort1
Ihr Code ist eine merkwürdige Mischung aus TCL und Shell und sollte wahrscheinlich nur in einem der beiden geschrieben werden. Mit TCL könnte er ungefähr so aussehen:
#!/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