Mam mały skrypt bash:
#!/bin/bash
touch dummy.txt
Jeśli wykonam ten skrypt, sudo
to utworzy dummy.txt
on ochronę przed rootem .
Chcę zrobić:
Niezależnie od tego, czy ten skrypt jest wykonywany przy użyciu sudo
zwykłego użytkownika, dummy.txt
czy nie , plik nie powinien być chroniony jako root.
chown
iwchmod
skrypcie, aby ustawić własność i uprawnienia zgodnie z potrzebami.Odpowiedzi:
Można sprawdzić, czy skrypt jest uruchamiany poprzez
sudo
użyciuEUID
iSUDO_USER
zmienne, a następnie wykonaćtouch
jakSUDO_USER
gdyby prawda - coś podobnegoźródło
==
służy do porównywania ciągów. Ponieważ$EUID
ma zwracać wartość całkowitą, polecam użyć-ed
porównania. Spacje są dozwolone w nazwach użytkowników , więc prawdopodobnie zacytuj$SUDO_USER
zmienną. W przeciwnym razie dobra odpowiedź - tego osobiście bym użył.sudo -u
jeśli wykryje, że działa jako root. OP mówił o posiadaniu wielu poleceń w jednym skrypcie. Ale uważaj, aby uniknąć nieskończonej pętli błędów.[[...]]
więc nie jest absolutnie konieczne, aby cytować zmienną w instrukcji if @Serg i, jak sądzę,-ed
literówka-eq
-eq
. Nie wiedziałem,[[
że nie ma podziału słów. Dzięki. Osobiście nadal zacytowałbym ze względu na dobre nawyki związane ze skryptowaniemJeśli skrypt nie ma być uruchamiany jako
root
, najbezpieczniejszym sposobem rozwiązania problemu jest przerwanie jego wykonywania na samym początku:Opcjonalnie możesz ponownie uruchomić skrypt jako użytkownik rezerwowy (np.
sudo -u FALLBACK_USER "$0"
) Zamiast po prostu przerywać.Próba naprawienia dziwactwa poszczególnych poleceń sprawi, że skrypt będzie niepotrzebnie skomplikowany i trudny do debugowania. Za każdym razem, gdy go zmodyfikujesz, będziesz musiał wykonać wszystkie testy dwa razy (jako zwykły użytkownik, a następnie jako
root
) i naprawić wszystkie związane z tymroot
błędy. Można powiedzieć, że nie jest to rozwiązanie przyszłościowe.źródło
Domyślnie pliki tworzone przy użyciu roota mają takie uprawnienia:
Plik ten należy do użytkownika root i grupy root i jest czytelny i zapisywany przez root, ale tylko dla innych.
Najprostszym podejściem byłoby po prostu
chown
przywrócenie pliku do pierwotnego użytkownika.Możesz użyć
$SUDO_USER
zmiennej, która jest dostępna tylko posudo
wywołaniu, na przykład:Jeśli używasz skryptu jako zwykły użytkownik, ta
chown
część nie jest wcale potrzebna, więc możesz rozważyć użycie instrukcji if lub&&
test do przetestowania przypadku, gdy skrypt jest uruchamiany jako root, i wykonaj następujące czynności:Powyższe jest zalecanym podejściem. Są też inne, na przykład używanie
chmod
do zmiany uprawnień do odczytu-zapisu-wykonania dla użytkowników i grupy, ale nie jest to zalecane.źródło
sudo
, to nie - nie możesz go zignorować. Możesz albo uruchomić skrypt jako zwykły użytkownik (czego nie rozumiem, dlaczego tego nie robisz, ponieważ po prostu tworzysz tutaj plik dla swojego użytkownika) lub zmienić właściciela pliku, tak jak pokazałem w mojej odpowiedzi.