Обработка ошибок в скрипте bash / Ожидается - PullRequest
4 голосов
/ 25 июля 2011

Ниже приведен скрипт bash в сочетании с ожидаемым кодом, который:

  • подключается к удаленному хосту через ssh, собирает файлы и подготавливает файл tgz;
  • копировать файл tgz с удаленного хоста на локальный компьютер;
  • снова подключается к удаленному хосту через ssh и удаляет ранее созданный файл tgz;
  • наконец, распакуйте файл tgz на локальный компьютер.

Все работает, если переданные аргументы верны (то есть $host, $user и $pass). Если один из них неверен, скрипт зависает. Интересно, как включить обработку ошибок (например, в $ cmd1) для завершения сценария с сообщением, если имя пользователя (или пароль) неверно?

Заранее спасибо за любые указатели.

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

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

Команда expect может выполнять различные действия на основе разных ответов.

Например, вы можете определить $ cmd1 следующим образом:

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)

Если указанный пароль неДля работы, этот скрипт завершит работу и напечатает сообщение «Неверный пароль».

Для более продвинутого использования, пожалуйста, посмотрите на страницу руководства.Там есть несколько примеров и много других вариантов.

2 голосов
/ 07 декабря 2017
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"
   }

Здесь, когда мы удаляем команду exit, ожидайте, что выведите «Wrong password», а затем выполните следующую часть, отправив «cd / tmp \ n» ....... это правильно чем?

...