gpt4 book ai didi

bash - bash/expect 脚本中的错误处理

转载 作者:行者123 更新时间:2023-11-29 09:11:32 24 4
gpt4 key购买 nike

下面粘贴了一个 bash 脚本,结合了 expect 代码,其中:

  • 通过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."

最佳答案

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)

如果提供的密码无效,此脚本将退出并打印消息“密码错误”。

有关更高级的用法,请查看手册页。那里有一些示例和许多其他选项。

关于bash - bash/expect 脚本中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6812232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com