我有一个运行时间很长的bash脚本,其中一些命令需要以root身份运行,而大多数命令需要在sudo之前以常规用户身份运行,因为这会破坏文件所有权等。
我想出了一些方法,但是每个方法都有一些问题
方法1:在文件内部使用sudo
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
从编写代码的方式来看,这看起来不错。sudo
是在实际上需要由root用户运行的少数语句之前编写的,但是如果每次sudo
调用之间的时间太长,则sudo
再次要求输入密码。同样,如果第一次执行sudo
失败(例如,由于密码无效),则脚本的其余部分仍将执行。
方法2:使用sudo调用文件,然后在需要时更改回原始用户
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
这也很糟糕,因为我需要su username -c
在几乎每一行之前添加。也sudo
可以在之后找到原始用户名,但是很麻烦。
有没有更好的办法?
编辑:我只在这里发布了一些小的,荒谬的脚本来显示我在说什么。在实际的脚本中,我有一些需要sudo的行(启动和停止服务),有些行是否存在sudo无关紧要,很多行实际上需要在没有sudo的情况下运行。
@ElderGeek您粘贴了错误的链接吗?这似乎似乎无关。这可能是如何在脚本中运行“ sudo”命令的副本?但我希望OP可以解释更多。
—
terdon
@terdon似乎是这样。打扫干净。
—
年长者极客
这只是一个示例脚本。我不想在这里粘贴200多个行脚本。我将编辑答案以获取更多详细信息。
—
达卡龙
您是否考虑过validate选项(在中进行了介绍)
—
sudodus
man sudo
?-v, --validate
'更新用户的缓存凭据,必要时对用户进行身份验证。对于sudoers插件,默认情况下,这会将sudo超时再延长15分钟,但不会运行命令。并非所有的安全策略都支持缓存的凭据。(如果您经常运行它,则sudo身份验证不应超时。)
sudo
如果需要提升权限,只需运行即可。但是切换su username -c
到运行没有意义echo
。换句话说,这听起来像[XY]。您能否编辑和解释您的脚本将实际执行的操作以及为什么您觉得需要如此频繁地切换用户?