我有一个shell脚本,需要非root用户帐户才能运行某些命令,然后将用户更改为root以运行脚本的其余部分。我正在使用SUSE11。 我用expect期望自动化密码提示。但是当我使用时 spawn su - 并且命令被执行,提示以root身份返回,脚本的其余部分不执行。
例如
< non-root commands>
spawn su -
<root commands>
但在su之后 - 提示以root身份返回用户。 如何执行剩余的脚本。
sudo -S选项没有帮助,因为它没有运行sudo -S ifconfig命令,我需要找到该机器的IP地址。
我已经浏览过这些链接,但找不到解决方案: Change script directory to user's homedir in a shell script
答案 0 :(得分:19)
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
将与用户一起执行,而不是以root权限执行,因为它将在su
完成后执行(su
打开一个新shell,而不是更改uid当前的shell)。你当然可以在这里使用相同的技巧:
su -c 'sh -s' <<EOF
# list of root commands
EOF
但现在你和sudo
一样。
答案 1 :(得分:9)
有一种简单的方法可以在没有第二个脚本的情况下完成。只需将其放在文件的开头:
if [ "$(whoami)" != "root" ]
then
sudo su -s "$0"
exit
fi
然后它将自动以root身份运行。当然,这假设你可以sudo su
而不必提供密码 - 但这超出了这个答案的范围;请参阅有关如何在shell脚本中使用sudo的其他问题之一。
答案 2 :(得分:1)
最简单的方法是创建至少两个脚本。
第一个应该使用root权限调用第二个。因此,您在第二个脚本中执行的每个命令都将以root身份执行。
例如:
<强> runasroot.sh 强>
sudo su-c'./scriptname.sh'
<强> scriptname.sh 强>
apt-get install mysql-server-5.5
或任何你需要的东西。
答案 3 :(得分:1)
另外,请注意,如果要在下面的shell脚本中更改为“ root”用户,则很少有Linux工具,例如awk来进行数据提取或定义简单的shell变量等,都会产生怪异的行为。
要解决此问题,只需使用<<'EOF'代替EOF引用整个文档即可。
sudo -i <<'EOF'
ls
echo "I am root now"
EOF
答案 4 :(得分:0)
简短版本:创建一个块以包含所有要以root用户身份运行的命令。
例如,我创建了一个脚本来从根子目录运行命令,该段如下所示:
sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF