24

我有一个 shell 脚本,它需要非 root 用户帐户来运行某些命令,然后将用户更改为 root 以运行脚本的其余部分。我正在使用 SUSE11。我用过expect来自动化密码提示。但是当我使用 spawn su - 并且命令被执行时,提示会以 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

在 shell 脚本中更改 unix 用户

4

5 回答 5

26

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

但是现在你和 with 一样sudo

于 2012-07-24T18:20:01.027 回答
10

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

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

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

于 2015-08-07T08:14:06.257 回答
4

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

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

sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
于 2018-11-12T19:31:28.340 回答
2

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

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

例如:

runasroot.sh

sudo su-c'./scriptname.sh'

脚本名.sh

apt-get install mysql-server-5.5

或任何你需要的。

于 2013-03-16T13:13:17.380 回答
2

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

要解决此问题,只需使用 <<'EOF' 代替 EOF 来引用整个文档。

sudo -i <<'EOF'
ls
echo "I am root now"
EOF
于 2019-12-25T05:58:52.090 回答