Редактировать visudo с помощью vim, вызываемого из скрипта - PullRequest
1 голос
/ 28 мая 2020

Я создал сценарий автоматической установки и при запуске из ch root хотел бы раскомментировать строку группы wheel. Я мог бы сделать это, используя sed -i "s/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/g" /etc/sudoers, но я читал, что это не лучшая практика. Итак, как это сделать с помощью vim?

Команда: :82 s/# // Я пытался использовать канал, перенаправить stdin или использовать vim + "командный файл", но первые не работают, а последний работает, но указывает, что это файл только для чтения .. .

Спасибо!

1 Ответ

0 голосов
/ 28 мая 2020

Одна из возможностей - передать вывод вашей команды sed (без флага -i) в этот сценарий, чтобы перезаписать файл sudoers, если это безопасно, без необходимости пытаться запустить редактор в неинтерактивном режиме. .

#!/bin/sh

#
# Replaces /etc/sudoers with a new version supplied
# on standard input, but first performs safety checks
# including with "visudo -c"
#

sudoers=/etc/sudoers
tmp_sudoers=$sudoers.tmp  # same tmp file as used by visudo

if [ -e $tmp_sudoers ]
then
    echo "someone is editing sudoers"
    exit 1
fi

# make new version from data on stdin, preserving permissions
# by creating a copy and then overwriting it
cp $sudoers $tmp_sudoers
cat > $tmp_sudoers

# install the new version if it passes checks
succeeded=0
if [ ! -s $tmp_sudoers ]
then
    echo "replacement file is empty"
elif diff -q $sudoers $tmp_sudoers > /dev/null
then
    echo "there were no changes"
elif ! visudo -q -c -f $tmp_sudoers
then
    echo "replacement file is invalid"
else    
    mv $tmp_sudoers $sudoers
    succeeded=1
fi

if [ $succeeded -eq 0 ]
then
    rm $tmp_sudoers
    exit 1
fi
...