프로그래밍 방식으로 파일을 업데이트하는 올바른 방법은 무엇입니까 sudoers
? 구체적으로:
- 내 파일에 줄 끝을 추가하고
,timestamp_timeout=600
(잔소리 시간을 10시간으로 늘림) 시스템을 중단하지 않고 프로그래밍 방식으로 수행하려면 어떻게 해야 합니까(한 번 시도했는데 이로 인해 Linux 시스템이 부팅되지 않고 설치를 다시 시작해야 했습니다). 나는 이것이 이것에 중요할 수 있다는 것을 읽었습니다.Defaults env_reset
sudoers
sudo
chmod 440
- 나는 그것이 위험하다는 것을 알고 그것이 보호되는 이유를 이해합니다. 그러나 이것은 수십 가지의 간단한 구성 변경을 실행하는 스크립트가 있는 내 홈 시스템입니다(그리고 나는 이러한 시스템도 꽤 정기적으로 재구축하므로 이것이 나에게 유용합니다). 이 작업을 자동으로 수행할 수 있습니다).
bash
저는 스크립트에 넣을 수 있는 표준 Linux 도구를 사용하여 이 작업을 수행하는 방법에 가장 관심이 있지만 , 이와 같은 간단한 변경 사항을 적용할 수 있도록 Ansible에서 정확한 작업을 수행하는 방법을 배우는 데도 매우 관심이 있습니다.sudoers
내 집 웹의 모든 파일.- 존재하다이 페이지문서에 토론이 있지만
sudoers
내가 참조한 내용을 잘 이해할 수 없습니다visudo -c -f
.생각하다제안 사항은 다음과 같습니다. 파일의 복사본을 만든sudoers
다음 해당 복사본을 변경하고visudo -c -f
새 파일이 유효한지 확인한 다음 덮어쓴sudoers
다음chmod 440
새 파일에 덮어쓰는 것이 맞습니까? 이것을 구현하는 단계가 확실하지 않습니다.
답변1
경고하다: 다음과 같이 작동합니다. 이것이 좋은 생각인지 여부는 논쟁의 여지가 있습니다. 하지만 이렇게 하고 싶다면 이 방법은 덜 안전한 방법 중 하나입니다.
파일을 변경하는 스크립트를 사용하여 호출할 변수를 설정하고 내 SUDO_EDITOR
보내면 됩니다. sed
예를 들어
export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
visudo
unset SUDO_EDITOR
물론 루트로 실행해야 합니다. 일반적으로 정의되지 않습니다... 그러나 원하는 것을 사용하거나 또는 원하는 것을 알려주는 데 사용할 수 있습니다(많은 프로그램에서 사용하는 보다 일반적인 EDITOR 및 VISUAL 환경 변수보다 visudo보다 우선합니다. 정의된 경우 visudo는 이를 사용하지만 SUDO_EDITOR SUDO_EDITOR
는 아니다). 이 예에서는 대화형 편집기 대신 스트림 편집기( )를 사용합니다 .visudo
vi
nano
joe
sed
변경 사항이 적용되지 않으면 visudo
당사가 이를 인지하고 어떻게 해야 하는지 물어볼 것입니다. 귀하의 옵션은 다음과 같습니다:
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
옵션을 사용해야 합니다 x
. 다시 실행 e
되고 손상된 변경 사항이 저장됩니다.sed
Q
그런데, 다른 변경이 필요 /etc/sudoers
하고 어떤 이유로 파일을 직접 넣을 수 없다면 /etc/sudoers.d/
/etc/sudoers(예: /tmp/sudoers) 복사본에서 변경 사항을 테스트하고 옵션 -f
및 visudo
.
올바른 변경이 이루어졌는지 확인할 수 있습니다 diff
. 작동 한다면 훌륭하고 -f /tmp/sudoers
. 원하는 효과를 얻을 때까지 반복합니다.cp
visudo
# cp -af /etc/sudoers /tmp/
# export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
# visudo -f /tmp/sudoers
# unset SUDO_EDITOR
# diff -u /etc/sudoers /tmp/sudoers
--- /etc/sudoers 2020-07-18 02:57:35.220317224 +1000
+++ /tmp/sudoers 2021-10-15 03:26:13.048804192 +1100
@@ -9,7 +9,7 @@
Defaults exempt_group=sudo
-Defaults env_reset
+Defaults env_reset,timestamp_timeout=600
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
그런데 여기에서 파일을 수정하는 것은 무엇이든 사용할 수 있습니다. Perl이나 Python 또는 심지어 쉘 스크립팅(예: 래퍼 스크립트 ed
또는 ex
다른 스크립트 가능한 편집기)을 SUDO_EDITOR
선호 하는 경우 sed
. 주어진 파일을 변경하는 한 작동합니다 visudo
. 공백과 중첩된 따옴표를 주의하세요.
답변2
프로그래밍 방식으로 가장 좋은 방법은 /etc/sudoers.d
필요한 모든 지시문에 파일을 추가하는 것입니다. 이러한 파일은 0440이 소유 root
하고 모드가 0440이어야 합니다. 파일을 추가하면 /etc/sudoers.d
세 가지 이점이 있습니다. /etc/sudoers
대부분의 경우 /etc/sudoers
시스템의 기본 설정이 유지되므로 수정과 관련된 향후 업그레이드가 단순화되고 /etc/sudoers
기본값 변경 사항을 쉽게 볼 수 있습니다.
시간 초과 설정에서도 파일 추가는 가능합니다. Defaults
줄이 반복될 수 있으므로 추가
Defaults timestamp_timeout=600
기존 행에 추가하는 것과 동일한 효과가 있습니다 Defaults env_reset
.
이렇게 하려면 다음 /etc/sudoers
을 포함 해야 합니다.
@includedir /etc/sudoers.d
이는 최근 설치의 기본값이지만 sudo
다음과 같이 프로그래밍 방식으로 이를 보장할 수 있습니다.
if ! sudo grep -q '^[@#]includedir /etc/sudoers.d$' /etc/sudoers; then
sudo sed '$a\\n@includedir /etc/sudoers.d' /etc/sudoers > /etc/sudoers.new
sudo visudo -c -f /etc/sudoers.new && sudo mv /etc/sudoers{.new,}
fi
SUDO_EDITOR
( 여기서는 이 트릭을 사용 하지 마십시오 . visudo
처리되므로 루프가 /etc/sudoers.d/README
발생합니다 .)@include