我有一个shell脚本,需要非root用户帐户来运行某些命令,然后更改用户以root运行脚本的其余部分。 我现在用SUSE11。 我用期待自动化密码提示。 但是,当我用菌种苏 - 和命令执行后,及时回来与根和脚本的其余部分不执行。
例如。
< non-root commands>
spawn su -
<root commands>
但之后su - 提示与用户以root身份返回。 如何执行剩余的脚本。
须藤-S选项没有帮助,因为它不执行sudo -S ifconfig命令,我需要找到本机的IP地址。
我已经通过这些链接走了,但一直没找到解决办法: 更改脚本目录用户的主目录中的shell脚本
在shell脚本修改UNIX用户
sudo
将在这里工作,但你必须改变你的脚本一点点:
$ cat 1.sh
id
sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF
$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!
您需要在运行命令<<EOF
块,并给该块sudo
。
如果你愿意,你可以使用su
,当然。 但是,你需要使用运行它expect/pexpect
,会为你输入密码。
但即使情况下,你可以设法进入自动密码(或将其关闭),这种结构是行不通的:
user-command
su
root-command
在这种情况下root-command
将与用户之后执行,而不是使用根权限,因为它会被执行su
将完成( su
打开一个新的外壳,电流壳的未改变UID)。 你可以在这里使用同样的伎俩,当然:
su -c 'sh -s' <<EOF
# list of root commands
EOF
但是,现在你有一样用sudo
。
有一个简单的方法来做到这一点没有第二个脚本。 只要把这个你的文件的开头:
if [ "$(whoami)" != "root" ]
then
sudo su -s "$0"
exit
fi
然后,它会自动运行自己为根。 当然,这是假定你可以sudo su
,而无需提供密码-但这是出于这个答案的范围; 请参阅有关shell脚本使用sudo如何做到这一点的其他问题之一。
要做到这一点最简单的方法是创建一个至少有两个脚本。
第一个应该调用第二个具有root权限。 所以,你在第二个脚本执行的每一个命令会以root身份执行。
例如:
runasroot.sh
sudo su-c'./scriptname.sh'
scriptname.sh
apt-get install mysql-server-5.5
或任何你需要的。
短版:创建块包围,以root身份运行所有命令。
例如,我创建一个脚本来从根子目录运行命令,段是这样的:
sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF