암호 프롬프트없이 특정 프로그램을 루트로 실행하는 방법은 무엇입니까?


169

암호없이 sudo로 무언가를 실행해야하므로 이것을 사용 visudo하고 sudoers파일에 추가했습니다 .

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

그런 다음 시도했습니다.

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

왜 암호를 요구합니까? 비밀번호를 요구하지 않고 루트가 아닌 사용자의 루트로 명령을 실행 / 사용하려면 어떻게해야합니까?

답변:


91

sudoers파일에 사용자와 일치하는 다른 항목 이 있습니다. NOPASSWD규칙은 우선하기 위해서는 그 일 이후에 할 필요가있다.

이 작업을 수행 sudo하면를 제외한 모든 명령에 대해 일반적으로 비밀번호를 묻는 메시지가 표시되며 비밀번호 /path/to/my/program를 묻지 않고 항상 실행할 수 있습니다.


6
/path/to/my/program파이썬 스크립트 인 경우에도 여전히 작동 합니까?
sadmicrowave

프로그램이 대신 bash에 설정된 별칭이 될 수 있습니까 .bashrc? 또는 내부의 쉘 스크립트 /usr/local/sbin? 시도해보십시오.
Nikos Alexandris

Nikos-아니요 별칭 일 수 없습니다. 실제 경로를 가리켜 야합니다.
Paul Hedderly

sudoers? 어디에? 답변을 사용하는 heawy (
Vasilii Suricov

@VasiliiSuricov : 일반적으로에 /etc있지만 일부 시스템은 다른 곳에 배치합니다. 찾을 수 없으면를 시도하십시오 man sudoers. 해당 파일의 로컬 위치 는 해당 시스템에 대해 빌드 man될 당시 페이지 로 대체되어야합니다 sudo.
워렌 영

135

에 일치하는 항목이 여러 개인 경우 /etc/sudoerssudo는 마지막 항목을 사용합니다. 따라서 비밀번호 프롬프트로 명령을 실행할 수 있고 비밀번호 프롬프트없이 특정 명령을 실행할 수 있으려면 마지막 예외가 필요합니다.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

(root)다른 사용자가 아닌 루트로 프로그램을 실행할 수 있도록 의 사용에 유의하십시오 . 의미를 생각하지 않는 한 필요한 최소값보다 많은 권한을 부여하지 마십시오.

Ubuntu를 실행하지 않거나 기본 sudo 구성을 변경 한 독자를위한 참고 사항 (기본적으로 Ubuntu의 sudo는 괜찮습니다) : 높은 권한으로 쉘 스크립트를 실행하는 것은 위험하므로 클린 환경에서 시작해야합니다 (쉘이 시작되면, 너무 늦었 으므로 ( 쉘 스크립트에서 setuid 허용 참조 )이를 처리하려면 sudo가 필요합니다. 당신이 있는지 확인 Defaults env_reset/etc/sudoers또는이 옵션 (컴파일시 기본값임을 sudo sudo -V | grep env포함한다 Reset the environment to a default set of variables).


3
예 : sudo su no no pass -----> john ALL = (ALL) NOPASSWD : / bin / su
bortunac

5
@adrian 임의의 명령을 루트로 허용하려면을 만드십시오 john ALL=(ALL) NOPASSWD: all. 를 통해 갈 필요가 없습니다 su.
Gilles

질문 : 보안을 위해 루트 사용자 만 셸 스크립트를 수정하고 읽을 수 있도록 쉘 스크립트의 권한을 변경해야합니까? 공격자가 암호를 요구하지 않고 부여 된 모든 권한을 가진 스크립트를 수정하는 공격자에 대해 생각하고 있습니다. 분명히 공격자는 sudoers 파일을 읽을 수 없어서 어떤 스크립트에이 권한이 있는지 알 수는 없지만 일부 사용자가 허용하기를 희망하는 스크립트가 저장된 폴더를 찾으면 모든 사용자 지정 스크립트로 시도 할 수 있습니다. .
Jeffrey Lebowski

1
@JeffreyLebowski 스크립트를 직접 또는 간접적으로 실행하는 sudo 규칙이있는 경우 루트 (또는 루트 권한이있는 사람) 만 스크립트 파일과 스크립트 파일이 포함 된 디렉토리 및 스크립트 파일에 쓸 수 있어야합니다. 부모 디렉토리 등. 스크립트 파일을 읽을 수 있는지 여부는 중요하지 않습니다 (암호 또는 기타 내용이 포함되어 있지 않는 한 암호는 자체 파일에 있어야합니다. 그렇지 않으면 실수로 유출 될 위험이 너무 높습니다). 이 사이트의 질문에 해당 코드 섹션을 복사하여 붙여 넣기).
Gilles

1
@alper 아니요. 재부팅해야 할 것은 거의 없습니다. 를 변경 한 후에 sudoers는 특별한 작업을 수행 할 필요가 없습니다 sudo. 매번 확인하십시오.
Gilles

24

경고 :이 답변은 안전하지 않은 것으로 간주됩니다. 아래 의견을 참조하십시오

완벽한 솔루션 : 다음 단계는 원하는 출력을 얻는 데 도움이됩니다.

  1. 새 스크립트 파일을 작성하십시오 ( create_dir.sh원하는 스크립트 이름으로 바꾸 십시오).

    vim ~/create_dir.sh
    

    스크립트는 사용자의 홈 디렉토리에 생성됩니다

  2. 루트 디렉토리 레벨에서 폴더 작성과 같이 root또는 sudo사용자 만 실행할 수 있는 명령을 추가하십시오 .

    mkdir /abc
    

    참고 :sudo 이 명령에 추가하지 마십시오 . 저장 후 종료 (을 사용하여 :wq!)

  3. 다음을 사용하여 실행 권한을 지정하십시오.

    sudo chmod u+x create_dir.sh
    
  4. 이 스크립트에 비밀번호가 필요하지 않도록 변경하십시오.

    1. 열려있는 sudoers파일을 :

      sudo visudo -f /etc/sudoers
      
    2. 끝에 다음 줄을 추가하십시오.

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      대체 ahmad사용자 이름이 무엇이든 함께. 또한 이것이 마지막 줄인지 확인하십시오. 저장 및 종료.

  5. 이제 명령을 실행할 때 sudo다음과 같이 추가하십시오 .

    sudo ./create_dir.sh
    

    암호를 묻지 않고 스크립트 파일 내에서 명령을 실행합니다.

여기에 언급 된 쉬운 단계를 따르십시오 http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/


여기에 관련 단계를 제공하고 자세한 정보를 위해 링크를 백업으로 사용하는 것이 좋습니다. 그렇게하면 더 이상 해당 링크가 유효하지 않더라도 귀하의 답변은 가능한 가치를 유지합니다.
Anthon

15
이 조언은 안전하지 않습니다. sudo의 일부는 sudo chmod u+x create_dir.sh사용자가 그 / 그녀의 홈 디렉토리 이상 (아마도) 소유권이 불필요한입니다. 사용자가에 쓸 수 있으므로 해당 사용자 create_dir.sh에게 무료 루트 셸을 효과적으로 부여했습니다.
Lekensteyn

1
@Lekensteyn 이는 사용자로 실행되는 모든 프로그램을 의미합니다. 또한 사용자가 비밀번호없이 sudo로 무엇이든 실행할 수 있습니다.
pydsigner

2
뭔가 빠졌습니까? 나는 chmod당신이 sudo당신의 특권을 높이기 위해 의존 하기 때문에 전체 가 불필요 하다고 생각합니다 .
G-Man

10

귀하의 구문이 잘못되었다고 생각합니다. 적어도 나는 다음을 사용합니다.

myusername ALL=(ALL) NOPASSWD: /path/to/executable

6
(ALL)부분은 그것을 밖으로 떠나는 것은 완전히 같은 결과가, 선택 사항입니다. 데는 (root)하지만 더 좋을 것이다, 그러나 그것의 부재는 문제를 설명하지 않습니다.
Gilles

이 명령에 대한 sudo는 +1이며 다른 것은 없습니다! 전체 시스템을 깰 이유가 없습니다.
Johan

3
@Johan : 그것은 이미 의문의 여지가있었습니다.
Gilles

5

sudo를 사용하지 않고 sudoers 구성 파일을 변경하지 않으려면 다음을 사용할 수 있습니다.

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

이렇게하면 sudo가 없어도 명령이 루트로 실행됩니다.


와우, 나는 마음을 불허 이전에이 솔루션을 들어 본 적이
somethingSomething

최상의 답변을 찾으려면 왜 이런 것들의 맨 아래로 스크롤해야합니까? 이 간단한 보안 솔루션에 감사드립니다.
RyanNerd

5

Manjaro와 같은 배포판이있는 경우, 먼저 / etc / sudoers의 정의를 대체하는 파일을 처리해야합니다. 파일을 삭제하거나 해당 파일을 직접 사용하여 새 구성을 추가 할 수 있습니다.

이 파일은 다음과 같습니다

sudo cat /etc/sudoers.d/10-installer

루트 권한으로 볼 수있는 유일한 방법은 디렉토리가 없으면이 디렉토리를 나열 할 수 없으며이 파일은 Manjaro에 특정합니다.이 이름은 다른 이름이지만 동일한 디렉토리에 있습니다.

선택한 파일에서 다음 줄을 추가하여 원하는 구성을 얻을 수 있습니다.

그룹 인증 무시

%group ALL=(ALL) NOPASSWD: ALL

또는 사용자의 인증을 무시합니다

youruser ALL=(ALL) NOPASSWD: ALL

또는 특정 사용자에 대한 실행 파일 인증 무시

youruser ALL=(ALL) NOPASSWD: /path/to/executable

빠른 참고 : 인증없이 SUDO를 사용하기위한 문을 열고 있습니다. 즉, 시스템에서 모든 것을 수정하는 모든 것을 실행할 수 있으며 책임을 가지고이를 사용할 수 있습니다.


4

sudo의 별명이 지정되지 않았는지 확인하십시오. 이런 식으로 실행

/usr/bin/sudo /path/to/my/program

예를 들어 다음과 같은 쉘 별명 :

alias sudo="sudo env PATH=$PATH"

이 행동을 일으킬 수 있습니다.


당신은 내 의견은 순서가 있었다 맞아 여기에 그 죄송합니다. 그럼에도 불구하고 나는 흥미 롭습니다. 어떻게 앨리어싱이 sudoerssudo 의 처리를 바꿀 것으로 기대합니까? 아니면 sudo항상이 오류 메시지를 인쇄하여 암호를 퍼내는 것으로 리디렉션 하는 것에 대해 이야기하고 있습니까? 그것은 사실이 아닐 것입니다 ...
peterph

2
OP와 같은 문제가있었습니다. 그것은 필요에 의한 것으로 밝혀졌다 alias sudo="sudo env PATH=$PATH"내에서 ~/.bashrc. 나는 그것을 스스로 해결하고 맹목적으로 내 사업을 진행하기보다는이 스레드를 따르는 다른 사람을 위해 가능한 해결책으로 내 대답을 제출했습니다.
Sepero

1
괜찮지 만, (이 경우 적어도 일부 사람들에게는 그렇지 않은) 분명하지 않은 경우, 어떤 맥락을 제공하고 사람들이 맹목적으로 마법의 주문을 사용하지 못하도록 설명을 해 두는 것이 좋습니다. +2 (-(-1) + +1). :)
peterph

2

스크립트를 실행할 때는 다음과 같이 스크립트를 실행해야합니다 sudo /path/to/my/script.

편집 : 다른 답변에 대한 귀하의 의견을 바탕으로 아이콘 에서이 답변을 실행하려고합니다. .desktop터미널에서와 같이 sudo로 프로그램을 실행 하는 파일 을 만들어야합니다 .

gtk-sudo시각적 암호 프롬프트 사용 을 고려할 수도 있습니다 .

루트 권한으로 실행해서는 안되며 루트 권한이 전혀 필요하지 않도록 시스템을 훨씬 더 멀리 변경하면 더 나은 방법이 될 수 있습니다.


7
쉘 스크립트를 setuid로 만들지 마십시오 . 쉘 스크립트에서 setuid 허용을 참조하십시오 .
Gilles

나는 그것이 나쁜 옵션이기 때문에 언급조차하지 않았다고 생각했습니다. 이 조언자가 나쁜 조언 이었다는 경고와 함께 조언을 사용할지도 모른다는 걱정 때문에 방금 삭제했습니다!
Caleb

2

이것은 나를 위해 문제를 해결했습니다 (도움이되었을 수있는 다른 답변 중 일부를 시도했습니다).

내가 호출 한 스크립트 /usr/bin는에 쓰기 권한이없는 디렉토리에 있었습니다 (보통 파일을 읽을 수는 있지만). 스크립트는 chmodded + x (실행 가능한 permisison)이지만 여전히 작동하지 않습니다. 이 파일을 홈 디렉토리의 경로로 이동하는 대신 /usr/bin비밀번호를 입력하지 않고 sudo로 파일을 호출 할 수있었습니다.

또한 내가 의심했던 것 (미래의 독자를 위해 명확히 함) : 스크립트를 sudo로 실행해야합니다. 스크립트를 호출sudo 할 때 입력 하십시오. 실제로 루트가 필요한 스크립트 내 명령 에는 사용하지 마십시오 (필자의 경우 키보드 백라이트 변경). 아마도 그것은 효과가 있지만 필요하지 않으며 더 나은 해결책이 아닌 것 같습니다.sudo


두 번째 단락은 내 문제에 대한 대답을했다
M. Ahmad Zafar

@MuhammadAhmadZafar 도움이되었습니다.
Luc

3
암호없이 문제의 명령을 실행할 sudo수있는 적절한 권한이있는 경우 실제로 스크립트 내부를 사용하는 것이 좋습니다 sudoers. 좀 더 안전합니다.
peterph

이 답변은 실제로 다른 답변과의 대화가 아닌 단계별 '이것이 어떻게되는지'입니다.
Walrus the Cat

@WalrustheCat 좋은 지적입니다. 내 대답을 다시 읽으면 약간 혼란스러워했을 것입니다. 그러나 지금은 정확한 상황이 무엇인지 기억이 나지 않아서 더 나은 글쓰기를 할 수 없습니다. 당신이 그것을 이해한다면, 아마도 여러 답변의 조합으로, 새로운 답변을 제출하십시오!
Luc

1

또 다른 가능성은 설치, 구성 및 super 명령을 사용하여 다음 과 같이 스크립트를 실행하는 것입니다.

super /path/to/your/script

당신은 어떤 바이너리 실행하려면 실행 (당신이로 컴파일 한 예를 들어 ELF 입니다 - 어떤 어떤 C 소스 코드와 바이너리) 하지 루트로는 스크립트를, 당신은 수도 가 제작을 고려 하여 setuid (실제로 /bin/login, /usr/bin/sudo/bin/susuper모든 기술을 사용하는 ). 그러나 매우 조심하십시오 . 거대한 보안 허점을 열 수 있습니다 .

구체적으로는, 프로그램이 paranoically 코딩해야합니다, 당신은 사용할 수 있습니다 (그래서 잠재적 적대 사용자를 가정, "행동"전에 모든 인수 및 환경과 외부 조건을 확인) seteuid로를 (2) 과 친구 (참조 또한 setreuid는 (2) )주의 ( 기능 (7)자격 증명 (7)execve (2) 참조) ...

당신은 사용합니다 chmod u+s(읽기 chmod를 (1) 설치할 때 이러한 바이너리).

그러나 매우 조심하십시오 .

그러한 것을 코딩하기 전에 Advanced Linux Programming을 포함하여 setuid 에 대한 많은 것을 읽으십시오 .

스크립트, 또는 어떤 것을 알 오두막 -ed 것은, setuid를 할 수 없습니다. 그러나 작은 setuid 이진을 감싸는 (C로) 코딩 할 수 있습니다.


0

이상적으로 실행할 수있는 명령을 사용자 정의하는 경우 파일을 직접 편집하는 대신 sudo별도의 파일에서 이러한 변경 /etc/sudoers.d/을 수행해야 sudoers합니다. 또한 visudo파일을 편집 할 때는 항상 사용해야 합니다. 당신은 부여해서는 안 NOPASSWDALL명령.

예: sudo visudo -f /etc/sudoers.d/mynotriskycommand

라인 허가 권한을 삽입하십시오 : myuser ALL= NOPASSWD: /path/to/your/program

그런 다음 저장하고 종료하고 visudo구문 오류가 있으면 경고합니다.

출력에 명령이 표시 되기 전에 sudo -l사용자 특정 NOPASSWD명령이 표시 %groupyouarein ALL=(ALL) ALL되면 암호를 묻는 메시지가 표시되면 사용자에게 부여 된 권한을 확인하기 위해 실행할 수 있습니다 .

이 sudoers.d 파일을 많이 만들면 사용자별로 이름이 지정된 파일을 만들어보다 쉽게 ​​시각화 할 수 있습니다. 파일 이름과 파일 내 규칙의 순서는 매우 중요합니다.로드 된 마지막 이름이 이전 항목보다 많거나 적을 지 여부에 관계없이 가장 먼저로드됩니다.

접두사 00-99 또는 aa / bb / cc를 사용하여 파일 이름 순서를 제어 할 수 있지만 숫자 접두사가없는 파일이 있으면 번호가 매겨진 파일 뒤에로드되어 재정의됨을 명심하십시오. 설정. 언어 설정에 따라 쉘에서 "어휘 정렬"이 먼저 정렬 번호를 사용한 다음 "오름차순"으로 정렬 할 때 대문자와 소문자가 인터리브 될 수 있기 때문입니다.

실행 해 printf '%s\n' {{0..99},{A-Z},{a-z}} | sortprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort현재의 언어 인쇄 여부를 확인하는 AaBbCc등 또는 ABC다음이 abc사용하는 가장 "마지막"문자 접두사가 어떻게 될지를 결정합니다.


0

모든 사용자가 암호를 묻지 않고 sudo로 프로그램을 실행할 수 있도록 다음 줄을 추가 할 수 있습니다

%sudo ALL=(root) NOPASSWD: /path/to/your/program

...에서 /etc/sudoers

% sudo가 작성 한다는 점에 유의 하십시오.


이것이 sudo 규칙을 달성하는 한 가지 방법이지만,이 규칙에서 NOPASSWD 플래그를 설정해도 여전히 암호 프롬프트가 표시되는 이유에 대한 질문에 대답하지 않습니다. 왜 그런 일이 일어 났는지에 대한 아이디어는 허용 된 답변을 참조하십시오.
Jeff Schaller

0

다음은 옵션의 일부가 가변 인 특정 옵션 세트가있는 경우에만 비밀번호없이 명령실행 하려는 경우 입니다. AFAIK sudoers 선언에서 변수 또는 값 범위를 사용할 수 없습니다. 즉, 명시 적으로 액세스를 허용 command option1하지만 다음을 command option2사용 하지는 않습니다 .

user_name ALL=(root) /usr/bin/command option1

구조 인 경우 만 command option1 value1곳, value1변화 할 수있다, 당신은 각각의 가능한 값에 대한 명시의 sudoers 라인을 가지고해야합니다 value1. 쉘 스크립트는 그 주위에 방법을 제공합니다.

이 답변은 M. Ahmad Zafar의 답변에서 영감을 얻어 보안 문제를 해결합니다.

  1. 없이 명령을 호출하는 쉘 스크립트를 작성하십시오 sudo.
  2. 스크립트를 루트 권한이있는 폴더 (예 :)에 저장하고 다른 사용자 (예 :)에 대한 쓰기 권한이없는 /usr/local/bin/파일을 루트 소유 (예 :)로 만듭니다 .chown root:wheel /usr/local/bin/script_namechmod 755 /usr/local/bin/script_name
  3. visudo를 사용하여 sudoers에 예외를 추가하십시오.

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. 스크립트를 실행하십시오 sudo script_name.

예를 들어, macOS에서 디스플레이 잠자기 시간 제한을 변경하고 싶습니다. 이것은 다음을 사용하여 수행됩니다.

sudo pmset displaysleep time_in_minutes

나는 암호 입력의 번거 로움을 정당화하지는 않지만 pmset많은 일을 할 수 있는 무고한 행동을 취침 시간 초과로 변경하고 다른 것들을 sudo 암호 뒤에 유지하고 싶습니다.

그래서 나는 다음과 같은 스크립트를 가지고있다 /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

sudoers파일 끝에 다음 줄이 있습니다.

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

시간 제한을 3 분으로 설정하려면 일반 사용자 계정에서 스크립트를 실행하십시오 user_name.

sudo ds 3

추신 : 대부분의 스크립트는 입력 유효성 검사이므로 필수는 아니므로 다음과 같이 작동합니다.

#!/bin/bash
pmset displaysleep $1 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.