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

비밀번호없이 sudo로 무언가를 실행해야하므로 visudo를 사용하여 sudoers 파일 :

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

그런 다음 사용해 보았습니다.

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

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

Answer

당신 sudoers 파일에 다른 항목이 있으며 일반적으로 /etc/sudoers에 있습니다. , 사용자와도 일치합니다. NOPASSWD 규칙이 우선 적용 되려면 그 규칙 뒤에 있어야합니다.

그렇게 한 다음, sudo/path/to/my/program를 제외한 모든 명령에 대해 일반적으로 비밀번호를 입력하라는 메시지를 표시하며, 비밀번호를 묻지 않고 항상 실행할 수 있습니다.

댓글

  • /path/to/my/program가 파이썬 스크립트 인 경우에도 작동합니까?
  • 프로그램 이 가능합니까? 대신 bash에 대해 설정된 별칭 (예 : .bashrc)입니까? 아니면 /usr/local/sbin 안에 쉘 스크립트가 있습니까? 시도해보세요.
  • Nikos-아니요, 별칭이 될 수 없습니다. 실제 경로를 가리켜 야합니다.
  • sudoers? 어디에? 답변을 사용하는 것이 좋지만 (
  • @VasiliiSuricov : It ‘ 일반적으로 /etc에 있지만 일부 시스템에서는 다른 곳에서. ‘ 찾을 수없는 경우 man sudoers를 시도하세요. 해당 파일의 로컬 위치는 iv id = sudo 당시의 “cf19fd5844”>

페이지는 해당 시스템 용으로 제작되었습니다.

답변

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

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

, 프로그램이 루트로 실행되지만 다른 사용자로는 실행되지 않도록합니다. (의미를 고려하지 않는 한 필요한 최소 권한보다 더 많은 권한을 부여하지 마십시오.)

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

댓글

  • 예 : sudo로 jhon에서 루트로 이동 su an no pass —– > john ALL = (ALL) NOPASSWD : / bin / su
  • @adrian 임의의 명령을 다음과 같이 허용하려는 경우 루트, john ALL=(ALL) NOPASSWD: all로 만듭니다. ‘ su를 통해 이동할 필요가 없습니다.
  • 질문 : 쉘 스크립트의 권한을 변경해야합니까? 보안을 위해 루트 사용자 만 수정하고 읽을 수 있도록? 저는 ‘ 암호 없이도 모든 권한이 부여 된 스크립트를 수정하여 원하는 작업을 수행 할 수 있도록 공격자가 스크립트를 수정하는 것을 생각하고 있습니다. 분명히 공격자는 ‘ 어떤 스크립트가이 권한을 가지고 있는지 알기 위해 sudoers 파일을 읽을 수 없지만, 자신이있는 폴더를 찾으면 내 모든 사용자 지정 스크립트를 시도 할 수 있습니다. 일부가 허용되기를 바랍니다.
  • @JeffreyLebowski 스크립트를 직접 또는 간접적으로 실행하는 sudo 규칙이있는 경우 ‘ 루트 (또는 루트 권한이있는 사람) 만 스크립트 파일, 스크립트 파일이 포함 된 디렉토리 및 상위 디렉토리 등에 쓸 수 있어야합니다. 누구나 스크립트 파일을 읽을 수 있다는 것은 ‘ 문제가되지 않습니다 (비밀번호 등이 포함되어 있지 않으면 ‘ 나쁜 생각입니다. ‘ 비밀번호가있는 경우 자체 파일에 있어야합니다. 그렇지 않으면 ‘ 예 : 복사 등으로 인해 실수로 유출 될 위험이 너무 많습니다. 이 사이트의 질문에 해당 코드 섹션을 붙여 넣습니다.
  • @alper 아니요. 재부팅이 필요한 항목은 거의 없습니다. sudoers를 변경 한 후에는 ‘ 특별한 작업을 수행 할 필요가 없습니다. sudo가이를 확인합니다. 매번.

답변

경고 :이 답변은 안전하지 않은 것으로 간주되었습니다. 아래 설명 참조

완전한 솔루션 : 다음 단계는 원하는 결과를 얻는 데 도움이됩니다.

  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. 파일 :

      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/

댓글

  • 여기에 관련 단계를 제공하고 링크를 백업으로 사용하여 자세한 정보를 확인하는 것이 좋습니다. 이렇게하면 링크가 더 이상 유효하지 않더라도 답변이 가능한 가치를 유지할 수 있습니다.
  • 이 조언은 안전하지 않습니다. sudo chmod u+x create_dir.shsudo 부분은 사용자가 (아마도) 자신의 홈 디렉토리에 대한 소유권을 가지고 있으므로 불필요합니다. 사용자가 create_dir.sh에 쓸 수 있으므로 해당 사용자에게 무료 루트 셸을 효과적으로 제공했습니다.
  • @Lekensteyn 사용자로 실행되는 모든 프로그램에도 해당됩니다. . 사용자가 암호없이 sudo로 무엇이든 실행할 수 있도록 허용 할 수도 있습니다.
  • 누락 된 것이 있습니까? 저는 chmod 전체가 불필요하다고 생각합니다. sudo에 의존하여 권한을 높이고 있기 때문입니다.

답변

구문이 잘못된 것 같습니다. 적어도 저에게 맞는 다음을 사용합니다.

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

댓글

  • (ALL) 부분은 선택 사항이며 생략하면 똑같은 효과가 있습니다. 하지만 (root)가 있으면 더 좋을 수 있지만 ‘ 문제를 설명하지 않습니다.
  • sudo의 경우 +1 이 명령 만 있으면됩니다! 전체 시스템을 망가뜨릴 이유가 없습니다 …
  • @Johan : 이미 문제가되었습니다.

Answer

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

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

명령을 sudo없이 루트로 실행합니다.

댓글

  • 와,이 솔루션에 대해 들어 본 적이 없습니다. li>
  • @RyanNerd : 이것은 안전한 솔루션이 아닙니다. 이제 OP는 비밀번호없이 루트로 명령을 실행할 수있을뿐만 아니라 누구나 루트 사용자로 명령을 실행할 수 있습니다.
  • ” chmod 4775 filename “는 단방향입니다. 둘째, 전체 파일 권한을 다시 정의하지 않고 SETUID 를 수행하는 더 좋은 방법은 ” chmod u + s 파일 이름 ”
  • sudo chmod 005는 안전합니다. ‘ 현재 사용자에게 쓰기 권한을 부여하고 싶지 않습니다. 그렇지 않으면 세션의 모든 사람이 스크립트로 무엇이든 할 수 있습니다.

답변

만자로와 같은 배포판이있는 경우 , 먼저 / 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 

QUICK 참고 : 인증없이 SUDO를 사용하기 위해 문을 열고 있습니다. 시스템의 모든 것을 수정하고 책임감있게 사용합니다.

Answer

sudo가 별칭이 아닌지 확인하십시오. 다음과 같이 실행

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

예를 들어 다음과 같은 셸 별칭 :

alias sudo="sudo env PATH=$PATH" 

이 동작이 발생할 수 있습니다.

댓글

  • 맞습니다. 제 댓글이 여기 에서 잘못되었습니다. 죄송합니다. . 그럼에도 불구하고 ‘ m 흥미 롭습니다. 앨리어싱이 sudo에 의한 sudoers의 처리를 어떻게 변경하기를 기대하십니까? 아니면 sudo를 항상이 오류 메시지를 인쇄하여 암호를 알아내는 것으로 리디렉션하는 것에 대해 이야기하고 있습니까? 여기에서는 그럴 것 같지 않습니다 …
  • OP와 같은 문제가있었습니다. 내 ~/.bashrcalias sudo="sudo env PATH=$PATH"가있는 것으로 밝혀졌습니다. 그냥 직접 해결하고 맹목적으로 내 사업을 진행하는 대신이 스레드와 함께 제공되는 다른 사람을 위해 가능한 해결책으로 내 답변을 제출했습니다.
  • 그 ‘는 괜찮지 만 명확하지 않은 경우 (이 경우에는 ‘ 적어도 일부 사람들에게는 아님) 답변에 설명을 넣어 컨텍스트를 제공하는 것이 좋습니다. 사람들이 마법 주문을 맹목적으로 사용하는 것을 방지합니다. +2 (-(-1) + +1). 🙂

답변

스크립트를 실행할 때 .

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

시각적 암호 프롬프트를 표시합니다.

루트 권한으로 작업을 실행해서는 안되며 시스템을 변경하지 않도록 시스템을 더 멀리 변경해야한다는 생각을 고려해야합니다. 루트 권한이 전혀 필요하지 않습니다.

댓글

  • 쉘 스크립트를 setuid로 만들지 마십시오 . 셸 스크립트에서 setuid 허용 을 참조하세요.
  • ‘ 때문에 언급조차하지 않았습니다. 정말 나쁜 선택입니다. 나는 ‘이 질문자가 나쁜 조언이라는 경고에도 불구하고 조언을 사용 할까봐 걱정되어 삭제했습니다!

Answer

이 방법으로 문제가 해결되었습니다 (도움이 될 수있는 다른 답변도 시도해 보았습니다).

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

또한 제가 의심 (미래 독자를 위해 명확하게) : 스크립트를 sudo로 실행해야합니다. 스크립트를 호출 할 때 sudo를 입력합니다. 실제로 루트가 필요한 스크립트 내부 명령에 sudo를 사용하지 마십시오 (제 경우에는 키보드 백라이트 변경).이 방법도 작동하지만 그럴 필요는 없습니다. 하지 않는 것이 더 나은 해결책 인 것 같습니다.

댓글

  • 두 번째 문단이 내 문제에 대한 답을 찾았습니다
  • @MuhammadAhmadZafar Glad 도움이되었습니다!
  • 실제로 스크립트 내부에서 sudo를 사용하는 것은 적절한 권한 (sudoers에서 설정)이있는 경우 완벽하게 괜찮습니다. div>)를 사용하여 비밀번호없이 문제의 명령을 실행합니다. 좀 더 안전 해집니다.
  • 이 답변을 단계별로 다시 작성하여 실제로 사용할 수 있습니다. ‘ 이렇게하는 방법입니다. ‘ 다른 답변과의 대화보다는
  • @WalrustheCat 좋은 점입니다. 내 대답을 다시 읽으면 나 자신이 약간 혼란 스러웠을 것 같습니다. 하지만 지금은 ‘ 정확한 상황이 무엇인지 기억하지 못하기 때문에 ‘ 더 나은 글을 작성할 수 없습니다. 여러 답변을 조합하여 알아 낸 경우 반드시 새로운 답변을 제출하십시오!

답변

또 다른 가능성은 super 명령으로 스크립트를 실행할 수 있습니다.

super /path/to/your/script 

일부 바이너리를 실행하려는 경우 실행 가능 (예 : 일부 C 소스 코드에서 ELF 바이너리로 컴파일 한 경우)- 스크립트가 아닙니다 -루트로서 setuid (실제로는 /bin/login, /usr/bin/sudo/bin/susuper는 모두 해당 기술을 사용합니다.) 그러나 매우주의하십시오. 큰 보안 허점을 열 수 있습니다 .

실제로 프로그램은 편집증 적으로 코딩되어야합니다 (그러므로 ” 행동 ” 전에 모든 인수와 환경 및 외부 조건을 확인하여 잠재적으로 적대적인 사용자로 가정). seteuid (2) 및 친구들 ( setreuid (2) 참조)을 신중하게 사용할 수 있습니다 ( capabilities (7) & 자격 증명 (7) 참조 & execve (2) …)

당신은 이러한 바이너리를 설치할 때는 chmod u+s ( chmod (1) 읽기)를 사용하세요.

하지만 조심하세요 .

setuid 에 대해 고급 Linu x 프로그래밍 , 코딩하기 전에

스크립트 또는 shebang -ed 물건, setuid 수 없습니다. 하지만이를 감싸는 작은 setuid-binary를 C로 코딩 할 수 있습니다.

Linux에서 애플리케이션 코드는 Linux 커널

과 상호 작용합니다. a> syscalls (2) 사용. 대부분은 실패 할 수 있습니다. errno (3) 를 참조하세요. 많은 Linux 애플리케이션 (예 : GNU bash , GNU make , GNU gdb , GNOME )은 오픈 소스입니다. 소스 코드를 다운로드 한 후 연구하고 기여할 수 있습니다.

댓글

  • 고급 Linux 프로그래밍은 죽은 링크입니다.

답변

이상적으로 sudo를 통해 실행할 수있는 명령을 사용자 정의하는 경우 iv id = 아래의 별도 파일에서 이러한 변경을 수행해야합니다. sudoers 파일을 직접 편집하는 대신 “70b7afbe19”>

. 또한 항상visudo를 사용하여 파일을 편집해야합니다.ALL명령에 대해NOPASSWD를 부여해서는 안됩니다.

예 : 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를 사용하여 사용할 최상의 “마지막”문자 접두어를 결정합니다. be.

답변

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

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

/etc/sudoers

% sudo 를 만드세요.

댓글

  • ‘ sudo 규칙을 달성하는 한 가지 방법이지만 ‘이 규칙에 NOPASSWD 플래그를 설정해도 여전히 암호 프롬프트가 표시되는 이유에 대한 질문에 대답하지 마십시오. 원인을 알아 보려면 허용 된 답변을 참조하세요.

답변

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

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

그러나 구조가 command option1 value1 인 경우, 여기서 value1는 다양 할 수 있으며 value1의 가능한 각 값에 대해 명시적인 sudoer 행이 있어야합니다. 쉘 스크립트는이를 해결하는 방법을 제공합니다.

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

  1. sudo없이 명령을 호출합니다.
  2. 스크립트를 루트 권한 폴더 (예 : /usr/local/bin/)에 저장하고 다른 사용자에 대한 쓰기 액세스 권한이없는 루트 소유 파일 (예 : chown root:wheel /usr/local/bin/script_name) (예 : chmod 755 /usr/local/bin/script_name)
  3. visudo를 사용하여 sudoer에 예외 추가 :

    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

PS 대부분의 스크립트는 필수가 아닌 입력 유효성 검사이므로 다음도 작동합니다.

 #!/bin/bash pmset displaysleep $1  

답변

또는 Python을 사용할 수 있습니다. pudo 패키지.

설치 :

user$ sudo -H pip3 install pudo # you can install using pip2 also 

다음은 루트 권한으로 명령을 실행하기 위해 Python 자동화에서 사용하는 코드 스 니펫입니다.

user$ python3 # or python2 >>> import pudo >>> (ret, out) = pudo.run(("ls", "/root")) # or pudo.run("ls /root") >>> print(ret) >>> 0 >>> print(out) >>> b"Desktop\nDownloads\nPictures\nMusic\n" 

다음은 루트 권한으로 명령을 실행하는 cmd 예제입니다.

user$ pudo ls /root Desktop Downloads Pictures Music 

답변

/ etc / 안에있는 스크립트 sudoers에서 아래 줄의 주석 처리를 제거하십시오.

#includedir /etc/sudoers.d

/etc/sudoers.d/ 디렉토리 내에 임의의 이름으로 하나의 파일을 만들고 최대 답변에 제공된 내용을 추가합니다. 모든 사용자를 루트로 사용

#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

이것은 루트 권한으로 스크립트를 실행하는 가장 안전한 방법입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다