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


14

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

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

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

  • git我克隆root以所有者身份获取的回购协议,这意味着以后如果没有sudochown
  • whoami返回以来,将用户添加到组的脚本不知道要添加哪个用户root

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

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

  • sudo -v在脚本开始时,但如果我理解正确,则超时。我的脚本可能会运行几个小时
  • 运行的脚本sudo,但那些命令并不需要超级用户使用sudo -u $(logname) <command>。这就是我现在要做的,但是感觉应该相反。

理想情况下,我希望脚本执行以下操作:

  1. 要求超级用户凭证
  2. 以登录用户身份运行常规命令
  3. 使用在步骤1中输入的凭据运行sudo命令
  4. sudo -k 关闭超级用户会话

2
您仍然可以以sudo的身份运行所有内容,并且脚本可以检查SUDO_USER环境变量。如果存在,它将包含调用sudo的用户的用户名。因此,您可以(以root用户身份)添加$ SUDO_USER:$ SUDO_GID $ your_files。同样,您可以检查这些变量,以便您的adduser命令知道要添加的用户。
roadmr 2015年

...或以root用户身份运行所有内容,并su $SUDO_USER -c command以普通用户身份运行命令。
Rmano

Answers:


7

由于您具有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.

1
这样安全吗?echo "$password"??
αғsнιη

@KasiyA echo "$password"不会,但是heredocs和herestrings更加安全。它们在常用工具显示的命令行上不可见。
muru 2015年

1
严格来讲,我认为在bash脚本中echo "$password"管道的左侧安全的。echo是内置的shell;/bin/echo被称为simple时,它不会运行echo ...。其他一些shell具有echo内置功能(dash例如,),但Bourne风格的shell并不需要。因此,我认为echo "$password" |bash可以接受,但是最好避免使用,以防万一有人将脚本移植到另一个shell而不注意到问题。我使用的是不可移植[[,而不是[该脚本,以避免同一类的问题。@KasiyA
Kagan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.