如何编写一个以超级用户身份运行某些命令的shell脚本,而不是以超级用户身份执行某些命令,而不必亲自进行操作?

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

#!/bin/bash command1 sudo command2 command3 sudo command4 

问题是,这意味着有人必须等到command1完成之后才提示input密码,那么,如果command3花费足够长时间,则必须等待command3完成。 如果这个人可以起来走开,那么一个小时后回来就可以完成了。 例如,下面的脚本有这个问题:

 #!/bin/bash sleep 310 sudo echo "Hi, I'm root" sleep 310 sudo echo "I'm still root?" 

我怎样才能让用户在一开始就input一次密码,然后走开?

更新:

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

 pair@abbey scratch$ ./test2.sh uid is 501 user is pair username is home directory is /Users/pair pair@abbey scratch$ sudo ./test2.sh Password: uid is 0 user is root username is root home directory is /Users/pair 

文件sutest

 #!/bin/bash echo "uid is ${UID}" echo "user is ${USER}" echo "username is ${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中。 这导致类似于其他人发布的解决scheme:

 #!/bin/bash sudo -u ${USERNAME} normal_command_1 root_command_1 root_command_2 sudo -u ${USERNAME} normal_command_2 # etc. 

只要sudo来调用你的脚本,它会提示input密码一次。


我最初在Linux上写了这个答案,这与OS X有一些区别

OS X(我正在testing这个在Mountain Lion 10.8.3上)有一个环境variablesSUDO_USER 当你运行sudo的时候 ,可以用上面的USERNAME来代替,或者是更跨平台的脚本可以检查看看如果SUDO_USER被设置并且使用它,或者如果设置了则使用USERNAME。

更改OS X的原始脚本,它变成…

 #!/bin/bash sudo -u ${SUDO_USER} normal_command_1 root_command_1 root_command_2 sudo -u ${SUDO_USER} normal_command_2 # etc. 

第一个刺中跨平台可能是…

 #!/bin/bash # # set "THE_USER" to SUDO_USER if that's set, # else set it to USERNAME if THAT is set, # else set it to the string "unknown" # should probably then test to see if it's "unknown" # THE_USER=${SUDO_USER:-${USERNAME:-unknown}} sudo -u ${THE_USER} normal_command_1 root_command_1 root_command_2 sudo -u ${THE_USER} normal_command_2 # etc. 

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

 #!/bin/bash sudo -u username command1 command2 sudo -u username command3 command4 

以root身份运行时,sudo不会要求input密码。

如果你使用这个,请检查man sudo

 #!/bin/bash sudo echo "Hi, I'm root" sudo -u nobody echo "I'm nobody" sudo -u 1000 touch /test_user 

那么,你有一些select。

你可以configurationsudo来不提示input密码。 由于存在安全风险,build议不要这样做。

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

我build议将脚本devise为以root用户身份运行,并在不需要时放弃其权限。 只需要sudo -u someotheruser command来执行不需要root的命令。

(如果他们必须专门作为用户调用脚本运行,那么你可以让脚本保存uid并通过sudo用id调用第二个脚本作为参数,所以它知道谁要su ..)