Uruchom ponownie to samo polecenie, ale jako root

116

Czasami po uruchomieniu polecenia nie zauważam, że muszę go uruchomić jako superużytkownik, aby mieć wystarczające uprawnienia.

Czy istnieje sposób na ponowne uruchomienie tego samego polecenia, ale jako superużytkownik?

Trufa
źródło

Odpowiedzi:

195

Najprostszym sposobem jest uruchomienie:

sudo !!

Uruchomi to ostatnie polecenie, ale jako superużytkownik.

Źródło .

Trufa
źródło
5
Uznałem to za bardzo przydatne i nie spotkałem się z tym wcześniej (choć może to być powszechnie znana). Nie mogłem go znaleźć na stronie, więc pomyślałem, że sam odpowiem.
Trufa
30
Nawiasem mówiąc, wykonanie !!na własną rękę uruchamia poprzednie polecenie zgodnie z zapisanym w history. Ponadto wykonywanie !-1, !-2itd. Wykonuje ostatnie polecenie, drugie ostatnie polecenie i tak dalej. Poręczny!
oaskamay
6
Jako kolejny, !<command>wykona ostatnie wydarzenie od ~/.bash_historytego początku<command>
Radu Rădeanu
1
ctrl-r jest również bardzo użyteczny. przeszuka do tyłu w historii polecenia pasujące do wpisanego tekstu. Umożliwi to edycję polecenia przed jego ponownym uruchomieniem
KayEss
4
Ta głupia !bashowa kopia, która została skopiowana tcsh, spieprzyła mnie więcej razy niż kiedykolwiek była użyteczna. Podwójne cytaty nie chronią przed interpretacją !. $ foo "!bar"-> !bar: event not found.
Kaz
70

W pobliżuwprowadź opis zdjęcia tutaj

odpowiedź : wchodzisz sudo !!bezpośrednio po nim, aby powtórzyć poprzednie polecenie ze zwiększonymi uprawnieniami.

edytuj: Obraz znaleziony przez reddit , i jest to parodia oryginalnego komiksu xkcd autorstwa Randalla Munroe.

wim
źródło
3
w komentarzach nie rozmawiaj za lub przeciw. Jeśli chcesz omówić zalety lub w inny sposób, skorzystaj z Meta. Dzięki.
fossfreedom
17

Możesz spróbować użyć klawisza strzałki w górę, aby przewijać stare polecenia, przepisywać / zmieniać je i dodawać sudoprzed nimi. (przycisk Home nad klawiszami strzałek ustawi pozycję na początek.)

Nie podoba mi się ten sudo !!pomysł, ponieważ czasami dodajesz kolejne polecenie i już nie pamiętasz.

Ksylol
źródło
1
Na szczęście, gdy to zrobisz sudo !!, powłoka rozszerzy się !!, abyś mógł zobaczyć, jakie polecenie próbuje uruchomić. Więc może irytujące jest naciśnięcie Ctrl-C i znalezienie właściwego polecenia, ale przynajmniej nie zabierze cię to nieoczekiwanie.
Reid
4
@Reid To nie rozszerzy aż po trafieniu wejść, a jeśli jesteś w tym oknie, gdzie nie trzeba ponownie wprowadzić hasło, to będzie działać bez potwierdzenia. +1 do korzystania z historii zamiast ślepego korzystania!!
Izkata
5
@Izkata: Myślę, że to prawda. Używam zsh, więc po prostu piszę, sudo !!<TAB>a !!dla mnie autouzupełnianie . Bash może poszerzać historię za pomocą M-^(dla mnie, Alt + Shift + 6), ale jest to mniej płynne (można to jednak ponownie powiązać). Istnieje również shopt -s histverifyfunkcja, która sprawia, że ​​gdy używasz rozszerzenia historii i naciskasz klawisz Enter, zamiast tego wyświetla ci się kolejny wiersz zachęty z wykonanym rozwinięciem, abyś mógł go zobaczyć / edytować.
Reid
1
Myślałem bardziej o sytuacji, w której wpisałem polecenie, polecenie zwróciło, że odmówiono zgody, i wiem, że chcę ponownie uruchomić dokładnie to samo polecenie, ale jako sudo, proces naciskania, powrotu do domu, pisania sudo i odczuwam wiele wolniej dla mnie. Tak robiłem to od zawsze i wydawało mi się to nieefektywne.
Trufa
@Reid: shopt -s histverifynie pomoże ani trochę. Większość ludzi przyzwyczai się do Enterdwukrotnego uderzenia . W tym momencie są jeszcze za późno, aby sprawdzić, co się stało.
Frank Kusters
13

Dodam tylko alternatywę: tak krótkie jak pisanie sudo !!i bardziej elastyczne:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

Jest to dokładnie taka sama liczba naciśnięć klawiszy (liczę „ctrl + A” jako jeden ...), ale dodając „strzałkę w górę” możesz to zrobić na dowolnym poleceniu w twojej historii.

Olivier Dulac
źródło
1
ctrl + A pochodzi z powiązań emacsa, możesz także użyć powiązań vi ( set -o vi). Następnie możesz uciec (przejdź do trybu poleceń), a następnie „I” (wielkie „i”, wstaw na początku wiersza).
Gerhard Burger
1
@GerhardBurger: Wiem, ale, co dziwne, uwielbiam vi (szczególnie vim) do edycji dokumentów w wielu wierszach, ale wolę wiązanie emacsa w powłoce (przełączanie z trybu poleceń do trybu edycji w powłoce nie naprawdę ma sens, imo, a skróty emacsa są wystarczające do codziennego użytku, nawet jeśli są mniej wydajne)
Olivier Dulac
To prawda, że ​​dodałem go tylko dla kompletności, dla mnie to samo, jednak uważam, że wyszukiwanie za pomocą „/” jest bardzo wygodne;)
Gerhard Burger
@GerhardBurger: o bicie „/” w trybie vi, regularne (wiązanie emacsa) ma również bardzo przydatny sposób na znalezienie poprzednich poleceń, wpisując kilka liter, a następnie „ctrl + r”, dopóki go nie znajdziesz
Olivier Dulac
7

Można to zrobić na kilka sposobów

  • Po prostu wprowadź polecenie ponownie, dodając sudoprzed poleceniem

  • Naciśnij, Up arrowaby uzyskać ostatnie polecenie i umieścić je sudoprzed nim.

  • Wchodzić sudo !!

W !!rozszerza się do ostatniego polecenia wprowadzone. Możesz robić podobne rzeczy z innymi rzeczami dzięki historii wiersza poleceń, patrz tutaj

użytkownik162424
źródło
7

To pytanie można by uogólnić na „ Uruchom to samo polecenie, ale z pewną modyfikacją ”, ponieważ jedną z genialnych decyzji projektowych w Uniksie jest to, że to, co zaimplementowano raz w powłoce, może być wykorzystane przez dowolne polecenie wywoływane z powłoki.

Innymi słowy, ta sztuczka nie stosuje się tylko do sudo:

  • Powtórz poprzednie polecenie jako superuser ( sudo !!)
  • Powtórz poprzednie polecenie i określ czas ( time !!)
  • Powtórz poprzednie polecenie w innym środowisku ( env A=b B=z !!)
  • Powtórz poprzednie polecenie ( !!)

Rozszerzanie historii (znane również jako podstawianie historii) to po prostu funkcja powłoki, która ułatwia powtarzanie poprzednich poleceń (przy mniejszej liczbie naciśnięć klawiszy). Sprawdź swoją stronę podręcznika użytkownika powłoki pod kątem history expansion. Opisuje wiele innych sztuczek i skrótów, które możesz zrobić z historią, na przykład:

Możesz odwoływać się do poprzednich poleceń według numeru:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

W poprzednich poleceniach możesz odnosić się do poszczególnych słów:

some-command !$     # run some-command on the last arg of previous command

Możesz także wyszukać przed powtórzeniem:

!?awk               # repeat the last command including the string 'awk'

Możesz przeszukać historię i zastąpić coś innym:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

I wiele więcej, ponieważ można łączyć wybór poleceń, wybór argumentów, wyszukiwanie i zastępowanie niezależnie.

Strona man twojej powłoki (w tym przypadku man bash) jest twoim przyjacielem.

arielf
źródło
1
genialny! taka powinna być zaakceptowana odpowiedź.
Eliran Malka
5

Używam zsh zamiast bash i mam to w mojej ~/.zshrc, więc naciśnięcie Alt+ Swstawia sudona początku wiersza poleceń:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

Niestety nie udało mi się znaleźć sposobu na zrobienie tego samego w bashu.

Łatki
źródło
3
Możesz łatwo zrobić to samo w Bash, używając GNU Readline: dodaj do swojego, ~/.inputrc "\es":"\C-asudo "a przejdziesz na początek długiej linii, a sudo zostanie wstawione na początku linii po naciśnięciu alt-s. Zrestartuj terminal lub przeczytaj ~/.inputrcgo ponownie, aby działał.
2

Jeśli chcesz to zrobić w aliasie, musisz użyć alias redo='sudo $(history -p !!)'z jakiegoś powodu.

Aaron Franke
źródło
1
su -c "!!"

Jeśli nie masz uprawnień do rootowania w sudo lub program sudo nie zainstalował się w systemie.

Achu
źródło
1

Tak jak wolę:

  • Strzałka w górę
  • Dom
  • „sudo”
  • Wchodzić

Ale może być łatwiej po prostu zrobić „sudo !!”, to zależy od ciebie.

Farid El Nasire
źródło