Na przykład, jeśli chcę utworzyć plik i wprowadzić tekst w jednym wierszu, mogę przekierować dane wyjściowe do pliku za pomocą >
operatora:
echo "something" > /path/foobar
ale jeśli nie mam dostępu do folderu /path/
i potrzebuję uprawnień sudo, jak mogę wykonać to samo polecenie, co zwykły użytkownik z uprawnieniami sudo?
próbowałem
sudo echo "something" > /path/foobar
ale to nie działa, ponieważ sudo liczy się tylko dla osób edit
, ale nie dla prawej części
z>
Jasne, mógłbym zostać rootem przed sudo su
lub użyć tee
zamiast tego:
echo "something" | sudo tee /path/foobar
Chciałbym jednak znaleźć rozwiązanie, w którym będę mógł pracować z ostatnią linią jako zamiennikiem przez
sudo !!
Czy nie ma sposobu na „przetworzenie” ostatniego wiersza i dodanie go sudo
z przodu?
bash
sudo
command-history
rubo77
źródło
źródło
alias sudo !!
?Odpowiedzi:
Nie możesz po prostu
sudo
stać przed poleceniem powłoki, musisz wywołać powłokę, aby ponownie ocenić to polecenie (robiąc takie rzeczy, jak rozszerzanie zmiennych, otwieranie plików dla operatorów przekierowania itp.). Więc to jestpoza tym, że to nie do końca działa, ponieważ
!!
interpoluje tekst poprzedniego polecenia, znaków specjalnych i wszystkich innych. Musisz pobrać tekst polecenia jako ciąg znaków i przekazać go jako argument dosh
. Na szczęściefc
wbudowane bash pozwala ci to zrobić¹.Lub nawet, aby mieć pewność, że uruchomisz tę samą wersję bash, która jest obecnie uruchomiona:
Zauważ, że ponieważ polecenie jest wykonywane w osobnym procesie powłoki, dziedziczy zmienne środowiskowe (tylko te, które
sudo
zachowują, pamiętaj), ale nie wewnętrzne zmienne powłoki. Opcje powłoki (np.kshglob
) I inne ustawienia zostaną uruchomione domyślnie.To samo polecenie² działa w zsh i ksh, chociaż ATT ksh93 wymaga, aby zarówno
first
and, jak ilast
liczba zostały przekazane dofc
³ (co działa również w bash, zsh i pdksh / mksh):Użycie
$0
oznaczenia pliku wykonywalnego działającej powłoki działa tylko wtedy, gdy powłoka została wywołana przez $ PATH, a $ PATH nie uległa zmianie lub przez ścieżkę bezwzględną.Oto kolejna metoda w Zsh, która jest nieco jaśniejsza, ale dłuższa:
Ostatnie słowo ostrzeżenia:
sudo
dotyczy potencjalnie niebezpiecznych poleceń. Nie rób tego zbyt łatwo z niego korzystać!¹ Na początku jest trochę białych spacji, a podstawianie poleceń usuwa nowe linie na końcu, ale składnia powłoki nie dba o to.
² Nie sądzę, aby Zsh lub Ksh miały coś takiego jak bash
$BASH
;$0
działa tylko wtedy, gdy jest to ścieżka bezwzględna lub gdy nie zawiera ukośnika, a ścieżka wyszukiwania poleceń nie uległa zmianie.³ jest pseudonimem dla ATT ksh, ale to jest równie dobre.
fc
hist
źródło
Jeśli chcesz powtórzyć to samo polecenie w sudo !! po wykonaniu następującego polecenia:
Używasz globalnej składni zastępowania do przywołania polecenia:
Użyj spacji po parametrze -a .
Jest to odpowiednik sudo !! ale pomaga ominąć ograniczenia sudo dla <i>. Ponieważ sudo nie pozwala na użycie [<,>].
Aby ogólnie ominąć ograniczenia sudo dotyczące przekierowań, możesz użyć tego w następujący sposób:
Polecenie tee pozwala na odczyt ze standardowego wejścia i zapis na standardowe wyjście i pliki
Jeśli chcesz powtórzyć polecenie i dołączyć tekst do pliku, polecenie tee ma opcję -a do dołączenia. Możesz więc przywołać polecenie za pomocą
a tekst zostanie dołączony do pliku
przykład:
źródło
-a
naprawdę jest potrzebny?>
nadpisze plik,tee -a
dołączy, który byłby>>
Wydaje się to tak proste, jak
sudo sh -c "!!"
:źródło
echo "foo bar"
który stałby się,sh -c "echo "foo bar""
który po prostu wydrukowałbyfoo
zamiastfoo bar
.sudo sh -c '!!'
zamiast tego, jeśli twoje polecenie, ale to też nie działaa=b
i wtedyecho "$a" >file
i wtedysudo sh -c '!!'
rozwinąłby się dosudo sh -c 'echo $a >file'
tego, by wydrukować pustą linię zamiastb
dofile
.sudo
do uzyskania powłoki roota, a następnie skopiowanie i wklejenie do niej polecenia byłoby najbliższe, ale nie powiedzie się, jeśli polecenie ma używać zmiennych ustawionych w powłoce innej niż root. Używaniesudo sh -c "!!"
działa dobrze dla prostych poleceń, ale jest obarczone złożonymi. Myślę, że najlepszą radą jest, aby nie oczekiwać, że będzie jakieś polecenie, które zadziała w 100% przypadków - poznaj kilka możliwych rozwiązań i zastosuj je, kiedy najlepiej pasuje.