我经常使用以下结构来构建和安装 tarball:
sudo -v && make && sudo make install
这样我就可以立即输入密码,无需人工干预即可完成所有操作。除了极少数情况下构建时间超过sudo
超时时间的情况外,这种方法效果很好,这种情况可能发生在我运行大型项目的较慢的机器上(即使使用make -j4
)。
但是当构建需要很长时间时,无人值守就具有了很大的优势。有人能想到一个 shell 构造,可以让我立即输入密码,并且可以make
在正常权限和make install
提升权限下执行吗?
出于安全原因,我不想将我的用户配置为sudo
无需密码即可使用。
一个可行的选择是将超时时间设置得很长,但我希望能有更优雅的选择。
答案1
一旦获得 root 权限,您就可以sudo
再次以非 root 用户身份执行命令:
sudo bash -c "sudo -u $USER non-root-user-command ; root-command"
请注意,您需要使用双引号,而不是单引号。如果使用单引号,$USER
将被替换为root
,这将无法实现预期的结果。希望这些命令可以说明我的观点:
$ sudo bash -c "echo $USER"
david
$ sudo bash -c 'echo $USER'
root
那么,我们来看看问题中提到的例子:
make && sudo make install
那将会变成:
sudo bash -c "sudo -u $USER make && make install"
答案2
我认为这是最好的方法:
make | sudo bash -c 'cat - && make install'
这将同时启动make
和sudo
,并sudo
提示您输入密码。同时,make
将其所有输出发送到管道,由命令读取cat
。完成后,make install
运行。它是从bash
仍具有提升权限的进程调用的,因此不存在超时问题。
答案3
最简单的方法,不需要更改系统文件:
echo {password} | sudo -S -v && make && echo {password} | sudo -S make install
这将允许脚本运行时无需提示输入密码。
然而,由于您以纯文本形式存储密码,因此这种方法存在安全风险。
您可以在此处找到其他一些方法但大多数是关于编辑系统文件。
编辑:如果在第一个 echo 前添加空格,该命令将不会显示在 bash 历史记录中。