스크립트에서 / etc / sudoers를 어떻게 편집합니까?


116

/etc/sudoers화이트리스트에서 항목을 추가 / 제거하려면 스크립트에서 편집해야 합니다.

일반 파일에서 작동하는 명령이 있다고 가정하면 어떻게 적용 할 수 /etc/sudoers있습니까?

복사 및 수정 한 다음 visudo원본을 수정 된 사본으로 바꿀 수 있습니까? 내 자신의 스크립트를 제공하여 $EDITOR?

아니면 동일한 잠금 장치를 사용할 수 cp있습니까?

문제는 단순히 작동하는 것을 찾는 것보다 잠재적 인 문제에 관한 것입니다.

답변:


146

오래된 스레드, 그러나 어떨까요?

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo

10
이것은 훌륭한 대답입니다. 전체 서브 쉘은 루트로 실행되어야합니다 echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon

3
이 답변은 훌륭하게 작동합니다! 데비안 패키지의 postinst skripts에 사용합니다. 감사! 이 루트는 항상이기 때문에, 짧고 편리 가져옵니다echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
보리스 Däppen

3
@ BorisDäppen의 대답에 대한 주요 뉘앙스를 지적하고 싶습니다. -a플래그 EDITOR="tee": 첫 번째 줄을 덮어 쓸뿐만 아니라 파일에 줄을 추가합니다. 처음에는 다른 점을 파악하지 못했고 추가하는 방법을 알 수 없었습니다. 내가 지정하여 어떤 사람들에게 약간의 시간을 찾을 수 있기를 바랍니다 직접 ;-) 그
장 - 필립 머레이

3
누군가이 작업이 EDITOR = 'tee -a'뒤에 필요한 세미콜론이 아니라는 것을 어떻게 설명 할 수 있습니까? 나는 그것이 명령을 어길 것이라는 것을 압니다. EDITOR는 쉘 변수이고 visudo는 또 다른 명령이므로 여기서는 동일한 명령 줄에서 EDITOR와 visudo를 전달합니다. 실제로 어떻게 작동합니까?
Sagar

1
나는 이것을 x = "something"echo $ x 시도했다. 이것은 나를 위해 작동하지 않았습니다.
Sagar

43

이를 위해 사용자 정의 편집기로 visudo를 사용하십시오. 이것은 Brian의 솔루션으로 모든 경쟁 조건과 "해킹"문제를 해결합니다.

#!/bin/sh
if [ -z "$1" ]; then
  echo "Starting up visudo with this script as first parameter"
  export EDITOR=$0 && sudo -E visudo
else
  echo "Changing sudoers"
  echo "# Dummy change to sudoers" >> $1
fi

이 스크립트는 sudoers 끝에 "# Dummy change to sudoers"줄을 추가합니다. 해킹이나 경쟁 조건이 없습니다.

이것이 실제로 어떻게 작동하는지 설명하는 주석이 달린 버전 :

if [ -z "$1" ]; then

  # When you run the script, you will run this block since $1 is empty.

  echo "Starting up visudo with this script as first parameter"

  # We first set this script as the EDITOR and then starts visudo.
  # Visudo will now start and use THIS SCRIPT as its editor
  export EDITOR=$0 && sudo -E visudo
else

  # When visudo starts this script, it will provide the name of the sudoers 
  # file as the first parameter and $1 will be non-empty. Because of that, 
  # visudo will run this block.

  echo "Changing sudoers"

  # We change the sudoers file and then exit  
  echo "# Dummy change to sudoers" >> $1
fi

5
이를 위해서는 sudo가로 컴파일되어야합니다 --enable-env-editor. 그렇지 않으면 알려진 값의 작은 집합 중 하나 인 경우에만 편집기 변수 존중을 사용합니다.
Caleb

나를 위해 작동하지만 (Ubuntu 12.04) 작동 방식을 이해하지 못합니다. 누군가가 그것을 올바르게 사용하는 방법과 실제로 어떻게 작동하는지 설명 할 수 있습니까? 감사합니다
MountainX

이것이 12.04에서 정확하게 작동하지 않는 것 같습니다. bash 스크립트를 작성하고 + x 권한을 추가하고 다음 출력으로 파일을 실행했습니다. visudo : cannot run / tmp / edit_sudoers : Exec format error visudo : /etc/sudoers.tmp unchanged
Jose Diaz-Gonzalez

이것은 단순히 루트로 로그인하고 sudo -E첫 번째 명령에서 제거했지만 이것은 나를 위해 훌륭하게 작동했습니다 .
merlin2011 2014

이 답변이 정말 마음에 들었지만 저에게는 효과가 없었습니다. 내 sudo가 필요한 플래그로 컴파일되지 않은 것 같습니다.
Mnebuerquo

30

임시 파일을 편집 한 다음 visudo -c -f sudoers.temp를 사용하여 변경 사항이 유효한지 확인한 다음 / etc / sudoers 위에 복사해야합니다.

#!/bin/sh
if [ -f "/etc/sudoers.tmp" ]; then
    exit 1
fi
touch /etc/sudoers.tmp
edit_sudoers /tmp/sudoers.new
visudo -c -f /tmp/sudoers.new
if [ "$?" -eq "0" ]; then
    cp /tmp/sudoers.new /etc/sudoers
fi
rm /etc/sudoers.tmp

sudoers.tmp를 잠금 파일로 사용하는 것처럼 보이지만 변경 사항이 유효한지 확인하는 방법이 확실하지 않습니다. 오류가 없는지 확인하기 위해 visudo의 종료 상태를 확인해야하지 않습니까?
converter42

/etc/sudoers.tmp는 대화식 모드에서 visudo가 확인한 잠금 파일입니다. visudo -c -f는 오류가있는 경우 1을 반환하므로 반환 코드를 확인합니다.
Brian C. Lane

visudo의 내부 인터페이스, 즉 해킹을 사용하는 것처럼 보이기 때문에 sudoers.tmp를 사용하는 것이 걱정됩니다. 잠금으로 사용되는 sudoers.tmp가 항상 보장된다는 것을 의미하는 표준입니까? 아니면 미래에 그것을 바꿀 자유가 있습니까?
n-alexander

2
테스트 / 터치 대신 잠금 파일을 사용해야 함
n-alexander

2
맨 페이지에는 /tmp/sudoers.tmp를 사용한다고 나와 있으므로 현재 표준입니다. 물론 그것은 미래에 바뀔 수 있습니다. 그리고 네, 당신은 경쟁 조건이 있습니다.
Brian C. Lane

18

Debian 및 파생물에서는 /etc/sudoers.d/권한이있는 사용자 지정 스크립트를 디렉터리에 삽입 할 수 있습니다 . 0440자세한 내용은 /etc/sudoers.d/README를 참조하십시오 .

도움이 될 수 있습니다.


그래도 주석 처리되지 않습니까?

2
@TomDworzanski : IMHO 아니. man sudoers (5)기타 주석을 참조하십시오 .
pevik 2015

네가 옳아! 링크와 훌륭한 답변에 감사드립니다.

3
나뿐만 아니라 CentOS는 7에서 해당 디렉토리를 사용
알렉산더 새

이것이 올바른 방법이라고 생각합니다.
jansohn

11

visudo는 편집을위한 휴먼 인터페이스로 간주됩니다 /etc/sudoers. 파일을 직접 교체하여 동일한 결과를 얻을 수 있지만 동시 편집 및 구문 유효성 검사에주의해야합니다. r--r-----권한에 유의하십시오 .


9

sudo항목을 추가 /etc/sudoers.d할 수있는 경우 @ dragon788의 답변을 사용할 수 있습니다.

https://superuser.com/a/1027257/26022

기본적으로 visudo파일을으로 복사하기 전에 파일을 확인하는 데 사용 /etc/sudoers.d하므로 sudo누구에게도 깨지지 않도록 할 수 있습니다 .

visudo -c -q -f filename

이를 확인하고 유효한 경우 성공 (0)을 반환하므로 if, &&및 기타 스크립트 부울 연산과 함께 사용할 수 있습니다 . 유효성을 검사 한 후에 복사하면 /etc/sudoers.d작동합니다. 루트가 소유하고 다른 사람이 쓸 수 없는지 확인하십시오.


5

사용자 정의 편집기를 설정하십시오. 기본적으로 파일 이름 (이 경우 /etc/sudoers.tmp)을 받아들이고 수정하고 제자리에 저장하는 스크립트입니다. 그래서 당신은 그 파일에 쓸 수 있습니다. 완료되면 스크립트를 종료하면 visudo가 실제 sudoers 파일을 수정합니다.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo

필요한 모든 dummy_editor.sh에 다음과 같은 내용이 포함되어 있습니까? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0그것은 나를 위해 일하는 것 같습니다.
MountainX

4

많은 답변, yonks를 위해 sudo로 작업했지만 지금까지 설정 구성을 자동화 할 필요가 없었습니다. 위의 답변 중 일부를 혼합하여 /etc/sudoers.d 포함 위치에 구성 줄을 작성하여 기본 sudoers 파일을 수정할 필요가 없도록 한 다음 해당 파일에서 구문을 확인했습니다. 아래의 간단한 예제 :

sudoers include 파일에 라인을 작성하십시오.

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

sudoers에 visudo 구문 검사를 통과 한 파일이 포함되어 있는지 확인하십시오.

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file

별표 만 생략하면 안됩니다 ^^
Sonata

성공 (0)-알았습니다
Oleg

2

위의 답변에 추가 옵션을 추가하기 위해 경쟁 조건이 주요 문제가 아닌 경우 다음 명령을 사용하여 수정 된 파일을 수동으로 복사하는 것을 방지 할 수 있습니다. /etc/sudoers

sudo EDITOR="cp /tmp/sudoers.new" visudo

이렇게하면 권한 업데이트를 통해 새 파일의 유효성이 검사되고 올바르게 설치됩니다.

/tmp/sudoers.new파일에 오류가있는 경우 visudo사용자 입력을 요청하므로 visudo -c -f /tmp/sudoers.new먼저 확인하는 것이 좋습니다 .


1

가장 직접적인 해결책은 다음과 같습니다.

addudoers.sh 스크립트 만들기

#!/bin/sh

while [ -n "$1" ]; do
    echo "$1    ALL=(ALL:ALL) ALL" >> /etc/sudoers;
    shift # shift all parameters
done

추가하려는 사용자와 함께 호출하십시오.

root prompt> ./addsudoers.sh user1 user2

자세한 설명은 다음 답변을 참조하십시오 : 쉘 스크립트를 통해 sudoers에 사용자 추가

문안 인사!


0

그것을 반향하십시오. 그래도 서브 쉘에서 실행해야합니다. 예:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"


-2

이것은 다른 사람들이 여기에 게시 한 내용을 기반으로 저에게 효과적이었습니다. 다른 사람들의 스크립트를 사용하면 visudo가 열리지 만 편집하지는 않습니다. 이것은 표준 사용자를 포함한 모든 사용자가 safari / firefox 용 Java 7u17을 설치하도록 허용하는 데 필요한 수정을했습니다.

#!/usr/bin/env bash
rm /etc/sudoers.new
cp /etc/sudoers /etc/sudoers.new
echo "%everyone   ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new
cp /etc/sudoers.new /etc/sudoers

이것은 sudoers 파일의 하단에 % everyone blah blah blah를 추가했습니다. 이렇게 스크립트를 실행해야했습니다.

sudo sh sudoersedit.sh

행운을 빕니다 : D

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