我制作了一些脚本,其中包含一些设计上需要 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
但仍然得到与前一个相同的结果。
将
"$@"
扩展为命令行参数列表,单独引用。这意味着如果你调用你的脚本它会
start-one
在那个时候运行(这是你的功能)。这也意味着将其调用为它会运行
ls
。允许用户使用
sudo
(或sudo
在脚本内部使用)调用脚本将允许他们以 root 身份运行任何命令,如果他们有权sudo
访问的话。你不想要这个。相反,您需要仔细验证命令行参数。也许像
测试:
与 一起使用会更安全
sudo
,但您仍然不想在不清理输入的情况下直接执行用户在您的各种功能中提供的任何内容。上面的脚本通过将用户限制在一组特定的子命令来做到这一点,并且处理子命令的每个函数都不会执行 ,eval
或其source
参数。让我再说一遍:脚本不会也不应该尝试以任何方式将用户输入作为代码执行。它不应该试图弄清楚一个参数是否对应于它可以执行的当前环境中的函数(函数可能已经被调用环境放在那里)并且它不应该执行其路径名在命令行等上给出的脚本。
如果脚本正在执行管理任务,我希望必须使用 运行它
sudo
,并且我不希望脚本本身询问我的密码,特别是如果它是我可能想以非交互方式运行的脚本(例如,来自 cron 作业)。也就是说,执行需要 root 权限的管理任务的脚本应该(恕我直言)能够假定它从一开始就以正确的权限运行。如果你想在脚本中测试这个,你可以这样做
然后,它将如何以 root 权限运行脚本的决定转移给脚本的用户。
您可以添加您的脚本
/etc/sudoers
(最好使用 `visudo),以便用户可以访问它。然后用户将能够在
path/to/script
没有 sudo 的情况下执行。