Rak*_*iha 1 shell bash sudo function bashrc
我制作了一些脚本,其中包含一些设计需要 sudo 权限的功能。我在.bashrcforLinux和.bash_profilefor 中添加了这些路径,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...
"$@"
Run Code Online (Sandbox Code Playgroud)
我不想打电话给他们,sudo dangerous-function start-one
我只想打电话给他们,dangerous-function start-one但仍然得到与前一个相同的结果。
在"$@"将扩大到命令行参数列表,单独报价。这意味着如果你调用你的脚本
./script.sh start-one
Run Code Online (Sandbox Code Playgroud)
它将start-one在那时运行(这是您的功能)。这也意味着调用它作为
./script.sh ls
Run Code Online (Sandbox Code Playgroud)
它会运行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
Run Code Online (Sandbox Code Playgroud)
测试:
$ sh script.sh bar 1 2 3
bar: 1
bar: 2
bar: 3
Run Code Online (Sandbox Code Playgroud)
$ sh script.sh baz
invalid sub-command: baz
Run Code Online (Sandbox Code Playgroud)
这与 一起使用会更安全sudo,但您仍然不希望在不清理输入的情况下直接在您的各种功能中执行用户提供给您的任何内容。上面的脚本通过将用户限制为一组特定的子命令来实现这一点,并且每个处理子命令的函数都不会执行eval, 或其source参数。
让我再说一遍:脚本不会也不应该尝试以任何方式将用户输入作为代码执行。它不应该试图弄清楚参数是否对应于当前环境中它可以执行的函数(函数可能已被调用环境放置在那里),也不应该执行其路径名在命令行等中给出的脚本。
如果脚本正在执行管理任务,我希望必须使用 运行它sudo,并且我不希望脚本本身询问我的密码,尤其是如果它是我可能想要以非交互方式运行的脚本(例如来自 cron 工作)。也就是说,执行需要 root 权限的管理任务的脚本应该(恕我直言)能够假设它从一开始就以正确的权限运行。
如果你想在脚本中测试这个,你可以这样做
if [ "$( id -u )" -ne 0 ]; then
echo 'please run this script as root' >&2
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
然后它将如何以 root 权限运行脚本的决定转移给脚本的用户。