【问题标题】:Changing to root user inside shell script在 shell 脚本中更改为 root 用户
【发布时间】: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

【问题讨论】:

标签: shell su


【解决方案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!

您需要在&lt;&lt;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 的其他问题之一。

    【讨论】:

    • @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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2017-07-11
        相关资源
        最近更新 更多