Gdy używam sudo do zezwalania na edycję plików, regularnie otrzymuję „odmowę dostępu”.
Na przykład moja mysz jest roztrzęsiona i powolna, więc chcę wyłączyć odpytywanie:
sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf
Zostanie wyświetlony monit o hasło, a następnie otrzymam:
bash: /etc/modprobe.d/local.conf: Permission denied
Próbowałem więc dokonać tymczasowej zmiany, aby wyłączyć odpytywanie, używając:
sudo echo N> /sys/module/drm_kms_helper/parameters/poll
Po raz kolejny system odpowiedział:
bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied
Jakieś pomysły?
command-line
bash
sudo
Jacek
źródło
źródło
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
echo
jako sudo, chyba że zrobisz coś takiegosudo bash -c 'echo …'
; jednak systemy POSIX zwykle dostarczają zewnętrzneecho
polecenie, takie jak/bin/echo
na OS X, które sudo może wykonać bez rigamarole. Zatemecho
polecenie, które zwykle uruchamiasz iecho
polecenie uruchamiane za pomocą sudo, to prawdopodobnie dwa różne, ale podobne polecenia.Przekierowanie danych wyjściowych jest wykonywane przez powłokę, z której wywołano polecenie . Rozbijając wszystko na strzępy, oto co się dzieje *:
wywołuje powłokę
sudo echo "options drm_kms_helper poll=N"
, która wykonujesudo
polecenie za pomocąecho "options drm_kms_helper poll=N"
wiersza poleceńsudo prosi o hasło, otwiera powłokę superużytkownika i wywołuje
echo "options drm_kms_helper poll=N"
,echo
przekazując polecenie"options drm_kms_helper poll=N"
echo, działające z
root
uprawnieniami, wypisuje ciąg na standardowe wyjście.echo
polecenie kończy się, kończy działanie superużytkownika,sudo
kończy siępowłoka, z której wywołano polecenie, zbiera dane wyjściowe i próbuje je przekierować
/etc/modprobe.d/local.conf
, co można zapisać tylko przez root. Otrzymuje błąd „odmowa uprawnień”.Aby dowiedzieć się, jak to naprawić, patrz odpowiedź @shantanu.
(*) - podczas gdy powyższa sekwencja pomaga zrozumieć, dlaczego polecenie kończy się niepowodzeniem, w rzeczywistości rzeczy dzieją się nieco poza kolejnością: oryginalna powłoka zauważa przekierowanie i próbuje otworzyć plik do zapisu przed wywołaniem
sudo ...
polecenia. Podczas otwierania pliku nie powiedzie się powłoka nawet nie wywołuje polecenia, które miało zostać zapisane do pliku (dzięki @PanosRontogiannis za zwrócenie na to uwagi).Oto szybki test:
W powyższym teście
whoami | tee who.txt
zamierzałem utworzyć plik o nazwiewho.txt
zawierającej słowo „root”. Jednak gdy przekierowanie wyjścia nie powiedzie się w powłoce wywołującej, brakuje również pliku „who.txt”, ponieważ polecenie nie zostało wywołane.źródło
Dodając do odpowiedzi Shantanu:
... Lub możesz użyć takiego
tee
polecenia:lub jeśli jest to wynik polecenia:
źródło
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null
jeśli nie chcesz, aby drukowaniestdout
również.Podejście, którego nie widziałem tutaj, to po prostu wykonanie całej linii poleceń we własnej powłoce. Sama strona
sudo
man podaje przykład takiego podejścia:źródło
Inną opcją jest użycie pliku tymczasowego. Jest to przydatne w skrypcie bash.
źródło
sudo dd of=
Aby dołączyć, jak chcesz:
lub aby odtworzyć plik od zera:
Zalety:
tee
bez/dev/null
przekierowaniash
odkąd brak wyraźnej podpowłoki (ale domyślnej dla przekierowania)dd
ma wiele zaawansowanych opcji, np.status=progress
aby zobaczyć postęp transferuDziała, ponieważ sudo przekazuje stdin do polecenia.
źródło
dd
tym, jak nadpisujemy nasze niegdyś wspaniałe systemy plików i nie zdajemy sobie sprawy, że jest to również do przyziemnych zadań - i że inne polecenia jako root również powodują duże szkody, jeśli są używane na niewłaściwych plikach / urządzeniach. Podobnie jaksudo tee
,sudo dd
oczywiście będzie również działać z ciągami tutaj , npsudo dd of=outfile <<<'hello world'
. [Dzięki za edycję. NB zsh -c 'cmd'
,sh
to podproces, który jest powłoką, ale tak naprawdę nie jest podpowłoką, z wyjątkiem tego, że wszystkie zewnętrzne polecenia zaczynają się jako jedna.]