【发布时间】:2018-03-30 14:47:29
【问题描述】:
背景
我有一个很长的 bash 脚本,它设置了一个大型互连软件环境,需要几个小时才能完成。它执行的一些任务需要以 root 身份运行,为此我使用sudo ...。然后整个过程暂停,直到用户注意到并输入 root 密码。我想办法让用户只在脚本开头输入root密码,然后在sudo以后需要时自动提供。
我对可能(坏)解决方案的看法
我可以将密码直接存储在一个变量中,然后使用
echo "${root_password}" | sudo -S ...
但有件事告诉我这是不好的做法。
另一种解决方法是强制用户以 root 身份运行整个脚本,但这不会导致在不使用 sudo 的情况下生成的所有文件的权限不同吗?
【问题讨论】:
-
您也可以在脚本中使用
sudo将back 切换到原始用户,以执行例如应创建非root 拥有的文件的命令。您是正确的,存储 root 密码是一个坏主意。另一种可能性是配置sudo以允许用户运行您的脚本(或只是脚本中需要root 权限的命令) 没有密码。其中很多只需要仔细考虑脚本的设计方式。 -
例如,您能否将所有需要 root 的命令(并且仅这些命令)隔离到单独的下标,然后使用
sudo运行? -
@chepner 听起来不错。如何使用
sudo从root变回用户? -
简单的答案是脚本内的
sudo -u <origuser> ...。但是,我认为有一种方法可以从脚本中获取原始用户的身份,而这种假设似乎是错误的。我现在唯一能给出的答案是使用sudo script "$USER" ...之类的东西调用脚本,以便脚本具有它应该降级的用户身份作为参数。 -
@chepner 如果没有别的,我可以使用
sudo script $USER签名让脚本调用自身,如果调用时不带参数。真正的问题是我不必将sudo -u <origuser>添加到每个 命令(除了少数需要root 权限的命令)!我试过在子shell或函数中放置一堆命令,但是sudo不会接受它...