更改为root用户内部shell脚本

更改为root用户内部shell脚本,shell,su,Shell,Su,我有一个shell脚本,它需要非root用户帐户来运行某些命令,然后将用户更改为root用户来运行脚本的其余部分。我正在使用SUSE11。 我已经使用expect自动执行密码提示。但是当我使用 生苏- 命令执行后,提示返回root,脚本的其余部分不执行 例如 生苏- 但是在su-之后,提示符返回,用户作为root用户。 如何执行脚本的剩余部分 sudo-S选项没有帮助,因为它没有运行sudo-sifconfig命令,我需要该命令来查找机器的IP地址 我已经浏览了这些链接,但找不到解决方案:

我有一个shell脚本,它需要非root用户帐户来运行某些命令,然后将用户更改为root用户来运行脚本的其余部分。我正在使用SUSE11。 我已经使用expect自动执行密码提示。但是当我使用 生苏- 命令执行后,提示返回root,脚本的其余部分不执行

例如


生苏-
但是在su-之后,提示符返回,用户作为root用户。 如何执行脚本的剩余部分

sudo-S选项没有帮助,因为它没有运行sudo-sifconfig命令,我需要该命令来查找机器的IP地址

我已经浏览了这些链接,但找不到解决方案:


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!
在这种情况下,
root命令将与用户一起执行,而不是使用root权限,因为它将在
su
完成后执行(
su
打开一个新shell,而不是更改当前shell的uid)。当然,您可以在这里使用相同的技巧:

su -c 'sh -s' <<EOF
# list of root commands
EOF

su-c'sh-s'最简单的方法是创建至少两个脚本

第一个应使用root权限调用第二个。因此,在第二个脚本中执行的每个命令都将作为root用户执行

例如:

runasroot.sh

sudo su-c'./scriptname.sh'
apt-get install mysql-server-5.5
scriptname.sh

sudo su-c'./scriptname.sh'
apt-get install mysql-server-5.5

或者你需要的任何东西。

有一种不需要第二个脚本就可以完成的简单方法。只需将以下内容放在文件的开头:

if [ "$(whoami)" != "root" ]
then
    sudo su -s "$0"
    exit
fi

然后它将自动以root用户身份运行。当然,这假设您可以
sudo su
,而无需提供密码-但这超出了本答案的范围;有关如何在shell脚本中使用sudo的其他问题,请参见。

简短版本:创建一个块以包含所有要作为root用户运行的命令

例如,我创建了一个脚本来从根目录运行命令,该段如下所示:

sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF

sudo su-另外,请注意,如果您在shell脚本(如下面的脚本)中更改为“root”用户,那么很少有Linux实用程序(如用于数据提取或定义简单shell变量等)会表现得异常


要解决这个问题,只需使用What-if而不是root来引用整个文档,让我们将其命名为$USERNAME2?提前谢谢。嗨,谢谢你的回答,但应该是sudo su-c'bash scriptname。sh'su和-cBe之间应该有空格小心
“$0”
@ELLIOTTCABLE这很有趣,但我在这里假设$0是启动当前进程的命令,而不是当前文件的路径,所以它不那么脆弱。不过,这是一个很好的观点,也是非常有用的链接。对于密码提示,只需使用
echo$password | sudo-S su-c“$0”
如果使用
bash
,您可以创建一个函数并将定义传递给
sudo
sudo -i <<'EOF'
ls
echo "I am root now"
EOF