【问题标题】:Stop being root in the middle of a script that was run with sudo停止在使用 sudo 运行的脚本中间成为 root
【发布时间】:2015-03-07 09:00:29
【问题描述】:

只有以sudo 开头的命令才会成功。
还有另一个命令列表,只有当用户在没有sudo 的情况下运行它们时才会成功。

我想从同一个脚本中执行所有这些命令。
我想避免执行以下操作:

#!/usr/bin/env bash
sudo sudo_command_one;
sudo sudo_command_two;
sudo sudo_command_three;
non_sudo_command;
sudo sudo_command_four;

之所以会这样,是因为 sudo 有超时,而这些命令可能会花费很长时间。我不想因为不得不偶尔重新输入 sudo 密码而感到负担。我也许可以无限期延长 sudo 的超时时间,但如果有更简单的方法,我也希望避免这种情况。

因此,我将像这样运行脚本:

sudo ./script

但这会阻止非 sudo 命令工作。
我需要哪些缺少的命令:

#!/usr/bin/env bash
sudo_command_one;
sudo_command_two;
sudo_command_three;
[turn sudo off for a moment]
non_sudo_command;
[ok, turn sudo back on]
sudo_command_four;

不幸的是,命令的顺序无法重新排列,因此我先运行所有 sudo 命令,然后运行所有非 sudo 命令(反之亦然)。

【问题讨论】:

  • 您可以添加 sudo -v 以更新 sudo 凭据上的时间戳。

标签: linux bash shell root sudo


【解决方案1】:

在 sudo 运行的脚本中,使用:

su -c "shell command; shell command" $SUDO_USER 

在该脚本中以调用 sudo 的普通用户身份执行命令。

这是因为sudo 将环境变量SUDO_USER 设置为原始用户名。

如果您有一堆命令要以原始用户身份运行,您可以使用 hereis 文档。

这是一个示例脚本文件作为概念证明:

myscript.sh

#!/bin/bash
echo "Part 1"
echo "now running as:"
whoami
echo "SUDO_USER is:"
echo $SUDO_USER
su $SUDO_USER <<EOF
echo "Part 2"
echo "now running as:"
whoami
echo "SUDO_USER is:"
env | grep ^SUDO_USER
sleep 5
EOF
echo "Part 3"
echo "now running as:"
whoami
echo "SUDO_USER is:"
echo $SUDO_USER

这是sudo ./myscript.sh的输出

Part 1
now running as:
root
SUDO_USER is:
paul
Part 2
now running as:
paul
SUDO_USER is:
SUDO_USER=paul
Part 3
now running as:
root
SUDO_USER is:
paul

警告:这种技术不适用于嵌套的 sudo。如果 sudo 嵌套了两次,例如

sudo su

echo $SUDO_USER
---> me

sudo su
echo $SUDO_USER
---> root

SUDO_USER 将返回 root,而不是原始用户名。然后 su $SUDO_USER 将继续以 root 身份运行。小心避免这种情况,它应该可以正常工作。

【讨论】:

    【解决方案2】:

    这是我在脚本中运行它的方式。

    #! /bin/bash
    
    if [[ $EUID -ne 0 ]]; then
       echo "This script must be run as root";
       exit 1;
    else
        NON_ROOT_USER=$(who am i | awk '{print $1}');
        echo "root ran this echo.";
        sudo -u $NON_ROOT_USER echo "$NON_ROOT_USER ran this echo.";
    fi
    

    sudo ./script.sh

    【讨论】:

    • 酷。有趣的是,“who am i”和“whoami”返回不同的结果。
    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多