답변:
sudoers
파일에 사용자와 일치하는 다른 항목 이 있습니다. NOPASSWD
규칙은 우선하기 위해서는 그 일 이후에 할 필요가있다.
이 작업을 수행 sudo
하면를 제외한 모든 명령에 대해 일반적으로 비밀번호를 묻는 메시지가 표시되며 비밀번호 /path/to/my/program
를 묻지 않고 항상 실행할 수 있습니다.
.bashrc
? 또는 내부의 쉘 스크립트 /usr/local/sbin
? 시도해보십시오.
/etc
있지만 일부 시스템은 다른 곳에 배치합니다. 찾을 수 없으면를 시도하십시오 man sudoers
. 해당 파일의 로컬 위치 는 해당 시스템에 대해 빌드 man
될 당시 페이지 로 대체되어야합니다 sudo
.
에 일치하는 항목이 여러 개인 경우 /etc/sudoers
sudo는 마지막 항목을 사용합니다. 따라서 비밀번호 프롬프트로 명령을 실행할 수 있고 비밀번호 프롬프트없이 특정 명령을 실행할 수 있으려면 마지막 예외가 필요합니다.
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
).
john ALL=(ALL) NOPASSWD: all
. 를 통해 갈 필요가 없습니다 su
.
sudoers
는 특별한 작업을 수행 할 필요가 없습니다 sudo
. 매번 확인하십시오.
완벽한 솔루션 : 다음 단계는 원하는 출력을 얻는 데 도움이됩니다.
새 스크립트 파일을 작성하십시오 ( create_dir.sh
원하는 스크립트 이름으로 바꾸 십시오).
vim ~/create_dir.sh
스크립트는 사용자의 홈 디렉토리에 생성됩니다
루트 디렉토리 레벨에서 폴더 작성과 같이 root
또는 sudo
사용자 만 실행할 수 있는 명령을 추가하십시오 .
mkdir /abc
참고 :sudo
이 명령에 추가하지 마십시오 . 저장 후 종료 (을 사용하여 :wq!
)
다음을 사용하여 실행 권한을 지정하십시오.
sudo chmod u+x create_dir.sh
이 스크립트에 비밀번호가 필요하지 않도록 변경하십시오.
열려있는 sudoers
파일을 :
sudo visudo -f /etc/sudoers
끝에 다음 줄을 추가하십시오.
ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
대체 ahmad
사용자 이름이 무엇이든 함께. 또한 이것이 마지막 줄인지 확인하십시오. 저장 및 종료.
이제 명령을 실행할 때 sudo
다음과 같이 추가하십시오 .
sudo ./create_dir.sh
암호를 묻지 않고 스크립트 파일 내에서 명령을 실행합니다.
여기에 언급 된 쉬운 단계를 따르십시오 http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/
sudo
의 일부는 sudo chmod u+x create_dir.sh
사용자가 그 / 그녀의 홈 디렉토리 이상 (아마도) 소유권이 불필요한입니다. 사용자가에 쓸 수 있으므로 해당 사용자 create_dir.sh
에게 무료 루트 셸을 효과적으로 부여했습니다.
chmod
당신이 sudo
당신의 특권을 높이기 위해 의존 하기 때문에 전체 가 불필요 하다고 생각합니다 .
sudo를 사용하지 않고 sudoers 구성 파일을 변경하지 않으려면 다음을 사용할 수 있습니다.
sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME
이렇게하면 sudo가 없어도 명령이 루트로 실행됩니다.
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를 사용하기위한 문을 열고 있습니다. 즉, 시스템에서 모든 것을 수정하는 모든 것을 실행할 수 있으며 책임을 가지고이를 사용할 수 있습니다.
sudo의 별명이 지정되지 않았는지 확인하십시오. 이런 식으로 실행
/usr/bin/sudo /path/to/my/program
예를 들어 다음과 같은 쉘 별명 :
alias sudo="sudo env PATH=$PATH"
이 행동을 일으킬 수 있습니다.
sudoers
sudo 의 처리를 바꿀 것으로 기대합니까? 아니면 sudo
항상이 오류 메시지를 인쇄하여 암호를 퍼내는 것으로 리디렉션 하는 것에 대해 이야기하고 있습니까? 그것은 사실이 아닐 것입니다 ...
alias sudo="sudo env PATH=$PATH"
내에서 ~/.bashrc
. 나는 그것을 스스로 해결하고 맹목적으로 내 사업을 진행하기보다는이 스레드를 따르는 다른 사람을 위해 가능한 해결책으로 내 대답을 제출했습니다.
스크립트를 실행할 때는 다음과 같이 스크립트를 실행해야합니다 sudo /path/to/my/script
.
편집 : 다른 답변에 대한 귀하의 의견을 바탕으로 아이콘 에서이 답변을 실행하려고합니다. .desktop
터미널에서와 같이 sudo로 프로그램을 실행 하는 파일 을 만들어야합니다 .
gtk-sudo
시각적 암호 프롬프트 사용 을 고려할 수도 있습니다 .
루트 권한으로 실행해서는 안되며 루트 권한이 전혀 필요하지 않도록 시스템을 훨씬 더 멀리 변경하면 더 나은 방법이 될 수 있습니다.
이것은 나를 위해 문제를 해결했습니다 (도움이되었을 수있는 다른 답변 중 일부를 시도했습니다).
내가 호출 한 스크립트 /usr/bin
는에 쓰기 권한이없는 디렉토리에 있었습니다 (보통 파일을 읽을 수는 있지만). 스크립트는 chmodded + x (실행 가능한 permisison)이지만 여전히 작동하지 않습니다. 이 파일을 홈 디렉토리의 경로로 이동하는 대신 /usr/bin
비밀번호를 입력하지 않고 sudo로 파일을 호출 할 수있었습니다.
또한 내가 의심했던 것 (미래의 독자를 위해 명확히 함) : 스크립트를 sudo로 실행해야합니다. 스크립트를 호출sudo
할 때 입력 하십시오. 실제로 루트가 필요한 스크립트 내 명령 에는 사용하지 마십시오 (필자의 경우 키보드 백라이트 변경). 아마도 그것은 효과가 있지만 필요하지 않으며 더 나은 해결책이 아닌 것 같습니다.sudo
sudo
수있는 적절한 권한이있는 경우 실제로 스크립트 내부를 사용하는 것이 좋습니다 sudoers
. 좀 더 안전합니다.
또 다른 가능성은 설치, 구성 및 super 명령을 사용하여 다음 과 같이 스크립트를 실행하는 것입니다.
super /path/to/your/script
당신은 어떤 바이너리 실행하려면 실행 (당신이로 컴파일 한 예를 들어 ELF 입니다 - 어떤 어떤 C 소스 코드와 바이너리) 하지 루트로는 스크립트를, 당신은 수도 가 제작을 고려 하여 setuid (실제로 /bin/login
, /usr/bin/sudo
과 /bin/su
및 super
모든 기술을 사용하는 ). 그러나 매우 조심하십시오 . 거대한 보안 허점을 열 수 있습니다 .
구체적으로는, 프로그램이 paranoically 코딩해야합니다, 당신은 사용할 수 있습니다 (그래서 잠재적 적대 사용자를 가정, "행동"전에 모든 인수 및 환경과 외부 조건을 확인) seteuid로를 (2) 과 친구 (참조 또한 setreuid는 (2) )주의 ( 기능 (7) 및 자격 증명 (7) 및 execve (2) 참조) ...
당신은 사용합니다 chmod u+s
(읽기 chmod를 (1) 설치할 때 이러한 바이너리).
그러나 매우 조심하십시오 .
그러한 것을 코딩하기 전에 Advanced Linux Programming을 포함하여 setuid 에 대한 많은 것을 읽으십시오 .
스크립트, 또는 어떤 것을 알 오두막 -ed 것은, setuid를 할 수 없습니다. 그러나 작은 setuid 이진을 감싸는 (C로) 코딩 할 수 있습니다.
이상적으로 실행할 수있는 명령을 사용자 정의하는 경우 파일을 직접 편집하는 대신 sudo
별도의 파일에서 이러한 변경 /etc/sudoers.d/
을 수행해야 sudoers
합니다. 또한 visudo
파일을 편집 할 때는 항상 사용해야 합니다. 당신은 부여해서는 안 NOPASSWD
에 ALL
명령.
예:
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}} | sort
와 printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort
현재의 언어 인쇄 여부를 확인하는 AaBbCc
등 또는 ABC
다음이 abc
사용하는 가장 "마지막"문자 접두사가 어떻게 될지를 결정합니다.
모든 사용자가 암호를 묻지 않고 sudo로 프로그램을 실행할 수 있도록 다음 줄을 추가 할 수 있습니다
%sudo ALL=(root) NOPASSWD: /path/to/your/program
...에서 /etc/sudoers
% sudo가 작성 한다는 점에 유의 하십시오.
다음은 옵션의 일부가 가변 인 특정 옵션 세트가있는 경우에만 비밀번호없이 명령 을 실행 하려는 경우 입니다. AFAIK sudoers 선언에서 변수 또는 값 범위를 사용할 수 없습니다. 즉, 명시 적으로 액세스를 허용 command option1
하지만 다음을 command option2
사용 하지는 않습니다 .
user_name ALL=(root) /usr/bin/command option1
구조 인 경우 만 command option1 value1
곳, value1
변화 할 수있다, 당신은 각각의 가능한 값에 대한 명시의 sudoers 라인을 가지고해야합니다 value1
. 쉘 스크립트는 그 주위에 방법을 제공합니다.
이 답변은 M. Ahmad Zafar의 답변에서 영감을 얻어 보안 문제를 해결합니다.
sudo
./usr/local/bin/
파일을 루트 소유 (예 :)로 만듭니다 .chown root:wheel /usr/local/bin/script_name
chmod 755 /usr/local/bin/script_name
visudo를 사용하여 sudoers에 예외를 추가하십시오.
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
스크립트를 실행하십시오 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
/path/to/my/program
파이썬 스크립트 인 경우에도 여전히 작동 합니까?