it-swarm-ko.tech

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

비밀번호없이 Sudo로 뭔가를 실행해야하므로 visudo를 사용하여 sudoers 파일에 추가했습니다.

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

그런 다음 시도했습니다.

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

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

175
LanceBaynes

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

그렇게하면 Sudo/path/to/my/program를 제외한 모든 명령에 대해 일반적으로 암호를 묻습니다. 암호를 묻지 않고 항상 실행할 수 있습니다.

97
Warren Young

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

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

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

우분투를 실행하지 않거나 기본 Sudo 구성을 변경 한 독자를위한 참고 사항 (우분투의 Sudo는 기본적으로 괜찮습니다) : 높은 권한으로 쉘 스크립트 실행 위험합니다. 깨끗한 환경에서 시작해야합니다 (Shell이 ​​시작되면 너무 늦습니다 ( Shell 스크립트에서 setuid 허용 참조). 그래서 처리하려면 Sudo가 필요합니다). Defaults env_reset/etc/sudoers가 있거나이 옵션이 컴파일 타임 기본값인지 확인하십시오 (Sudo sudo -V | grep envReset the environment to a default set of variables가 포함되어야 함).

[~ # ~] 경고 [~ # ~] :이 답변은 안전하지 않은 것으로 간주되었습니다. 아래 의견을 참조하십시오

완전한 해결책 : 다음 단계는 원하는 출력을 얻는 데 도움이됩니다.

  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/

24
M. Ahmad Zafar

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

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

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

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

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

6
linuxgnuru

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를 사용하기위한 문을 열고 있습니다. 즉, 시스템에서 모든 것을 수정하는 모든 것을 실행할 수 있으며 책임을 가지고이를 사용할 수 있습니다.

5
Lyoneel

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

/usr/bin/Sudo /path/to/my/program

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

alias Sudo="Sudo env PATH=$PATH"

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

4
Sepero

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

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

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

2
Luc

스크립트를 실행할 때 Sudo /path/to/my/script.

Edit : 다른 답변에 대한 귀하의 의견을 바탕으로 아이콘에서이를 실행하려고합니다. .desktop 터미널과 마찬가지로 Sudo로 프로그램을 실행하는 파일입니다.

gtk-Sudo 시각적 암호 프롬프트가 표시됩니다.

루트 권한으로 실행해서는 안되며 루트 권한이 전혀 필요하지 않도록 시스템을 훨씬 더 멀리 변경하는 것이 더 좋은 방법이라고 생각해야합니다.

2
Caleb

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

super /path/to/your/script

바이너리를 실행하려면 실행 가능 (예 : ELF 일부 C 소스 코드에서 바이너리로 컴파일 한 경우) not 스크립트-루트로, 그것을 만드는 것을 고려할 수 있습니다 setuid (그리고 실제로 /bin/login, /usr/bin/Sudo/bin/susuper 모두 해당 기술을 사용합니다). 그러나 매우 조심해야합니다 거대한 보안 구멍을 열 수 있습니다 .

구체적으로, 당신의 프로그램은 편집 적으로 코딩되어야한다. (그래서 잠재적 인 적대적인 사용자를 가정하고, "연동하기 전에 모든 주장과 환경과 외부 조건을 점검하라"), seteuid (2) and friends를 사용할 수있다. 또한 setreuid (2) ) 신중하게 (참조 capabilities (7) & credentials (7) & execve (2) ...)

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

그러나 는 매우 조심해야합니다 .

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

스크립트 또는 Shebang -ed 사물은 setuid로 설정할 수 없습니다. 그러나 작은 setuid 이진을 감싸는 (C로) 코딩 할 수 있습니다.

1

이상적으로 Sudo를 통해 실행할 수있는 명령을 사용자 정의하는 경우 sudoers 파일을 직접 편집하는 대신 /etc/sudoers.d/ 아래의 별도 파일에서 이러한 변경을 수행해야합니다. 또한 파일을 편집하려면 항상 visudo를 사용해야합니다. NOPASSWD 명령에 ALL을 부여해서는 안됩니다.

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

귀하의 회선 부여 권한을 삽입하십시오 : myuser ALL= NOPASSWD: /path/to/your/program

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

출력에서 %groupyouarein ALL=(ALL) ALL 명령 전에 사용자 특정 NOPASSWD 명령이 표시되면 Sudo -l를 실행하여 사용자에게 부여 된 권한을 볼 수 있습니다. 비밀번호를 묻는 메시지가 표시됩니다.

이 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 etc 또는 ABC를 인쇄 한 다음 abc를 인쇄하여 가장 적합한 "마지막"을 결정하십시오. 사용할 문자 접두어입니다.

0
dragon788

또는 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
0
Madhusudhan Kasula

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

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

/etc/sudoers

% Sudo로 만드십시오.

0
ultimatex

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

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

그러나 구조가 command option1 value1이고 value1가 다를 수있는 경우 가능한 각 value1 값에 대해 명시적인 sudoers 행이 있어야합니다. 쉘 스크립트는 그 주위에 방법을 제공합니다.

이 답변은 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를 사용하여 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 
0
Koit Saarevet