bashスクリプト検証パラメータ

bashスクリプト検証パラメータ

ホストにログインし、指示に従ってコマンドを実行したい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としてランダムなコマンドを実行します。

おすすめ記事