5 Stimmen

Fehlerbehandlung im bash/expect-Skript

Unten eingefügt ist ein Bash-Skript, kombiniert mit expect-Code, der:

  • verbindet sich mit dem entfernten Host über ssh, sammelt Dateien und bereitet eine tgz-Datei vor;
  • tgz-Datei vom entfernten Rechner auf den lokalen Rechner kopieren;
  • verbindet sich erneut über ssh mit dem entfernten Host und entfernt die zuvor erstellte tgz-Datei;
  • Entpacken Sie schließlich die tgz-Datei auf dem lokalen Rechner.

Alles funktioniert, wenn die übergebenen Argumente gültig sind (d.h., $host , $user そして $pass ). Wenn einer von ihnen falsch ist, bleibt das Skript hängen. Ich frage mich, wie man eine Fehlerbehandlung einbauen kann (z.B. in $cmd1), um das Skript mit einer Meldung zu beenden, wenn der Benutzername (oder das Passwort) falsch ist?

Vielen Dank im Voraus für alle Hinweise.

#!/bin/bash
prog=$(basename $0)
NO_ARGS=0 
E_OPTERROR=85

# Script invoked with no command-line args?
if [ $# -eq "$NO_ARGS" ]; then
  echo "Usage: $prog [-h host] [-u username] [-p password]"
  echo "       $prog -help for help."
  exit $E_OPTERROR
fi

showhelp() {
  echo "Usage: $prog [-h host] [-u username] [-p password]"
  echo " -h: host"
  echo " -u: username"
  echo " -p: password"
  echo " -help: this help message"
  exit 2
}

user=""
host=""
pass=""
now=$(date +"%m-%d-%Y")
dir="data_$now"
file="data.tgz"

while getopts "h:u:p:help" name; do
  case $name in
    h)
      host=$OPTARG
    ;;
    u)
      user=$OPTARG
    ;;
    p)
      pass=$OPTARG
    ;;
    help)
      showhelp $0
    ;;
  esac
done

if [ -d "$dir" ]; then
  rm -R $dir
  mkdir $dir
else
  mkdir $dir
fi

cmd1=$(expect << EOF
spawn ssh $user@$host
expect "password: "
send "$pass\n"
expect "$ "
send "cd /tmp\n"
expect "$ "
send "tar -czf $file \`find . -maxdepth 1 -name 'f2p_*' -print\`\n"
expect "$ "
send "logout"
EOF)

cmd2=$(expect << EOF
spawn scp $user@$host:/tmp/$file $dir
expect "password: "
send "$pass\n"
expect "$ "
EOF)

CMD3=$(expect << EOF
spawn ssh $user@$host
expect "password: "
send "$pass\n"
expect "$ "
send "cd /tmp\n"
expect "$ "
send "rm $file\n"
expect "$ "
send "logout"
EOF)

echo "$cmd1"
echo "$cmd2"
echo "$cmd3"
cd $dir
tar -xzf $file
rm $file
count=$(ls -1 | wc -l | awk '{gsub(/^ +| +$/, "")}1')
cd ..
#clear
echo "All done. Extracted $count *.net files."

5voto

nmat Punkte 7262

En expect Befehl kann je nach Antwort unterschiedliche Aktionen ausführen.

Sie könnten zum Beispiel $cmd1 wie folgt definieren:

cmd1=$(expect << EOF
spawn ssh $user@$host
expect "password: "
send "$pass\n"
expect {
{
  "Permission denied, please try again." {
       send_user "Wrong password"
       exit
   }
  "$ " {
       send "cd /tmp\n"
       expect "$ "
       send "tar -czf $file \`find . -maxdepth 1 -name 'f2p_*' -print\`\n"
       expect "$ "
       send "logout"
   }
}
EOF)

Wenn das angegebene Passwort nicht funktioniert, wird das Skript beendet und die Meldung "Falsches Passwort" ausgegeben.

Für eine fortgeschrittene Verwendung werfen Sie bitte einen Blick in die Manpage. Dort gibt es einige Beispiele und viele andere Optionen.

3voto

CanBuyukburc Punkte 31
expect {
{
  "Permission denied, please try again." {
       send_user "Wrong password"
       }
  "$ " {
       send "cd /tmp\n"
       expect "$ "
       send "tar -czf $file \`find . -maxdepth 1 -name 'f2p_*' -print\`\n"
       expect "$ "
       send "logout"
   }

Wenn wir hier den Befehl exit entfernen, sollte expect "Wrong password" ausgeben und dann den nächsten Teil mit "cd /tmp" ausführen \n "....... ist das richtig?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X