我制作了一些包含一些函数的脚本,这些函数在设计上需要 sudo 权限。我已在.bashrc
forLinux
和.bash_profile
for中添加了这些路径,MacOS
以便可以从任何地方调用它。
但我不希望用户sudo
每次想要调用这些脚本函数时都键入。有什么方法可以暗示sudo
每当调用这些函数时,终端都会假设它是从 root 用户调用的?
我想我应该sudo -i
在脚本的开头添加,或者也许在每个函数的开头添加?或者还有其他替代的暗示方式吗sudo
?另外,如果您认为暗示 sudo 会很糟糕或危险,以及是否不建议这样做,我会很高兴知道。
包含一些函数的脚本示例dangerous-function
,我试图在不指定的情况下完成这些函数sudo
#!/bin/bash
start-one()
{
## do dangerous stuff with sudo
systemctl start dangerous.service
}
start-two()
{
systemctl start dangerous1.service
}
start-launchwizard()
{
systemctl start dangerous2.service
}
## Calling functions one by one...
"$@"
我不想打电话给他们,sudo dangerous-function start-one
我只想打电话给他们,dangerous-function start-one
但仍然得到与前一个相同的结果。
答案1
将"$@"
扩展为命令行参数列表,单独引用。这意味着如果您使用以下命令调用脚本
./script.sh start-one
它将start-one
在那时运行(这是你的函数)。它还意味着将其调用为
./script.sh ls
它会运行ls
。
允许用户使用sudo
(或sudo
在脚本内部使用)调用脚本将允许他们以 root 身份运行任何命令(如果他们有sudo
访问权限)。你不想要这个。
相反,您需要仔细验证命令行参数。也许像
foo_func () {
# stuff
printf 'foo:\t%s\n' "$@"
}
bar_func () {
# stuff
printf 'bar:\t%s\n' "$@"
}
arg=$1
shift
case $arg in
foo)
foo_func "$@" ;;
bar)
bar_func "$@" ;;
*)
printf 'invalid sub-command: %s\n' "$arg" >&2
exit 1
esac
测试:
$ sh script.sh bar 1 2 3
bar: 1
bar: 2
bar: 3
$ sh script.sh baz
invalid sub-command: baz
这将是更安全与 一起使用sudo
,但您仍然不想执行用户在各种函数中为您提供的任何内容直接地无需清理输入。上面的脚本通过将用户限制为一组特定的子命令来实现此目的,并且处理子命令的每个函数都会执行以下操作:不是执行、eval
、 或其source
参数。
让我用其他的话再说一遍:该脚本不会也不应该尝试以任何方式将用户输入作为代码执行。它不应该试图弄清楚参数是否对应于当前环境中它可以执行的函数(函数可能已由调用环境放置在那里),并且它不应该执行其路径名在命令行等上给出的脚本。
如果脚本正在执行管理任务,我希望必须使用 来运行它sudo
,并且我不希望脚本本身询问我的密码,特别是如果它是我可能想要非交互运行的脚本(例如从 cron 作业)。也就是说,执行需要 root 权限的管理任务的脚本应该(恕我直言)能够认为它从一开始就以正确的权限运行。
如果你想测试在脚本中,你可以这样做
if [ "$( id -u )" -ne 0 ]; then
echo 'please run this script as root' >&2
exit 1
fi
然后它做出决定如何以脚本用户的 root 权限运行脚本。
答案2
您可以添加您的脚本/etc/sudoers
(最好使用“visudo”),以便用户可以访问它。
user ALL= /path/to/script
然后用户无需 sudo 即可执行path/to/script
。