使用sudo执行2(类似)命令,给出相同的输出

时间:2013-08-19 05:46:30

标签: linux shell sudo

这是我的shell脚本,我正在尝试以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 的内容。它是导致htis的ls之后的空间吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是你的脚本只在--cmd之后接受一个参数。这意味着您的命令中只能包含一个令牌。

我建议您将所有位置参数作为要运行的命令,并使用sudo将其传递给"$@"。为了实现这一目标,您需要避免像现在这样转移所有非选项参数。

例如,您可以这样做:

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

然后,对于脚本的其余部分,将{em> $CMD_OR_SCRIPT的所有实例替换为"$@"(需要双引号)。另外,在运行脚本时不要指定--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