Jak korzystać z poleceń w sudo bez zmiany właściciela plików?

12

Kiedy używam sudo do wykonywania niektórych czynności z plikami, pliki te zmieniają własność. Jak korzystać z poleceń w sudo bez zmiany właściciela plików?

Przykładowy plik archivos35.sh pochodzi z Apache, ale używam sed (z usr admin sudo)

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

Użytkownik adminz sudo ---

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

Ale wykonanie tego polecenia za pomocą sudo zmienia właściciela pliku

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

Jak mogę uniknąć używania polecenia sudo do zmiany właściciela pliku? Chcę tylko wprowadzić zmiany w pliku bez modyfikowania jego właściciela.

Dok Gus
źródło
Dlaczego twój skrypt może być zapisywany na całym świecie?
Jim L.,
Przez pomyłkę ustawiłem na 756. Nie powinienem
Dok Gus

Odpowiedzi:

29

Jeśli musisz użyć sudodo zmodyfikowania pliku, użyj go, aby przełączyć na odpowiedniego użytkownika. Nie musisz przełączać się na root, to tylko domyślne. W twoim przypadku chciałbyś:

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

To uruchomi sedpolecenie jako użytkownik apache.

terdon
źródło
2

Naprawdę nie zmieniasz własności pliku, raczej usuwasz stary plik i tworzysz nowy. Gdy to zrobisz, nowy plik zostanie utworzony przez użytkownika UID twórcy. Aby tego uniknąć, musisz zmodyfikować plik na swoim miejscu. Edytuj go za pomocą edytora tekstu, który zapisuje, zastępując oryginalny plik na miejscu. Lub uruchom polecenia sed z wyjściem do pliku tymczasowego, a następnie skopiuj plik tymczasowy do oryginalnego pliku.

Kyle Jones
źródło
1
Można by pomyśleć, że -iopcja aka --in-placefaktycznie zmodyfikuje w miejscu ...
JShorthouse,
Whit Odpowiedź @teldon, udało mi się zrobić to, czego potrzebuję. za pomocą sed modyfikuję miejsce bez otwierania pliku.
Dok Gus,
1
@JShorthouse Można by pomyśleć, ale tak nie jest, przynajmniej nie wszędzie.
Kyle Jones,
3
@JShorthouse większość tak zwanych edycji „na miejscu” nie jest, przeważnie zmieniają one plik tymczasowy, a następnie przenoszą go na oryginał (i obejmuje to większość, jeśli nie wszystkie, implementacje sed. I perl. Oraz większość innych programów z opcją „edycji na miejscu”). Jeśli chcesz rzeczywistej edycji na miejscu, użyj edytora tekstu ze skryptami, takiego jak edlub exlub vi/ vim.
cas
1
Nawet niektóre edytory tekstu używają metody temp + rename podczas zapisywania pliku, jako bezpieczne w razie awarii podczas zapisu. Np. Emacs robi to domyślnie, ale możesz go zastąpić konfiguracją.
Barmar