비 대화식 스크립트의 sudo


9

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

기능 B요구는 슈퍼 사용자로 실행하는 동안 수 AC하지 않습니다.

몇 가지 솔루션이 있지만 둘 다 만족스럽지 않습니다.

  1. 전체 스크립트를 sudo : sudo 'A && B && C'

    실행하는 것은 좋지 않은 생각 A이며 C필요하지 않은 경우 수퍼 유저로 보입니다.

  2. 스크립트를 대화식으로 만듭니다. A && sudo B && C

    암호를 입력해야 할 수도 있지만 각 기능에 시간이 걸릴 수 있으므로 스크립트가 대화식이 아니기를 원하며 스크립트가 나를 기다리지 않기를 바랍니다. 글쎄, 그것이 또한 처음에 스크립트이기 때문에, 나는 그것이 실행되는 것을 볼 필요가 없습니다.

  3. 바보 같은 해결책 : sudo : && A && sudo -n B && C

    먼저 no-op를 sudo먼저 실행하는 것은 어리석은 것 같습니다. 또한 A보다 더 많이 걸리지 않을 것 $sudo_timeout입니다.

  4. 가상 솔루션 (존재한다고 말하고 싶습니다) :

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

    처음에는 암호를 묻는 메시지가 표시되고 필요할 때만 해당 자격 증명을 사용합니다.

이 모든 것에 대한 당신의 의견은 무엇입니까? 나는 그것이 매우 일반적인 문제 (무엇에 대한 생각으로 나는 매우, 그 문제에 대한 해결책이 없다는 것을 놀랄 것 make all && sudo make install)


3
sudo로 실행하는 스크립트를 만들 수 있지만 스크립트에서 A및을 C사용하여 명시 적으로 및 부분을 실행하십시오 su -l some_non_priviliged_user. 타임 아웃 문제가 없으며 A 및 C에 대한 권한이 없습니다. 4가 가능하다고 생각하지 않습니다 sudo. 사용자에게 "전역 상태" 인 것 같습니다.
Anthon

답변:


7

나는 당신이 할 수있는 최선의 방법은 스크립트 sudo를 시작한 다음 일반 사용자로 실행하려는 프로세스를 su user또는로 명시 적으로 시작하는 것입니다 sudo -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 ] && [ $USER = "root" ]
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

9

비밀번호를 묻지 않고 실행할 수 있도록 속성 을 사용하여 스크립트를 /etc/sudoers파일에 추가하십시오 NOPASSWD. 이를 특정 사용자 (또는 사용자 세트)와 묶거나 sudo시스템의 모든 사용자 가 실행할 수 있습니다.

라는 스크립트의 샘플 라인은 /usr/local/bin/bossy다음과 같습니다.

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

그리고 당신은 다음과 같은 것을 사용할 것입니다

A && sudo bossy && C

이 예제에서는 PATHinclude가 있다고 가정했습니다 /usr/local/bin. 그렇지 않다면 스크립트의 전체 경로를 사용하십시오.sudo /usr/local/bin/bossy


가장 안전한 접근 방식을 위해 공감하십시오.
eyoung100

0

!requiretty옵션 sudo뿐만 아니라 옵션도 사용할 수 있습니다 NOPASSWD. 그러나 이것은 보안을 저하시킵니다.


1
문제가 대화 형 스크립트를 원하지 않는 것으로 정의되기 때문에,와 # 2 /etc/sudoers명령을 실행하는 사용자에 대한 항목 B으로는 NOPASSWD정답이다.
Andrew

"X 또는 Y를 할 수 있습니다", "X 및 Y를 할 수 있습니다"입니다. 둘 다 문제를 해결할 것입니다. 아마도 대답을 다시 바꿔야 할 것입니다.
Steve Wills

0

sudo 사전 승인 에 대한 내 대답을 기반으로합니까? (나중에 실행할 수 있습니다) , 두 개의 스크립트를 작성하십시오.

  • ABC_script:

    #!/bin/sh
    sudo -b ./B_script
    A  &&  > A_is_done
    while [ ! -f B_is_done ]
    do
            sleep 60
    done
    rm -f B_is_done
    C
  • B_script:

    #!/bin/sh
    while [ ! -f A_is_done ]
    do
            sleep 60
    done
    rm -f A_is_done
    B  &&  > B_is_done

실행 ./ABC_script:

  • 실행 sudo -b ./B_script됩니다. 암호를 묻습니다 ( 실행 한 직후ABC_script ). 올바른 암호를 입력한다고 가정하면, 그것은 생성합니다 B_script에서 (때문에 ackground -b루트로 지정되었다). 이것은에 해당하는 것으로 보입니다 sudo sh -c "./B_script &".
  • B_script와 동시에 비동기식으로 실행을 시작합니다 ABC_scriptB_script호출 된 파일의 존재를 테스트 A_is_done 하고 나타날 때까지 반복합니다.
  • 동시에을 ABC_script실행 A합니다. 만약 / 때 A성공적으로 완료가 스크립트라는 파일을 만듭니다 A_is_done.
  • ABC_script그런 다음 호출 된 파일이 있는지 테스트 B_is_done 하고 나타날 때까지 반복합니다.
  • 동시에, 루프 B_script의 존재를 감지 A_is_done하고 루프를 벗어납니다. A_is_done파일을 삭제 하고 실행 B합니다. 기억 B_script이 실행되도록, 루트로 실행 B루트로. 만약 / 때 B성공적으로 완료가 스크립트라는 파일을 생성 B_is_done하고 종료합니다.
  • 동시에, 루프 ABC_script의 존재를 감지 B_is_done하고 루프를 벗어납니다. B_is_done파일을 삭제 합니다. 기억 B_script때문에, 루트로 달아 B_is_done루트가 소유, 사용하려는되는 rm -f확인에 대한 요청을 받고 피하기 위해. ABC_script그런 다음 실행 C하고 종료합니다.

추가 개선을위한 참고 사항 :

  • ABC_script아마도 B_script경로가 아닌 절대 경로로 실행되어야합니다 ./.
  • 보다는 A_is_done하고 B_is_done, ABC_script아마도 임의의 고유 파일 이름을 생성해야합니다.
  • 대기중인 프로그램이 완료되었지만 실패한 경우 스핀 대기중인 스크립트에 알림을 제공해야합니다. (지금 A실패하면 두 스크립트 모두 무한 대기 루프로 들어갑니다.) 이것은 변경하는 것만 큼 간단 할 수 있습니다.

    A  &&  > A_is_done

    A; echo $? > A_is_done

    그런 다음 spin-waits를 수정하여 X_is_done파일 을 읽고 0이 포함되어 있으면 진행하고 그렇지 않으면 종료합니다.


-3

멍청 해 많은 줄을 사용하십시오.

if A; then

    if sudo B ; then
        C
    fi
fi

그게 내 걱정을 어떻게 해결합니까? 문제와는 아무 상관이 없다&&
앙투안 부인용 외투

&&는 첫 번째 명령이 실패하면 실행을 중지합니다. if 문은 더 자세하게이 작업을 수행합니다. 내 요점은 예쁘지 않더라도 작업을 완료하는 것입니다.
Robert Jacobs

1
이것은 옵션 2의 더 장황한 버전에 지나지 않습니다 A && sudo B && C. Antoine이 질문에서 설명 하듯이; 이것은 A완료 될 때까지 암호를 요구하지 않으며, 암호 를 기다리거나 스크립트를 기다리지 않아도됩니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.