Как правильно проверить, будет ли добавление файла в sudoers.d конфликтующим с другими файлами?

Я создал сценарий оболочки для написания файла /etc/sudoers.d/aptget -file, но он нарушает sudo, если псевдоним уже определен в / etc / sudoers или в любом файле в файле /etc/sudoers.d/. Я использую 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 не работает.

script.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 года в судерах:

 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 

Временно включая исходный файл 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