bash 스크립트에서 sudo를 사용하는 모범 사례


11

필자는 파일 소유권 등을 엉망으로 만들 수 있기 때문에 대부분의 명령을 sudo 전에 일반 사용자로 실행 해야하는 반면 명령을 루트로 실행 해야하는 길고 오래 실행되는 bash 스크립트가 있습니다.

나는 몇 가지 방법을 생각해 냈지만 각각의 방법에는 문제가 있습니다

방법 1 : 파일 내에서 sudo 사용

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

이것은 코드 작성 방식에서 좋아 보일 것입니다. sudo실제로 루트로 실행해야하는 몇 개의 명령문 앞에 작성되지만 각 sudo호출 사이의 시간 이 너무 길면 sudo다시 암호를 요청합니다. 또한 sudo잘못된 암호 등으로 인해 첫 번째 실행에 실패한 경우 나머지 스크립트는 계속 실행됩니다.

방법 2 : sudo를 사용하여 파일을 호출 한 다음 필요할 때 원래 사용자로 다시 변경

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

su username -c거의 모든 라인 앞에 추가해야하기 때문에 이것도 짜증납니다 . 나중에 원래 사용자 이름을 찾는 sudo것도 가능하지만 번거 롭습니다.

더 좋은 방법이 있습니까?

편집 : 나는 내가 말하고있는 것을 보여주기 위해 작고 무의미한 스크립트 만 게시했습니다. 실제 스크립트에는 sudo (서비스 시작 및 중지)가 필요한 줄이 있습니다. sudo가 있는지 여부와 상관없이 sudo가 필요하지 않은 줄이 있습니다.


4
이것은 거의 필요하지 않습니다. 대부분의 경우 sudo상승 된 권한이 필요한 경우 스크립트를 실행하면됩니다 . 그러나 su username -c를 실행하도록 전환 할 필요는 없습니다 echo. 다시 말해 이것은 [XY]처럼 들립니다. 당신이 할 수 편집 및 스크립트가 실제로 일을 할 것입니다 무엇을 설명하고 왜 그렇게 자주 사용자를 전환 할 필요가 기분이?
terdon

1
@ElderGeek 잘못된 링크를 붙여 넣었습니까? 그것은 관련이없는 것 같습니다. 이것은 아마도 스크립트 내에서 'sudo'명령어떻게 실행합니까? 그러나 OP가 조금 더 설명 할 수 있기를 바랍니다.
terdon

@terdon 그렇게 보일 것입니다. 청소.
Geek

이것은 단지 예제 스크립트입니다. 여기에 200 + 라인 스크립트를 붙여 넣고 싶지 않았습니다. 자세한 내용은 답변을 편집하겠습니다.
Dakkaron

man sudo?에 설명 된 validate 옵션을 고려 했습니까 ? -v, --validate '필요한 경우 사용자를 인증하여 사용자의 캐시 된 자격 증명을 업데이트하십시오. sudoers 플러그인의 경우 기본적으로 sudo 제한 시간이 15 분 더 연장되지만 명령은 실행되지 않습니다. 모든 보안 정책이 캐시 된 자격 증명을 지원하지는 않습니다. ' (자주 실행하는 경우 sudo 인증 시간이 초과되지 않아야합니다.)
sudodus

답변:


5

방법 2와 관련하여 함수를 사용하는 것이 더 쉽습니다. 예를 들면 다음과 같습니다.

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERsudoer의 사용자 이름입니다. $(logname)대신 사용할 수도 있습니다 .

내 컴퓨터에서 실행 중 :

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

를 읽으면 다음을 man sudoers볼 수 있습니다.

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

따라서, 당신은 허용 할 수있는 regular호스트에서 machine1실행 command1하고 command2, 루트로 하지 않고 와 암호 인증 :

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

man -k sudo자세한 내용 은 각각을 읽으십시오 .


0

아마도 이것이 도움이 될 수 있습니다.

chmod 775 yourscript.sh

그런 다음 스크립트 내부에서 sudo를 사용할 수 있으며 (암호 프롬프트없이) 스크립트 내의 다른 명령에 sudo를 사용할 수 없습니다.


나는 그것이 작동하지 않을 것을 두려워한다. chmod 775파일 만 실행할 수 있으며 파일을 실행중인 사용자 나 권한을 변경하지 않습니다.
Dakkaron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.