如何进行持续足够长的时间以使(非特权)make 完成的 sudo 验证?

如何进行持续足够长的时间以使(非特权)make 完成的 sudo 验证?

我经常使用以下结构来构建和安装 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'

这将同时启动makesudo,并sudo提示您输入密码。同时,make将其所有输出发送到管道,由命令读取cat。完成后,make install运行。它是从bash仍具有提升权限的进程调用的,因此不存在超时问题。

答案3

最简单的方法,不需要更改系统文件:

echo {password} | sudo -S -v && make && echo {password} | sudo -S make install

这将允许脚本运行时无需提示输入密码。

然而,由于您以纯文本形式存储密码,因此这种方法存在安全风险。


您可以在此处找到其他一些方法但大多数是关于编辑系统文件。


编辑:如果在第一个 echo 前添加空格,该命令将不会显示在 bash 历史记录中。

相关内容