Bash 스크립트 파일을 sudo로 실행하면 Bash 스크립트 내부의 모든 명령도 sudo로 실행됩니까?


30

Bash에서 자동 설치 후 스크립트를 작성하고 싶습니다 ( post-install.sh예 :) . 스크립트는 자동으로 리포지토리 추가 및 업데이트, 패키지 설치 및 업데이트, 구성 파일 편집 등을 수행합니다.

예를 들어 with와 같은이 스크립트를 실행하면 암호를 한 번만 sudo post-install.sh묻는 메시지가 표시 됩니까? 아니면 스크립트 내에서 명령을 호출 sudo할 때 sudo마다 암호 를 입력 해야 sudo합니까? 다시 말해, bash 스크립트 내부의 명령이 실행 권한을 '상속'합니까?

그리고 실제로 그렇게sudo 한다면, 권한이 시간 초과 될 가능성이 여전히 sudo있습니까 ( 예를 들어, 특정 명령이 시간 초과를 초과 할 정도로 오래 걸리는 경우 )? 아니면 sudo전체 스크립트의 전체 기간 동안 초기 비밀번호 입력이 지속됩니까?


4
이 작업을 위해 특별히 설계된 일부 도구를 확인하는 것이 좋습니다. 3 가지 공통점은 꼭두각시, 요리사 및 혐오입니다.
spuder

@spuder 및 대규모 엔터프라이즈 수준의 아키텍처 및 구성 관리의 보안을 위해, 당신은 (하지 심장 약한, 나에 대한 명령 일회성.) cfengine이 3을 사용할 수 있습니다
와일드 카드

답변:


38

Q # 1 : sudo 암호를 한 번만 묻는 메시지가 표시됩니까? 아니면 스크립트 내에서 명령을 호출 할 때마다 sudo 권한이 필요한 sudo 암호를 입력해야합니까?

예, 한 번 스크립트를 실행하는 동안

참고 :에 자격 증명을 제공 sudo하면 암호를 입력 한 셸 내에서 인증이 일반적으로 5 분 동안 유효합니다. 또한이 셸에서 실행되는 모든 자식 프로세스 나 셸에서 실행되는 스크립트 (귀하의 경우)도 높은 수준에서 실행됩니다.

Q # 2 : 여전히 sudo 권한이 시간 초과 될 가능성이 있습니까 (예를 들어 특정 명령이 sudo 시간 초과를 초과 할 정도로 오래 걸리는 경우)? 아니면 전체 스크립트의 전체 기간 동안 초기 sudo 비밀번호 입력이 지속됩니까?

스크립트 내에서 시간 초과되지 않습니다. 신임 정보가 제공된 쉘에서 대화식으로 입력 한 경우에만 해당됩니다. sudo이 셸 내에서 실행될 때마다 시간 초과가 재설정됩니다. 그러나 귀하의 경우 자격 증명은 스크립트가 스크립트 내에서 명령을 실행하고 실행하는 한 유지됩니다.

sudo 매뉴얼 페이지에서 발췌

이 제한은 정책에 따라 다릅니다. sudoers 보안 정책의 기본 비밀번호 프롬프트 시간 종료는 5 분입니다.


1
Q1에 대한 대답은 "아니요, 다시 묻지 않습니다."입니다.
dannysauer

@dannysauer-Q를 다시 읽으십시오. 비밀번호를 한 번만 입력하라는 메시지가 표시됩니다.
slm

질문은 "a 또는 b입니까?"라고 말하고 "yes"라고 말하는 것만으로 "yes, a"또는 "yes, b"인지 확실하지 않습니다. 미래 독자들을 위해 명확하게 설명하려고 노력하십시오. : D
dannysauer

@dannysauer-업데이트 참조.
slm

1
이 새로운 질문은 stackoverflow.com/questions/3522341/… 입니다. sudo -u $(logname) <command>작동해야합니다.
Gauthier

17

bash모든 하위 프로세스는 수퍼 유저 권한으로 실행됩니다. 따라서 bash 스크립트에서 명령의 비밀번호를 다시 입력 할 필요가 없습니다.

sudo제한 시간은의 (이상) 별도의 호출에 적용됩니다 sudo. 이미 실행중인 bash 프로세스 또는 그 하위 항목에는 영향을 미치지 않습니다.


3

이 답변은 모두 맞을 것입니다. 그러나 이것은 sudo권한 이 필요한 bash 스크립트를 만드는 데 일반적으로 사용되는 방법은 아닙니다 . 일반적으로 스크립트 상단에서 sudo권한 으로 실행되지 않았다고 가정 하고 대신 '세션' sudo -v을 '설정'하기 위해 사용자에게 전화를 걸어 비밀번호를 sudo묻습니다. 당신도 echo일부 설명 프롬프트 전에 텍스트, 또는 오버라이드 (override) sudo's를 가진 프롬프트 자신의 -p스위치 할 수있는 사용자는 당신이 필요로 알고 sudo일부 명령에 대한 액세스를.

그런 다음 스크립트에서 sudo추가 암호 요청없이 필요한 명령 (및 필요한 명령 만) 을 호출해야 합니다. 당신이 (에 관계없이 자신의 사용의 스크립트에서 함께 실행되는 명령의 특정 그룹을 생각한다면 sudo) sudo는 시간 제한을 넘어 확장 할 것입니다, 당신은 호출 할 수있는 sudo -v'연결 유지'의 일종 발행하기 위해 중간에 sudo'세션을 '.

경우 sudo'세션이'스크립트 동안 만료 발생합니까, 사용자는 단순히 자신의 암호를 스크립트에서 sudo는 명령을 실행할 다음 시간을해야합니다.


1
스크립트의 단계 중 하나가 완전히 새로운 리눅스 커널을 구축하고 있다고 말하는데, 두 시간이 걸릴 수 있습니다. 세션을 생생하게 유지하는 것이 어려울 수 있습니다. 어떻게 처리하셨습니까?
Gauthier

당신은 할 수 없습니다. 그러나 다음에 전화 sudo -v하면 사용자에게 다시 비밀번호를 묻습니다. 내 의견으로는 최악의 문제가 아닙니다. 도움이 될 수 있으므로 사용자에게 메커니즘을 알리는 것이 편리 할 수 ​​있습니다.
alexrussell

그 반대의 경우 사용자가 다른 답변에 따라 sudo를 사용하여 스크립트를 호출 한 다음 sudo -u $SUDO_USER루트가 아닌 모든 명령을 높이 지 않고 실행해야합니다. 안타깝게도 더 많은 코드를 추가하지만 장기 실행 프로세스에서 근본 원인을 수행 할 수있는 유일한 방법입니다.
dragon788

나는 분명히해야한다고 생각합니다.이를 수행하는 다른 방법은 스크립트 시작 부분에 sudo를 한 번 호출 /etc/sudoers.d하여 파일을 visudo -c -f /tmp/tempsudoers복사하기 전에 파일이 유효한지 확인하기 위해 임시 파일을 사용 하고 한 번 완료되면 해당 파일을 제거하는 것입니다 (이관을 악용 할 수 없도록 종료 / 오류시 트랩 사용) 가장 안전하고 안전한 구현은 사용자가 NOPASSWD각 명령 / 인수를 배열에 저장하여 파일을 빌드함으로써 암호없이 특정 인수를 사용하여 스크립트에서 특정 명령을 실행할 수 있도록합니다 .
dragon788

여기서 @Gauthier로 늦게 돌아 왔지만 sudo주어진 단일 작업이 시간 초과보다 오래 걸리면 세션을 계속 유지할 수 없다고 말했을 때 잘못되었다고 생각됩니다 . : 나는 마티아스 Bynens의 dotfiles에있는 다른 일이 REPO이 기술을 통해 온 while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.