在 shell 脚本中更改为 root 用户

Posted

技术标签:

【中文标题】在 shell 脚本中更改为 root 用户【英文标题】:Changing to root user inside shell script 【发布时间】:2012-07-23 02:58:12 【问题描述】:

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

例如。

< non-root commands>
 spawn su -
<root commands>

但在 su 之后 - 提示以 root 用户身份返回。 如何执行剩余的脚本。

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

我已经浏览了这些链接,但找不到解决方案: Change script directory to user's homedir in a shell script

Changing unix user in a shell script

【问题讨论】:

如果你使用bash,你可以创建一个函数并将定义传递给sudo:unix.stackexchange.com/questions/269078/… 【参考方案1】:

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!

您需要在&lt;&lt;EOF 块中运行命令并将块交给sudo

如果你愿意,当然可以使用su。但是您需要使用expect/pexpect 运行它,这将为您输入密码。

但即使您可以设法自动输入密码(或将其关闭),这种构造也不起作用:

user-command
su 
root-command

在这种情况下,root-command 将以用户身份执行,而不是 root 权限,因为它将在su 完成后执行(su 打开一个新的 shell,而不是更改当前 shell 的 uid)。您当然可以在这里使用相同的技巧:

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

但是现在你和sudo一样。

【讨论】:

【参考方案2】:

有一个简单的方法可以在没有第二个脚本的情况下做到这一点。只需将其放在文件的开头即可:

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

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

【讨论】:

小心; "$0"may not be what you think it is. @ELLIOTTCABLE 这很有趣,但我在这里假设 $0 是启动当前进程的命令,而不是当前文件的路径,因此它不那么脆弱。不过,这是一个很好的观点,并且非常有用的链接。 密码提示只需使用echo $PASSWORD | sudo -S su -c "$0" 也许我们应该在sudo 前面添加exec 以避免创建另一个子进程。【参考方案3】:

短版:创建一个块来包含所有以 root 身份运行的命令。

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

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

【讨论】:

【参考方案4】:

最简单的方法是创建至少两个脚本。

第一个应该以 root 权限调用第二个。因此,您在第二个脚本中执行的每个命令都将以 root 身份执行。

例如:

runasroot.sh

sudo su-c'./scriptname.sh'

scriptname.sh

apt-get install mysql-server-5.5

或任何你需要的。

【讨论】:

如果我们将其命名为 $USERNAME2 而不是 root 怎么办?提前致谢。 您好,感谢您的回答,但应该是 sudo su -c'bash scriptname.sh' su 和 -c 之间应该有空格【参考方案5】:

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

要解决这个问题,只需使用

sudo -i <<'EOF'
ls
echo "I am root now"
EOF

【讨论】:

以上是关于在 shell 脚本中更改为 root 用户的主要内容,如果未能解决你的问题,请参考以下文章

React Native 更改 let 值不会在子组件中更改为道具

Linux系统shell脚本之用户管理脚本实战

我的php想用root权限调用shell脚本,怎么让apache拥有root权限,该http.conf为root,apache启动不了

vim,grep,shell脚本实例及find用法

shell脚本练习

商标和版权在wordpress数据库中更改为unicodes