在shell脚本中更改为root用户

Dee*_*ain 16 shell su

我有一个shell脚本,需要非root用户帐户才能运行某些命令,然后将用户更改为root以运行脚本的其余部分.我正在使用SUSE11.我用expect期望自动化密码提示.但是当我使用spawn su - 并且命令被执行时,提示符将以root身份返回,并且脚本的其余部分不会执行.

例如.

< non-root commands>
 spawn su -
<root commands>
Run Code Online (Sandbox Code Playgroud)

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

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

我已经浏览了这些链接但找不到解决方案: 在shell脚本中将脚本目录更改为用户的homedir

在shell脚本中更改unix用户

Igo*_*bin 20

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!
Run Code Online (Sandbox Code Playgroud)

你需要在<<EOF块中运行你的命令并给出块sudo.

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

但即使你可以设法自动输入密码(或关闭它),这种结构也行不通:

user-command
su 
root-command
Run Code Online (Sandbox Code Playgroud)

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

su -c 'sh -s' <<EOF
# list of root commands
EOF
Run Code Online (Sandbox Code Playgroud)

但现在你和它一样sudo.


Ben*_*ird 9

没有第二个脚本,有一种简单的方法可以做到这一点.只需将其放在文件的开头:

if [ "$(whoami)" != "root" ]
then
    sudo su -s "$0"
    exit
fi
Run Code Online (Sandbox Code Playgroud)

然后它将自动以root身份运行.当然,这假设你可以sudo su不必提供密码 - 但这超出了这个答案的范围; 请参阅有关在shell脚本中使用sudo的其他问题之一.

  • @ELLIOTTCABLE这很有趣,但我在这里假设 $0 是启动当前进程的命令,而不是当前文件的路径,所以它不那么脆弱。尽管如此,这是一个很好的观点,也是非常有用的链接。 (2认同)

小智 6

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

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

sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
Run Code Online (Sandbox Code Playgroud)