Как я могу использовать команды с sudo, не меняя владельца файлов?

12

Когда я использую sudo для выполнения некоторых действий с файлами, эти файлы меняют владельца. Как я могу использовать команды с sudo, не меняя владельца файлов?

Файл примера archivos35.sh из apache, но я использую sed (с usr admin sudo)

$ ls -l
-rwxr-xrw-. 1 apache apache 181 Aug 5 11:56 archivos35.sh

Пользователь adminс sudo ---

sudo sed -i s/old/new/g archivos35.sh

Но выполнение этой команды с помощью sudo меняет владельца файла

$ ls -l
-rwxr-xrw-. 1 admin apache 181 Aug 5 11:56 archivos35.sh

Как можно избежать использования команды с sudo для смены владельца файла? Я просто хочу внести изменения в файл без изменения его владельца.

Док Гус
источник
Почему ваш сценарий доступен для записи?
Джим Л.
По ошибке я установил 756. Я не должен
Dok Gus

Ответы:

29

Если вам нужно использовать sudoдля изменения файла, то используйте его, чтобы перейти к нужному пользователю. Вам не нужно переключаться на root, это просто по умолчанию. Итак, в вашем случае вы хотели бы сделать:

sudo -iu apache sed -i 's/old/new/g' archivos35.sh

Это запустит sedкоманду как пользователь apache.

Тердон
источник
2

Вы на самом деле не меняете владельца файла, скорее вы удаляете старый файл и создаете новый. Когда вы делаете это, создается новый файл, принадлежащий uid создателя. Чтобы избежать этого, вы должны изменить файл на месте. Отредактируйте его, используя текстовый редактор, который сохраняет, перезаписывая исходный файл на месте. Или выполните команды sed с выводом во временный файл, а затем скопируйте временный файл поверх исходного файла.

Кайл Джонс
источник
1
Вы могли бы подумать, что -iвариант ака --in-placeбудет на самом деле изменить на месте ...
JShorthouse
С ответом @teldon мне удалось сделать то, что мне нужно. С помощью sed я изменяю место, не открывая файл.
Док Гус
1
@JShorthouse Вы могли бы подумать, но это не так, по крайней мере, не везде.
Кайл Джонс
3
@JShorthouse большинство так называемых «изменений на месте» не являются, они в основном изменяют временный файл и затем переносят его поверх оригинала (и это включает в себя большинство, если не все, реализации sed. И perl. И большинство других программ). с опцией «редактирования на месте»). Если вы хотите фактическое редактирование на месте, используйте текстовый редактор с поддержкой сценариев, такой как edили exили vi/ vim.
Cas
1
Даже некоторые текстовые редакторы используют метод temp + rename при записи файла, как отказоустойчивый в случае сбоя во время записи. Например, Emacs делает это по умолчанию, но вы можете перезаписать его конфигурацией.
Бармар