在shell脚本中更改为root用户

k3fezbri  于 2023-04-21  发布在  Shell
关注(0)|答案(6)|浏览(669)

我有一个shell脚本,它需要非root用户帐户来运行某些命令,然后将用户更改为root来运行脚本的其余部分。我使用SUSE 11。我使用expect来自动化密码提示。但是当我使用spawn su -执行命令时,提示符会返回root,脚本的其余部分不会执行。

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

但是在su -之后,提示符以root用户身份返回。如何执行脚本的其余部分。
sudo -S选项没有帮助,因为它不运行sudo -S ifconfig命令,我需要找到机器的IP地址。
我已经看过这些链接,但找不到解决方案:Change script directory to user's homedir in a shell script
Changing unix user in a shell script

e0bqpujr

e0bqpujr1#

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将以user而不是root权限执行,因为它将在su完成后执行(su打开一个新的shell,而不是更改当前shell的uid)。当然,您可以在这里使用相同的技巧:

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

但是现在你有与sudo相同的。

bihw5rsg

bihw5rsg2#

有一个简单的方法可以做到这一点,而不需要第二个脚本。只需将以下内容放在文件的开头:

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

当然,这是假设你可以sudo su而不需要提供密码--但这超出了本答案的范围;请参阅关于在shell脚本中使用sudo的其他问题之一,了解如何做到这一点。

zzwlnbp8

zzwlnbp83#

简短版本:创建一个块来包含所有要以root身份运行的命令。
例如,我创建了一个脚本来从根子目录运行命令,该片段如下所示:

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

yuvru6vn4#

另外,请注意,如果您在shell脚本中更改为“root”用户,如下面的一个,一些Linux实用程序,如awk,用于数据提取或定义甚至一个简单的shell变量等,将表现得很奇怪。
要解决这个问题,只需使用〈'EOF'代替EOF引用整个文档。

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

1rhkuytd5#

最简单的方法是创建至少两个脚本。
第一个脚本应该以root权限调用第二个脚本,所以在第二个脚本中执行的每个命令都将以root权限执行。
例如:

runasroot.sh

sudo su-c'./scriptname.sh'

scriptname.sh

apt-get install mysql-server-5.5

或者任何你需要的东西

ddarikpa

ddarikpa6#

您可以使用此函数,它将以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”[may not be what you think it is]](http://mywiki.wooledge.org/BashFAQ/028)

相关问题