Когда-то я использовал 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"
Еа! Как многословно!
Есть ли более чистый способ сделать это?
Бесполезное использование 'cat': use' sudo tee/etc/hosts etc/hosts.tmp'. – chepner
Бесполезный спам бесполезного высказывания. Это не сработает, потому что нет никакой гарантии, что '/ etc/hosts.tmp', созданный с помощью' sudo tee', может быть прочитан оболочкой –
. Вы создаете файл; нет необходимости использовать 'sudo' для создания файла (и нет необходимости создавать временный файл в'/etc' в первую очередь). – chepner