在 shell 脚本中更改为 root 用户

问题描述 投票:0回答:6

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

例如

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

但是在 su 之后 - 提示以 root 用户返回。 如何执行脚本的其余部分。

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

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

在 shell 脚本中更改 unix 用户

shell su
6个回答
28
投票

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
一样了。


12
投票

有一种无需第二个脚本即可轻松完成的方法。只需将其放在文件的开头:

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

然后它会自动以root身份运行。当然,这假设您可以

sudo su
而无需提供密码 - 但这超出了本答案的范围;请参阅有关在 shell 脚本中使用 sudo 的其他问题之一以了解如何执行此操作。


6
投票

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

例如,我创建了一个脚本来从根子目录运行命令,该段是这样的:

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

3
投票

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

要解决此问题,只需使用 <<'EOF' in place of EOF.

引用整个文档
sudo -i <<'EOF'
ls
echo "I am root now"
EOF

2
投票

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

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

例如:

runasroot.sh

sudo su-c'./scriptname.sh'

脚本名称.sh

apt-get install mysql-server-5.5

或任何你需要的。


0
投票

您可以使用此函数以 root 身份再次调用脚本,将第一个参数传递给新调用:

A=$1
run_with_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
        # the current user has sudo and the password is already set
        if [ "$(whoami)" != "root" ]; then
            # restart script as root
            exec sudo su - <<EOF
                "$0" "$A"
EOF
            exit
        fi
    elif echo $prompt | grep -q '^sudo:'; then
        echo "the current user has sudo but needs the password entered"
        return 1
    else
        echo "the current user has no sudo rights"
        return 1
    fi
}

注意“$0”可能不是你想的那样]

© www.soinside.com 2019 - 2024. All rights reserved.