비대화형 스크립트의 sudo

비대화형 스크립트의 sudo

세 가지 기능을 수행하는 스크립트가 있습니다: A && B && C.

이 함수는 B슈퍼유저로 실행되어야 하지만, 그렇지 A않습니다 C.

여러 가지 해결책이 있지만 그 중 어느 것도 만족스럽지 않습니다.

  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이 예에서는 include 로 가정합니다 /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

관련 정보