仅以 sudo 身份运行部分脚本,仅输入一次密码

仅以 sudo 身份运行部分脚本,仅输入一次密码

我正在编写一个脚本(实际上是脚本和 makefile 的组合),用于安装外部依赖项:一些apt-get命令、一些git克隆、构建、安装、将用户添加到组……

这些脚本中的一些操作需要超级用户权限,有些则不需要。

到目前为止,我已经使用 sudo 运行了整个 make 过程,但它有一些缺点:

  • git我克隆的仓库root作为所有者获取,这意味着我无法在之后修改它们,sudo除非chown
  • 将用户添加到组的脚本不知道要添加哪个用户,因为whoami返回root

以超级用户身份运行需要它的命令的最佳方法是什么?理想情况下,该过程仍需要我输入密码sudo,但仅在安装过程开始时输入一次。然后它会在最后忘记它,但在此之前一直保留它(可能需要几个小时)。

我在网上找到的解决方案包括:

  • sudo -v在脚本的开头,但如果我理解正确的话,这会超时。我的脚本可能运行了几个小时
  • 使用运行脚本sudo,但执行的命令不是需要超级用户sudo -u $(logname) <command>。这是我现在所做的,但感觉应该反过来。

理想情况下,我希望我的脚本能够:

  1. 请求超级用户凭证
  2. 以登录用户身份运行正常命令
  3. 使用步骤 1 中输入的凭据运行 sudo 命令
  4. 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.

相关内容