我想编写一个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)
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
答案 0 :(得分:49)
档案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中保留原始用户名。这导致了类似于其他人发布的解决方案:
#!/bin/bash
sudo -u ${USERNAME} normal_command_1
root_command_1
root_command_2
sudo -u ${USERNAME} normal_command_2
# etc.
只要sudo首先调用你的脚本,它就会提示输入一次密码。
我最初在Linux上写了这个答案,它与OS X存在一些差异
OS X(我在Mountain Lion 10.8.3上进行测试)在运行sudo 时有一个环境变量SUDO_USER
,可以代替{{ 1}}以上,或者更加跨平台,脚本可以检查是否设置了SUDO_USER并使用它,如果是,则使用USERNAME。
更改OS X的原始脚本,它变为......
USERNAME
首次尝试跨平台可能是......
#!/bin/bash
sudo -u ${SUDO_USER} normal_command_1
root_command_1
root_command_2
sudo -u ${SUDO_USER} normal_command_2
# etc.
答案 1 :(得分:9)
您应该以超级用户身份运行整个脚本。如果要以非超级用户身份运行某些命令,请使用sudo的“-u”选项:
#!/bin/bash
sudo -u username command1
command2
sudo -u username command3
command4
以root身份运行时,sudo不会要求输入密码。
答案 2 :(得分:3)
如果您使用此功能,请同时检查man sudo
:
#!/bin/bash
sudo echo "Hi, I'm root"
sudo -u nobody echo "I'm nobody"
sudo -u 1000 touch /test_user
答案 3 :(得分:3)
嗯,你有一些选择。
您可以将sudo配置为不提示输入密码。由于安全风险,不建议这样做。
您可以编写一个expect脚本来读取密码,并在需要时将其提供给sudo,但这很笨拙而且很脆弱。
我建议将脚本设计为以root用户身份运行,并在不需要时删除其权限。只需将sudo -u someotheruser command
用于不需要root的命令。
(如果他们必须专门作为用户调用脚本运行,那么你可以让脚本保存uid并通过sudo以id作为参数调用第二个脚本,因此它知道要向谁发送...)