sudoers переименовывает cmnd_alias и заменяет место ссылки

Мне нужно объединить сотню файлов sudoers в один большой файл.. это требование

полученный объединенный файл должен быть действительным файлом sudoers

Я проверяю с visudo -cf huge_sudoers

если я объединяю файлы, есть дублированные псевдонимы команд, которые иногда различаются между хостами. Я уже удалил дублированные. но есть псевдонимы команд, которые называются одинаково, но на самом деле разные.. например:

на host_A:

Cmnd_Alias SHELLS= /usr/bin/bash /usr/sh

на Host_B:

Cmd_Alias ​​SHELLS= /bin/ksh /usr/bin/zsh

идея, которую я должен переименовать cmnd_Alias, добавив имя хоста следующим образом:

Cmnd_Alias HOSTB_SHELLS = /bin/ksh, /usr/bin/zsh 

Я могу сделать это с помощью awk:

awk '{if ($1 == "Cmnd_Alias") $2="$hostname_"$2;}1' sudoers

но как я могу также заменить, где команда вызывается или на которую ссылаются..

например

+operator   HostB = NOPASSWD: SHELLS

это должно стать:

+operator   HostB = NOPASSWD: HOSTB_SHELLS

Я могу отредактировать команду awk, чтобы поместить в экземпляр $2 в переменную, а затем перейти на замену каждого места в файле?

редактировать: я сделал это до сих пор:

#get old name of cmd alias
OLD="$( awk '{if ($1 == "Cmnd_Alias" ) print $2}' sudoers)"

#replace the old alias by the new:
awk '{if ($1 == "Cmnd_Alias" ) $2="$MYHOST_"$2;}1' sudoers > cmd.alias.tmp

#get the new alias name
NEW=$(awk '{if ($1 == "Cmnd_Alias" ) print $2}' cmd.alias.tmp)

#replace
sed /$OLD/s/$OLD/$NEW/ cmd.alias.tmp 

Есть ли способ лучше?

0 ответов

Другие вопросы по тегам