To dość proste pytanie, przynajmniej tak powinno być, dotyczące uprawnień sudo w Linuksie.
Istnieje wiele razy, kiedy tylko chcesz dołączyć coś /etc/hosts
lub plik podobny, ale w końcu nie jest w stanie, ponieważ oba >
i >>
nie są dozwolone, nawet z korzenia.
Czy istnieje jakiś sposób, aby tę pracę bez konieczności su
lub sudo su
do korzeni?
echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab
byś zrobiłtee -a
zamiasttee --append
.-a
--append
flagi ( ) polecenie zastąpiłoby cały plik danym ciągiem zamiast dołączać go na końcu.Problem polega na tym, że powłoka przekierowuje dane wyjściowe, a nie sudo lub echo, więc robi to zwykły użytkownik.
Wypróbuj następujący fragment kodu:
źródło
sh
echo może interpretować sekwencje specjalne, takie jak\t
wewnątrz pojedynczych cudzysłowów. Możeszprintf %s 'something'
zamiast tego użyć .sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"
na przykład.Problem polega na tym, że to twoja powłoka obsługuje przekierowanie; próbuje otworzyć plik z twoimi uprawnieniami, a nie z procesem uruchomionym w sudo.
Użyj czegoś takiego, na przykład:
źródło
sudo
(ze względów bezpieczeństwa) nie propaguje środowiska do podprocesu. Możesz użyć,sudo -E
aby ominąć to ograniczenie.sudo sh -c "echo 'something' >> $FILENAME"
, z podwójnym cudzysłowie, to będzie działać - zmienna podstawienie odbywa się przez powłokę zewnętrzną, a nie sudoed powłoki.źródło
Robić
powinno działać. Problem polega na tym, że> i >> są obsługiwane przez twoją powłokę, a nie przez polecenie „sudoed”, więc uprawnienia są twoje, a nie uprawnienia użytkownika, do którego „sudoing”.
źródło
Dla ciekawskich chciałbym zauważyć, że możesz również zacytować heredoc (dla dużych bloków):
źródło
"
powoduje usunięcie wewnętrznej, ale nie powoduje niepowodzenia polecenia.)W bash możesz używać
tee
w połączeniu z,> /dev/null
aby utrzymać stdout w czystości.źródło
Korzystając z odpowiedzi Yoo , umieść to w
~/.bashrc
:Teraz możesz biegać
sudoe 'deb blah # blah' /etc/apt/sources.list
Edytować:
Bardziej kompletna wersja, która umożliwia wprowadzanie danych do pliku lub przekierowywanie z niego i zawiera
-a
przełącznik do wyłączania dołączania (który jest domyślnie włączony):źródło
Możesz także użyć
sponge
zmoreutils
pakietu i nie trzeba przekierowywać wyjścia (tzn. Nie matee
hałasu do ukrycia):źródło
Używając sed -i z $ a , możesz dodać tekst, zawierający zarówno zmienne, jak i znaki specjalne, po ostatnim wierszu.
Na przykład dodanie $ NEW_HOST z $ NEW_IP do / etc / hosts:
wyjaśniono opcje sed:
źródło
echo „Hello World” | (sudo tee -a /etc/apt/sources.list)
źródło
Co powiesz na:
echo text | sudo dd status = none of =
plik uprzywilejowany Chcę zmienić / proc / sys / net / ipv4 / tcp_rmem.
Zrobiłem:
sudo dd status = none of = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
eliminuje echo w dokumencie zawierającym jeden wiersz
źródło
To działało dla mnie: oryginalne polecenie
Dowództwo robocze
źródło
tee -a
. Po prostutee
nadpisze plik!Czy możesz zmienić własność pliku, a następnie zmienić go z powrotem po użyciu
cat >>
do dołączenia?Coś takiego działa dla ciebie?
źródło