2016-05-04 2 views
2

Когда-то я использовал sed и tee, чтобы изменить привилегированный файл на месте. Потому что сама оболочка не имеет привилегии суперпользователя я должен был получить творческий, чтобы написать вывод команды в файлы:Sed на месте на привилегированной символической ссылке

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts" 1>/dev/null 

В то время это работало замечательно. Только после того, как я начал использовать файл моих хостов для блокировки рекламы, я понял, что канал ограничен буфером, после чего tee с радостью перезапишет файл, а остальная часть файла исчезнет.

Я также рассмотрел более простую версию:

sed -r 'script' "/etc/hosts" > "/etc/hosts.tmp" && sudo mv "/etc/hosts.tmp" "/etc/hosts" 

К сожалению, это тоже не будет работать, так как файл в вопросе является символическим. A mv будет перезаписывать символическую ссылку, в отличие от файла внизу.

Мое текущее решение заключается в следующем:

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts.tmp" 1>/dev/null && 
    sudo cat "/etc/hosts.tmp" | sudo tee "/etc/hosts" 1>/dev/null && 
    sudo rm "/etc/hosts.tmp" 

Еа! Как многословно!

Есть ли более чистый способ сделать это?

+0

Бесполезное использование 'cat': use' sudo tee/etc/hosts chepner

+0

Бесполезный спам бесполезного высказывания. Это не сработает, потому что нет никакой гарантии, что '/ etc/hosts.tmp', созданный с помощью' sudo tee', может быть прочитан оболочкой –

+0

. Вы создаете файл; нет необходимости использовать 'sudo' для создания файла (и нет необходимости создавать временный файл в'/etc' в первую очередь). – chepner

ответ

3

Если вы используете GNU sed, вы можете использовать его флаг назначения на месте -i, чтобы результаты его выполнения были непосредственно сохранены в файле, который он обрабатывает. Тогда вам нужно только sudo команду sed, и все должно быть в порядке.

Дополнение для записи файла, а не ссылки, используйте флаг sed --follow-symlinks.

В других случаях отметьте this answer to a similar question on SO.

+0

Да, но тогда мне все равно нужна очистка, не так ли? (И если sed ударит ведро, у меня будет половина файла) ** Редактирование ** Не обращайте внимания, очевидно, что оставшиеся файлы есть только в том случае, если вы предоставили суффикс '-i'. Хотя мне интересно, как это может отличить суффикс от другого флага ... –

+0

На самом деле мне нужно будет снять этот ответ - получается, что 'sed -i' имеет ту же проблему, что и' mv' - это превращает мой символическая ссылка в файл! (Я попробую readlink и realpath, и когда я найду комбо, которое будет работать, я помету вас и опубликую в вопросе) –

+0

@JV позвольте мне проверить, могу ли я найти что-то – Aaron