ホストにログインし、指示に従ってコマンドを実行したい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
個人的に「Reconnect?」を繰り返し求める全体的なアイデアは面倒なことであり、せいぜいシェルのコマンド履歴を無意味に複製する役割を果たすと思います。真剣に、再び走りたいのなら、ssh root@remotehost tail -f /var/log/dp.log
ただ走って賭けるのはどれほど難しいのでしょうか?Up-ArrowEnterあるいは、コマンド全体を入力したくない場合は、いくつかのシェル関数または小さなスクリプトを書くだけです(下記の例を参照)。
つまり、目的のタスクを実行するより良い方法は次のとおりです。
#!/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
これがより良い方法です。
chmod +x
$PATH に ~/bin を追加し、次のスクリプトを生成します (次を使用して実行可能にすることを忘れないでください)。
~/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
必要に応じて実行してください。シェルのコマンド履歴を使用して、必要な回数だけ実行します。
myssh.sh
どちらもリモートホストからルートログインシェルを取得するために使用できます。そして(他の2つのスクリプトに示すように)リモートホストから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" ])
>
2番目の問題は、まず確認することです。丸太そしてcatを使用しますが、ユーザーに確認していることを伝えます。尾そして猫。