在 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!
您需要在<<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 值不会在子组件中更改为道具
我的php想用root权限调用shell脚本,怎么让apache拥有root权限,该http.conf为root,apache启动不了