在shell脚本中更改为root用户

时间:2012-07-24 18:13:20

标签: shell su

我有一个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

Changing unix user in a shell script

5 个答案:

答案 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