我想编写一个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)
您应该以超级用户身份运行整个脚本.如果要以非超级用户身份运行某些命令,请使用sudo的"-u"选项:
#!/bin/bash
sudo -u username command1
command2
sudo -u username command3
command4
Run Code Online (Sandbox Code Playgroud)
以root身份运行时,sudo不会要求输入密码.
| 归档时间: |
|
| 查看次数: |
291407 次 |
| 最近记录: |