Unix 如何编写一个shell脚本,以超级用户的身份运行某些命令,而不以超级用户的身份运行某些命令,而不必对其进行监视?

Unix 如何编写一个shell脚本,以超级用户的身份运行某些命令,而不以超级用户的身份运行某些命令,而不必对其进行监视?,unix,sudo,Unix,Sudo,我想编写一个shell脚本来自动执行一系列命令。问题是有些命令必须以超级用户身份运行,有些命令不能以超级用户身份运行。到目前为止,我所做的是这样的: #!/bin/bash command1 sudo command2 command3 sudo command4 问题是,这意味着必须等到command1完成后,才会提示输入密码,然后,如果command3需要足够长的时间,则必须等待command3完成。如果这个人能站起来走开,一个小时后再回来把事情做完,那就太好了。例如,以下脚本存在此问题

我想编写一个shell脚本来自动执行一系列命令。问题是有些命令必须以超级用户身份运行,有些命令不能以超级用户身份运行。到目前为止,我所做的是这样的:

#!/bin/bash

command1
sudo command2
command3
sudo command4
问题是,这意味着必须等到command1完成后,才会提示输入密码,然后,如果command3需要足够长的时间,则必须等待command3完成。如果这个人能站起来走开,一个小时后再回来把事情做完,那就太好了。例如,以下脚本存在此问题:

#!/bin/bash

sleep 310
sudo echo "Hi, I'm root"
sleep 310
sudo echo "I'm still root?"
我怎样才能让用户在一开始就只需输入一次密码,然后离开呢

更新:

谢谢你的回复。我在Mac OS X Lion上运行,运行了Stephen P的脚本,得到了不同的结果:(我还添加了$HOME)


您应该以超级用户身份运行整个脚本。如果要以非超级用户身份运行某些命令,请使用sudo的“-u”选项:

#!/bin/bash

sudo -u username command1
command2
sudo -u username command3
command4

当以root用户身份运行时,sudo不会要求输入密码。

如果使用此选项,请同时选中
man sudo

#!/bin/bash

sudo echo "Hi, I'm root"

sudo -u nobody echo "I'm nobody"

sudo -u 1000 touch /test_user

嗯,你有一些选择

您可以将sudo配置为不提示输入密码。由于存在安全风险,不建议这样做

您可以编写一个脚本来读取密码,并在需要时将其提供给sudo,但这既笨重又脆弱

我建议将脚本设计为以root用户身份运行,并在不需要特权时放弃特权。对于不需要root的命令,只需使用它
sudo-u someotheruser命令


(如果它们必须以调用脚本的用户的身份运行,那么您可以让脚本保存uid,并通过sudo以id作为参数调用第二个脚本,这样它就知道su指向谁了。)

File
sutest

#/bin/bash
echo“uid是${uid}”
echo“用户为${user}”
echo“用户名为${username}”
运行它:`./sutest'给我

uid is 500
user is stephenp
username is stephenp
但是使用sudo:
sudo./sutest

uid is 0
user is root
username is stephenp
因此,当作为sudo运行时,您将保留$USERNAME中的原始用户名。这导致了一个类似于其他人发布的解决方案:

#/bin/bash
sudo-u${USERNAME}normal_命令_1
根目录\u命令\u 1
根目录\u命令\u 2
sudo-u${USERNAME}normal_命令_2
#等等。
只要sudo首先调用脚本,它就会提示输入一次密码


我最初是在Linux上写这个答案的,Linux与OSX确实有些不同

OSX(我在Mountain Lion 10.8.3上进行测试)在运行SUDO时有一个环境变量
SUDO_USER
,可以用来代替上面的
USERNAME
,或者为了更跨平台,脚本可以检查SUDO_USER是否已设置并使用,如果已设置,则使用USERNAME

正在更改OS X的原始脚本,它将变成

#/bin/bash
sudo-u${sudo\u USER}正常\u命令\u 1
根目录\u命令\u 1
根目录\u命令\u 2
sudo-u${sudo\u USER}普通\u命令\u 2
#等等。
跨平台的第一个尝试可能是

#/bin/bash
#
#将“THE_USER”设置为SUDO_USER(如果已设置),
#否则将其设置为USERNAME,如果已设置,
#否则将其设置为字符串“未知”
#然后应该测试它是否“未知”
#
_USER=${SUDO_USER:-${USERNAME:-unknown}
sudo-u${THE_USER}normal_命令\u 1
根目录\u命令\u 1
根目录\u命令\u 2
sudo-u${THE_USER}normal_命令\u 2
#等等。

您还可以创建一个由root用户拥有的shell脚本,并设置了
suid
位,但如果操作不当,则可能会很危险。任何时候当你运行shell脚本作为root时,你可能想考虑使用<代码>陷阱>代码来处理信号。有一些例子。奇怪的是,我实际上得到了不同的结果。这是在Mac OS X Lion上:
pair@abbeyscratch$./test2.sh

uid是501

用户是成对的

用户名是

主目录是/Users/pair

pair@abbeyscratch$sudo./test2.sh

密码:

uid为0

用户为root

用户名是root

主目录是/Users/pair

pair@abbeyscratch$sudo-u pair./test2.sh
uid是501

用户是pair

用户名是pair

主目录是/Users/pair

对于上述格式,我深表歉意评论;我现在正在更新原始帖子。在Ubuntu 12.04或更新版本上,您还需要使用
${SUDO_USER}
。我在Xubuntu 14.04上,当我不是root用户时,用户名变量不存在。在我的.bashrc文件中定义它有意义吗?我不明白为什么它只在我是root的时候出现,而不是别的时候。我键入了
env|grep USERNAME
但什么也没显示,但当我键入
sudo env|grep USERNAME
时,它显示为
USERNAME=root
uid is 0
user is root
username is stephenp