这是我的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
的内容。是ls
后的空间导致了htis吗?我该怎么解决? 最佳答案
问题是脚本只接受--cmd
之后的一个参数。这意味着您的命令只能包含一个令牌。
我建议您将所有位置参数作为要运行的命令,并使用sudo
将其传递给"$@"
。要想成功,你需要避免像现在这样转移掉所有非选项的参数。
例如,您可以这样做:
while [ "$#" -gt 0 ]; do
case "$1" in
--sudoUser)
SUDO_USER="$2"
shift 2;;
--sudoPwd)
SUDO_PWD="$2"
shift 2;;
*)
break;;
esac
done
然后,对于脚本的其余部分,将
$CMD_OR_SCRIPT
的所有实例替换为"$@"
(需要双引号)。另外,运行脚本时不要指定--cmd
。因此,对于您的示例使用,您应该使用:./execSudoScript.sh --sudoUser root --sudoPwd pass ls /opt
在操作人员的要求下,这里是整个脚本的编辑版本:
#!/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
关于linux - 使用sudo执行2个(相似)命令,给出相同的准确输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18307082/