非交互式脚本中的 sudo

非交互式脚本中的 sudo

我有一个执行三个功能的脚本:A && B && C.

函数B需要以超级用户身份运行,而 whileAC不需要。

我有几个解决方案,但这些都不能令人满意:

  1. sudo 整个脚本:sudo 'A && B && C'

    如果不需要的话,以超级用户身份A运行似乎是一个坏主意C

  2. 使脚本具有交互性:A && sudo B && C

    我可能必须输入密码,但我希望我的脚本是非交互式的,因为每个函数都可能需要一些时间,而且我不希望脚本等待我。嗯,这也是为什么它首先是一个脚本,所以我不必看着它运行。

  3. 愚蠢的解决方案:sudo : && A && sudo -n B && C

    首先,首先运行一个空操作似乎很愚蠢sudo,而且我必须祈祷 A 不会花费超过$sudo_timeout

  4. 假设的解决方案(我希望你告诉我它存在):

    sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'

    这会在开始时提示我输入密码,然后仅在需要时使用该凭据。

您对这一切有何看法?我很惊讶这个问题没有解决方案,因为我认为这是一个非常常见的问题(怎么样make all && sudo make install

答案1

将脚本添加到/etc/sudoers具有该NOPASSWD属性的文件中,以便允许其运行而无需提示输入密码。您可以将其绑定到特定用户(或一组用户),或者允许sudo系统上的任何人运行它。

名为的脚本的示例行/usr/local/bin/bossy可能看起来像这样

ALL ALL = (root) NOPASSWD: /usr/local/bin/bossy

然后你会使用这样的东西

A && sudo bossy && C

对于这个例子,我假设PATH包括/usr/local/bin.如果没有,则只需使用脚本的完整路径,即sudo /usr/local/bin/bossy

答案2

我认为您可以做的最好的事情是使用 启动脚本,然后使用或sudo显式启动您想要作为普通用户运行的进程:su usersudo -u user

#!/usr/bin/env bash

## Detect the user who launched the script
usr=$(env | grep SUDO_USER | cut -d= -f 2)

## Exit if the script was not launched by root or through sudo
if [ -z $usr ] && [ $UID -ne 0 ]
then
    echo "The script needs to run as root" && exit 1
fi

## Run the job(s) that don't need root
sudo -u $usr commandA

## Run the job that needs to be run as root
commandB

答案3

您可能想要使用该!requiretty选项sudo以及该NOPASSWD选项。但请记住,这会降低安全性。

答案4

傻点吧。使用很多行。

if A; then

    if sudo B ; then
        C
    fi
fi

相关内容