如何编写一个以超级用户身份运行某些命令的shell脚本,而不是以超级用户身份运行某些命令,而不必保管它?

spe*_*ius 57 unix sudo

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

#!/bin/bash

command1
sudo command2
command3
sudo command4
Run Code Online (Sandbox Code Playgroud)

问题是,这意味着有人必须等到command1完成才会提示输入密码,然后,如果command3需要足够长的时间,他们就必须等待command3完成.如果这个人可以站起来走开,然后一小时后回来并完成,那就太好了.例如,以下脚本有此问题:

#!/bin/bash

sleep 310
sudo echo "Hi, I'm root"
sleep 310
sudo echo "I'm still root?"
Run Code Online (Sandbox Code Playgroud)

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

更新:

谢谢你的回复.我在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
Run Code Online (Sandbox Code Playgroud)

Ste*_*n P 50

文件 sutest

#!/bin/bash
echo "uid is ${UID}"
echo "user is ${USER}"
echo "username is ${USERNAME}"
Run Code Online (Sandbox Code Playgroud)

跑吧:`./sutest'给了我

uid is 500
user is stephenp
username is stephenp
Run Code Online (Sandbox Code Playgroud)

但是使用sudo:sudo ./sutest

uid is 0
user is root
username is stephenp
Run Code Online (Sandbox Code Playgroud)

因此,当您以sudo身份运行时,您在$ USERNAME中保留原始用户名.这导致了一个类似于其他人发布的解决方案:

#!/bin/bash
sudo -u ${USERNAME} normal_command_1
root_command_1
root_command_2
sudo -u ${USERNAME} normal_command_2
# etc.
Run Code Online (Sandbox Code Playgroud)

只是sudo首先调用你的脚本,它会提示输入一次密码.


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

OS X(我在Mountain Lion 10.8.3上进行测试)SUDO_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.
Run Code Online (Sandbox Code Playgroud)

首次尝试跨平台可以......

#!/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.
Run Code Online (Sandbox Code Playgroud)


Pav*_*hov 9

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

#!/bin/bash

sudo -u username command1
command2
sudo -u username command3
command4
Run Code Online (Sandbox Code Playgroud)

以root身份运行时,sudo不会要求输入密码.