我在 bash 脚本中有以下内容,我想登录到主机并按照指示执行命令:
#!/bin/bash
echo $1;
if [ -n ${2+x} ] ; then
if [ $2 != "log" -a $2 != "cat" ] ; then
echo "$0 $1 : second argument must be empty, "tail" or "cat""
exit 1
fi
elif [ -z ${2+x} ] ; then
ssh -o StrictHostKeyChecking=no -p 2222 root@$1; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1; echo "Reconnect?"; done
elif [ $2 == "tail" ] ; then
ssh -o StrictHostKeyChecking=no -p 2222 root@$1 tail -f /var/log/dp.log; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1 tail -f /var/log/dp.log; echo "Reconnect?"; done
elif [ $2 == "cat" ] ; then
ssh -o StrictHostKeyChecking=no -p 2222 root@$1 cat /var/log/dp.log; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1 cat /var/log/dp.log; echo "Reconnect?"; done
fi
事实证明,如果我不提供 2 美元,它仍然会抱怨line 4: [: too many arguments
这是为什么,我想知道?
答案1
就我个人而言,我认为反复询问“重新连接?”的整个想法是一种令人厌恶的行为,充其量只是毫无意义地复制 shell 的命令历史记录,而且更糟糕。说真的,如果你想再跑一次,只跑ssh root@remotehost tail -f /var/log/dp.log
然后击球有多难?Up-ArrowEnter或者,如果您甚至不想键入整个命令,则只需编写几个 shell 函数或小脚本(请参阅下面的示例)。
也就是说,这是一种更好的方法来完成您想要做的事情:
#!/bin/bash
error() {
local ec msg
ec="$1" ; shift
msg="$*"
[ -n "$msg" ] && echo "$msg" >&2
[ "$ec" != 0 ] && exit "$ec"
}
[ -z "$1" ] && error 1 "first argument missing. must be hostname"
echo "$1"
myssh() {
local remote reconnect quit
remote="$1" ; shift
quit=0
while [ $quit != 1 ] ; do
ssh -o StrictHostKeyChecking=no -p 2222 "$remote" "$@"
read -p "Reconnect (Y/n) [Y]? " reconnect
[[ $reconnect =~ ^[Nn] ]] && quit=1
done
}
case "$2" in
cat|log) myssh "root@$1" cat /var/log/dp.log ;;
tail) myssh "root@$1" tail -f /var/log/dp.log ;;
"") myssh "root@$1" ;;
*) error 1 "Unknown second argument '$2'" ;;
esac
这是一种更好的方法。
将 ~/bin 添加到您的 $PATH 中,然后创建以下脚本(不要忘记使用 使它们可执行chmod +x
)
〜/ bin / myssh.sh:
#!/bin/sh
[ -z "$1" ] && echo hostname is required && exit 1
remote="$1" ; shift
ssh -o StrictHostKeyChecking=no -p 2222 "root@$remote" "$@"
〜/bin/remote-cat.sh:
#!/bin/sh
myssh.sh "$1" cat /var/log/dp.log
〜/bin/remote-tail.sh:
#!/bin/sh
myssh.sh "$1" tail -f /var/log/dp.log
根据需要运行它们。使用 shell 的命令历史记录可以根据需要多次运行它们。
myssh.sh
两者均可用于在远程主机上获取 root 登录 shell和(如其他两个脚本所示)以 root 身份在远程主机上运行任何任意命令。
答案2
如果在这两种情况以及后面的情况下都屏蔽 $2,就可以防止 $2 在空时什么都没有。
#!/bin/bash
echo $1;
if [ -n ${2+x} ] ; then
if [ "$2" != "log" -a "$2" != "cat" ] ; then
echo "$0 $1 : second argument must be empty, "tail" or "cat""
exit 1
fi
(使用德语语言环境):
> echo $([ != "log" -a != "cat" ])
> bash: [: Zu viele Argumente.
比较:
> echo $([ "" != "log" -a "" != "cat" ])
>
第二个问题可能是,您首先检查日志和 cat,但告诉用户,您正在检查尾巴和猫。