我正在编写一个脚本(实际上是脚本和 makefile 的组合),用于安装外部依赖项:一些apt-get
命令、一些git
克隆、构建、安装、将用户添加到组……
这些脚本中的一些操作需要超级用户权限,有些则不需要。
到目前为止,我已经使用 sudo 运行了整个 make 过程,但它有一些缺点:
git
我克隆的仓库root
作为所有者获取,这意味着我无法在之后修改它们,sudo
除非chown
- 将用户添加到组的脚本不知道要添加哪个用户,因为
whoami
返回root
以超级用户身份运行需要它的命令的最佳方法是什么?理想情况下,该过程仍需要我输入密码sudo
,但仅在安装过程开始时输入一次。然后它会在最后忘记它,但在此之前一直保留它(可能需要几个小时)。
我在网上找到的解决方案包括:
sudo -v
在脚本的开头,但如果我理解正确的话,这会超时。我的脚本可能运行了几个小时- 使用运行脚本
sudo
,但执行的命令不是需要超级用户sudo -u $(logname) <command>
。这是我现在所做的,但感觉应该反过来。
理想情况下,我希望我的脚本能够:
- 请求超级用户凭证
- 以登录用户身份运行正常命令
- 使用步骤 1 中输入的凭据运行 sudo 命令
sudo -k
关闭超级用户会话
答案1
由于您具有 sudo 访问权限,请为自己创建一个 sudoers 文件,然后在脚本完成后将其删除:
# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END
# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...
# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k
答案2
我通常不推荐的一种方法是自己读取密码,并在需要时使用 的sudo
选项-S
传递密码:
#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"
从man sudo
:
-S, --stdin
Write the prompt to the standard error and read the password
from the standard input instead of using the terminal device.
The password must be followed by a newline character.