2012-07-19 2 views
4

OS X 10.6을 실행하는 Mac에서 sudoers 파일을 성공적으로 편집하는 스크립트 (이전 버전에서 작성)가 있습니다. 그것은 다음과 같이 진행됩니다OS X (10.7)에서 sudoers 편집

#!/bin/sh 

if [ -z "$1" ]; then 
    export EDITOR=$0 && sudo -E visudo 
else 
    echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> $1 
fi 

그러나 10.7을 실행하는 대신의 sudoers 파일에 줄을 추가 Mac에서 실행하면, 그것은 visudo를 실행 "대화". 어느 시점에서도 "else"절을 입력하는 것처럼 보이지 않습니다. 필자는 4 행의 적절한 구문 ("내보내기 ...")이 변경된 것으로 의심하지만 어떻게 찾을 수 없는지 의심 스럽습니다. 어떤 포인터?

누군가가 물을 것이다 : 우리는 패치를 위해 정교하게 (그리고 어리석은, 그러나 어쨌든 그렇게 강제적 인) 강제 재부팅 스케줄을 가지고있다. 사용자가 최종 기한까지 고의로 재부팅하지 않으면 응용 프로그램이 5 분 카운트 다운 (또는 즉시 재부팅하는 옵션)으로 시작하여 'sudo shutdown -r now'명령이 실행됩니다. 제 정신 때문에이 협정의 본질을 변호하라고 제발 부탁하지 마세요. 그것은 내 통제 밖에있다.

+0

- 이전 메모가 삭제되었습니다. disregard-- – jpdyson

답변

1

visudo(8)이 말을 가지고

편집기의 sudoers 기본 변수를 통해 오버라이드 (override) 할 수 컴파일 시간 설정 사용 visudo를 하나 개 이상의 편집자의 하드 코딩 된 목록이 있습니다. 이 목록의 기본값은 "/ bin/vi"입니다. 일반적으로 visudo는 앞에서 언급 한 편집자 목록에 편집기가 포함되어 있지 않으면 VISUAL 또는 EDITOR 환경 변수 을 사용하지 않습니다. 그러나 visudo가 --with-env-editor 옵션으로 구성된 이거나 ench_editor 기본 변수가 sudoers에 설정된 경우 visudo는 VISUAL 또는 EDITOR로 정의 된 편집기를 사용합니다. 시각 또는 편집자를 설정하여 사용자가 원하는 프로그램을 실행할 수 있으므로 보안 구멍이 일 수 있습니다.

나는 여기에 대해 뭘하고 있는지 의심 스럽다.

+0

동의합니다. 나는 이것을 조사 할 것이다. 10.6에서는 작동하지만 10.7에서는 작동하지 않는 이유는 수수께끼입니다. 10.6은 우리 환경에서 포괄적 인 모 놀리 식 이미지이지만 10.7은 롤업보다 더 복잡합니다. 우리의 10.6 이미지에는 EDITOR의 사용을 허용하는 다른 조정이있을 수 있습니다. – jpdyson

+0

추가 테스트 - 내 10.6 컴퓨터에서 EDITOR =/path/to/script를 내보내고 확인하고 다시 sudo visudo를 실행할 수있었습니다. 모든 것이 예상대로 진행되었습니다 (sudoers 파일이 예상대로 수정 됨). 나는 10.7에서 동일하게 검증하고, sudo visudo를 실행할 때 EDITOR env var가 가장 확실하게 무시된다 (vi로 열림). 당신의 이론이 확인되었습니다. – jpdyson

2

if [ -z "$1" ];은 스크립트에 인수가 제공되지 않았는지 확인하는 일반적인 관용구입니다. 인수없이 이 호출되면 스크립트는 첫 번째 경로를 따라 편집기 (이 경우에는이 스크립트 자체 여야 함)를 시작합니다. 파일 이름이 인 경우, else -branch가 취해지고 비동기 적으로 파일에 행이 추가됩니다 (visudo 컨텍스트).

스크립트가 인수없이 외부에서 호출된다고 가정하면 sudo는 EDITOR 환경 변수를 지우거나 visudo가 EDITOR를 무시하도록 (@twalberg에서 언급했듯이) 시작합니다.

수정하려면 sudoers 파일을 조정하여 EDITOR를 유지하고 env_editor을 설정하여 모든 프로그램을 편집기로 허용하거나 스크립트 (및 sudoers 파일을 편집하는 다른 스크립트)를 editor 변수에 추가하십시오.

Defaults env_keep += "EDITOR" 
# UNSAFE 
#Defaults env_editor 
# better 
Defaults editor = "/usr/bin/vi:/path/to/script" # ... possibly more 

당신은 그렇게하지 않으려면 (또는 그렇게 할 수없는 비 대화 형)과 동시 편집이 발생하지 않을 것이라고 가정하는 것이 안전합니다, 당신은 다음과 같이 수행 할 수 있습니다

cp -p /etc/sudoers /etc/sudoers.tmp 
echo "%staff ALL=NOPASSWD: /sbin/shutdown" >> /etc/sudoers.tmp 
if visudo -cqf /etc/sudoers.tmp; then 
    mv /etc/sudoers.tmp /etc/sudoers 
else 
    rm /etc/sudoers.tmp 
    echo "update failed" 
fi 
+0

/etc는 (10.6에서 10.7까지) sudoers가있는/private/etc에 대한 심볼릭 링크입니다. 나는/private/etc/sudoers를 지정하려고 시도했지만 편집 결과 대신 sudoers 파일이 열리는 것과 같은 결과를 얻는다. – jpdyson

+0

'echo "% staff ALL = NOPASSWD :/sbin/shutdown">>/private/etc/sudoers'를 직접 실행 해보십시오. 물론 루트가되어야합니다. 문제가 해결되면 스크립트 호출을 해당 한 줄로 바꾸십시오 (예 : 원하지 않는 분기를 포함하여 해당 명령에서'if'를 제거하십시오.) – nobody

+0

작동하지만 visudo를 우회하기 때문에 대단히 현명하지 않습니다. 필자는 Casper Suite를 사용하여 모든 스크립트를 루트로 실행하는이 모든 것을 배포한다고 언급하지는 않았으므로 아무런 문제가되지 않습니다. – jpdyson