0

コマンドを実行しようとしているシェルスクリプトは次のとおりですsudo

#! /bin/sh

# Initialize values of arguments
SUDO_USER=""
SUDO_PWD=""
CMD_OR_SCRIPT=""

if ! options=$(getopt -u -o : -l sudoUser:,sudoPwd:,cmd: -- $@)
then
    echo "Wrong option given :: $1"
    exit 1
fi

set -- $options

while [ $# -gt 0 ]
do
    case $1 in
        --sudoUser)
                SUDO_USER="$2"
                shift
                ;;

        --sudoPwd)
                SUDO_PWD="$2"
                shift
                ;;

        --cmd)
                CMD_OR_SCRIPT="$2"
                shift
                ;;

    esac
    shift
done

if [ "$CMD_OR_SCRIPT" != "" ]; then
    if [ "$SUDO_USER" != "" ]; then
        if [ "$SUDO_PWD" != "" ]; then
            echo $SUDO_PWD | sudo -k -S -u $SUDO_USER $CMD_OR_SCRIPT
        else
            sudo -u $SUDO_USER -k -S $CMD_OR_SCRIPT
        fi
    else
        if [ "$SUDO_PWD" != "" ]; then
            echo $SUDO_PWD | sudo -k -S $CMD_OR_SCRIPT
        else
            sudo $CMD_OR_SCRIPT
        fi
    fi
fi

コマンドを次のように実行すると-

./execSudoScript.sh --sudoUser root --sudoPwd pass --cmd ls

期待どおり、現在のディレクトリの内容を出力として取得します。しかし、コマンドを次のように実行すると-

./execSudoScript.sh --sudoUser root --sudoPwd pass --cmd ls /opt

の内容を取得する代わりに、現在のディレクトリの内容を取得し/optます。その後のスペースlsがhtisの原因ですか?これを修正するにはどうすればよいですか?

4

1 に答える 1

1

問題は、スクリプトが の後に引数を 1 つしか受け付けないこと--cmdです。つまり、コマンドに含めることができるトークンは 1 つだけです。

sudo実行するコマンドとしてすべての位置引数を取り、それをusingに渡すことをお勧めします"$@"。それが機能するには、現在行っているように、オプション以外の引数をすべてシフトオフすることを避ける必要があります。

たとえば、次のようにします。

while [ "$#" -gt 0 ]; do
    case "$1" in
    --sudoUser)
        SUDO_USER="$2"
        shift 2;;
    --sudoPwd)
        SUDO_PWD="$2"
        shift 2;;
    *)
        break;;
    esac
done

次に、スクリプトの残りの部分で、 のすべてのインスタンスを$CMD_OR_SCRIPTwithに置き換えます"$@"(二重引用符が必要です)。--cmdまた、スクリプトの実行時に指定しないでください。したがって、サンプルの使用法では、次を使用する必要があります。

./execSudoScript.sh --sudoUser root --sudoPwd pass ls /opt

OPのリクエストにより、スクリプト全体の編集バージョンを次に示します。

#!/bin/sh

# Initialize values of arguments
SUDO_USER=""
SUDO_PWD=""

while [ "$#" -gt 0 ]; do
  case "$1" in
  --sudoUser)
    SUDO_USER="$2"
    shift 2;;
  --sudoPwd)
    SUDO_PWD="$2"
    shift 2;;
  *)
    break;;
  esac
done

if [ -n "$SUDO_USER" ]; then
  if [ -n "$SUDO_PWD" ]; then
    echo "$SUDO_PWD" | sudo -k -S -u "$SUDO_USER" "$@"
  else
    sudo -u "$SUDO_USER" "$@"
  fi
else
  if [ -n "$SUDO_PWD" ]; then
    echo "$SUDO_PWD" | sudo -k -S "$@"
  else
    sudo "$@"
  fi
fi
于 2013-08-19T05:49:35.280 に答える