#sed
#sed
Вопрос:
Я новичок в скриптах. Мне нужно запланировать задание на нескольких серверах и вставить NOPASSWD в нужное место в файлах sudoers. Условиями являются пропуск строк, в которых присутствует PASSWD и wheel.
Я успешно использую приведенный ниже awk для извлечения строк, которые соответствуют моему выражению, но с помощью sed я не могу вставить или заменить требуемое.
awk '($1 ~ "%" amp;amp; !/PASSWD/ amp;amp; !/wheel/) {print}' sudoers
Sed:
sed '/NOPASSWD/b; s/ALL=(ALL)[[:space:]].* ALL/ALL=(ALL)[[:space:]].*NOPASSWD: ALL/g' sudoers
Не работает, а также не помогает, если команды отличаются от ВСЕХ.
Существующая:-
%<<group 1>> ALL=(ALL) /bin/su - oracle12
%<<group 2>> ALL=(ALL) ALL
Ожидается:-
%<<group 1>> ALL=(ALL) NOPASSWD: /bin/su - oracle12
%<<group 2>> ALL=(ALL) NOPASSWD: ALL
Любая помощь высоко ценится. Если есть какой-либо другой поток, который решил подобную проблему, пожалуйста, перенаправьте меня.
Ответ №1:
Ваша существующая команда awk с небольшими изменениями, похоже, работает :
$ awk '($1 ~ "%" amp;amp; !/PASSWD/ amp;amp; !/wheel/) {$2 = $2 FS "NOPASSWD:"; print }' sudoers
Комментарии:
1. Спасибо тебе, Гаутам. как указано в вопросе, мы не можем использовать awk для редактирования inline так же, как sed . Я искал возможность такой же логики в sed, чтобы я мог выполнить ее на всех серверах. Я попытаюсь использовать это в каком-нибудь скрипте и достичь .. и обновить этот поток скриптлетом.. Еще раз спасибо за вашу огромную помощь.
Ответ №2:
Спасибо Gupta… Теперь проблема решена.
ниже приведен скрипт, который завершает задание. Дайте мне знать, если кому-нибудь понадобится объяснение.
awk ‘($1 ~ «%» amp;amp; !/ PASSWD/ amp;amp; !/wheel/) {$ 2 = $ 2 FS «NOPASSWD:»; print }’ /etc/sudoers > /tmp/temp_sudoers
при чтении строки сначала выполнить= echo $Line | cut -d' ' -f1
; sed -i «s?^${First}.*?${Line}?g» /etc/sudoers done < /tmp/temp_sudoers
@gupta еще раз благодарю вас.