/etc/sudoers.d/aptget -file에 쓰기 위한 쉘 스크립트를 작성했지만 별칭이 /etc/sudoers 또는 /etc/sudoers.d/의 파일에 이미 정의되어 있으면 sudo가 중단됩니다. visudo를 사용하여 파일을 편집하고 있는데 현재 편집 중인 파일만 확인하는 것 같아서 오류가 발생하지 않습니다.
이전에는 /etc/sudoers에 다음을 수동으로 추가했습니다.
Cmnd_Alias APTGETUPDATE = /usr/bin/apt-get update *
Cmnd_Alias APTGETINSTALL = /usr/bin/apt-get -y --force-yes install *
%aptgroup ALL = (root) NOPASSWD: APTGETUPDATE, APTGETINSTALL
Defaults!APTGETUPDATE !requiretty
Defaults!APTGETINSTALL !requiretty
모두 괜찮습니다. /etc/sudoers.d/aptget에 쓰기 위한 스크립트를 만들거나 위 내용을 수동으로 추가하면 visudo 검사를 통과할 수 있지만 sudo 실행이 실패하게 됩니다.
스크립트.sh:
#!/bin/bash
updaterSudoers="$(cat <<EOF
Cmnd_Alias APTGETUPDATE = /usr/bin/apt-get update *
Cmnd_Alias APTGETINSTALL = /usr/bin/apt-get -y --force-yes install *
%aptgroup ALL = (root) NOPASSWD: APTGETUPDATE, APTGETINSTALL
Defaults!APTGETUPDATE !requiretty
Defaults!APTGETINSTALL !requiretty
EOF
)"
echo "$updaterSudoers" | (EDITOR="tee -a" visudo -f /etc/sudoers.d/aptget)
실수:
>>> /etc/sudoers: Alias `APTGETUPDATE' already defined near line 31 <<<
>>> /etc/sudoers: Alias `APTGETINSTALL' already defined near line 31 <<<
sudo: parse error in /etc/sudoers near line 31
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
31번째 줄부터 시작하는 sudoers:
31 Cmnd_Alias APTGETUPDATE = /usr/bin/apt-get update *
32 Cmnd_Alias APTGETINSTALL = /usr/bin/apt-get -y --force-yes install *
33
34 %aptgroup ALL = (root) NOPASSWD: APTGETUPDATE, APTGETINSTALL
35 Defaults!APTGETUPDATE !requiretty
36 Defaults!APTGETINSTALL !requiretty
답변1
원본 sudoers 파일을 임시로 포함하고 이전 파일을 삭제하면 문제가 해결되는 것 같습니다.
includeCurrent=$'#include /etc/sudoers\n'
echo "$includeCurrent$updaterSudoers" | visudo -c -q -f -
나는 전체 sudoers.sh로 끝났습니다.
#!/bin/bash
#Clear the current file if it exsists
#Warning: this might break stuff if you edit current user visudo rights
if [[ -f "/etc/sudoers.d/aptget" ]]
then
echo -n > "/etc/sudoers.d/aptget"
fi
#New settings to be added
updaterSudoers="$(cat <<EOF
Cmnd_Alias APTGETUPDATE = /usr/bin/apt-get update *
Cmnd_Alias APTGETINSTALL = /usr/bin/apt-get -y --force-yes install *
%aptgroup ALL = (root) NOPASSWD: APTGETUPDATE, APTGETINSTALL
Defaults!APTGETUPDATE !requiretty
Defaults!APTGETINSTALL !requiretty
EOF
)"
#Include current sudoers file
includeCurrent=$'#include /etc/sudoers\n'
#Validate new settings with current settings
echo "$includeCurrent$updaterSudoers" | visudo -c -q -f -
if [ "$?" -eq 0 ]
then
#Write /etc/sudoers.d/aptget with updateSudoers value
echo "$updaterSudoers" | (EDITOR="tee" visudo -f /etc/sudoers.d/aptget) &> /dev/null
else
#Yell and exit in case of error
echo "ERROR CHECKING SUDOERS FILE:"
echo "$includeCurrent$updaterSudoers" | visudo -c -f -
exit 1
fi
#If sudoers.d or sudoers.d/aptget is not included include only sudoers.d/aptget
grep -xq "#includedir /etc/sudoers\.d/\?" /etc/sudoers || grep -xq "#include /etc/sudoers\.d/aptget" /etc/sudoers
if [ "$?" -eq 1 ]
then
echo "#include /etc/sudoers.d/aptget" | (EDITOR="tee -a" visudo -f /etc/sudoers) &> /dev/null
fi