Co oznacza „!!” w „sudo !!”?

64

Jestem użytkownikiem Ubuntu z niewielkim doświadczeniem i korzystam z niego sudo.

Co robi sudo !!i jak?

RamHS
źródło
7
Duplikat, oprócz z drugiej strony: Uruchom ponownie to samo polecenie, ale jako sudo
CVn
6
@WarrenHill nie chce „jak”, ale „co” i „jak”. Pyta więcej o !!część polecenia.
Braiam
1
@Nakilon nie powinien być. To pytanie dotyczy tego, co !!zrobić i jak. Drugi chce metody, aby to zrobić.
Braiam
@ MichaelKjörling miałeś na myśli powiązane, prawda?
Braiam
2
@Braiam Właściwie miałem na myśli duplikat; dwie najwyżej głosowane odpowiedzi na tę konkretnie wyjaśniają, co sudo !!robi, i są dwie odpowiedzi, które faktycznie dokładnie wyjaśniają, co !!robi.
CVn

Odpowiedzi:

74

!!w bash jest aliasem dla poprzedniego polecenia (patrz Designers ). Ponownie uruchamia poprzednie polecenie z sudouprawnieniami.

chronitis
źródło
15
Uwaga: !polecenia zwykle nie są dostępne w skryptach bash (tylko w sesjach interaktywnych). Można je wyłączyć za pomocą set +o histexpand.
Benoit,
64

sudo bang bang jest bardzo przydatnym poleceniem podczas pracy w interfejsie wiersza poleceń.

Niektóre dystrybucje systemu Linux wymagają logowania jako użytkownik zamiast administratora.

Tak więc, aby zrobić coś administracyjnie, musisz wykonać polecenie sudo(Super-User DO), które mówi systemowi: „zrobisz to, ponieważ tak powiedziałem”. / bang-bang (! = bang) to w zasadzie skrót, którego można użyć do powtórzenia poprzedniego polecenia.

Typowy scenariusz polega na tym, że wypróbujesz polecenie, które odtwarza komunikat mówiący, że musisz być administratorem, aby to zrobić. Możesz więc wpisać polecenie, sudoaby uruchomić tę komendę jako superużytkownik / administrator, lub wpisać sudo !!gdzie !!mówi systemowi, aby użył poprzedniej komendy, która została podjęta. UfH

Istnieje wiele innych poleceń huku. Aby zapoznać się z ich listą i objaśnieniami, sprawdź Polecenia Linux Bang , zobacz także historię Bash i polecenia Bang

Mitch
źródło
12
Jest to również bardzo niebezpieczne polecenie, jeśli nie jesteś w 100% pewien, jakie było twoje poprzednie polecenie. Prawie zawsze bezpieczniej jest nacisnąć strzałkę w górę, następnie klawisz Home, a następnie wpisać sudoi spojrzeć na wiersz poleceń.
Shadur
3
@Shadur Zwykle twoje poprzednie polecenie było około 1 sekundy temu. Normalnym przypadkiem użycia jest przypadek opisany w odpowiedzi: zapominasz o sudoczymś i dostajesz błąd, więc od razu chcesz to sudozrobić
Michał Mrożek,
1
@Braiam: CLI to skrót. Naruszenie zasad społeczności! Atak! Ponownie edytuj!
Indian
4
sudonie oznacza „super-user do”, działa tak samo jak polecenie , jakbym to zrobił su(su oznacza zmianę użytkownika [a nie superużytkownika]); tzn. możesz wykonywać polecenia sudo jak każdy użytkownik, nie tylko root ( -uprzełącznik); to samo dotyczysu [user] [-c command]
ssice
1
@Mitch z wyjątkiem sutego nie oznacza. Zobacz linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Powinno to oznaczać użytkownika zastępczego .
ssice
38

bang bang (!!)Polecenie jest skrótem do powtarzać i uruchomić poprzednie polecenie wprowadzoną w terminalu. To polecenie jest bardzo przydatne, gdy zapomnisz, że potrzebujesz uprawnień administratora, aby wykonać określone działanie, i pozwala powtórzyć je z uprawnieniami superużytkownika, wpisując,

sudo !!

!! pobiera polecenie ostatniego uruchomienia.

Na przykład:

apt-get update

Dane wyjściowe będą

E: Nie można otworzyć pliku blokady / var / lib / apt / list / lock - open (13: Odmowa zezwolenia)
E: Nie można zablokować katalogu / var / lib / apt / list /
E: Nie można otworzyć pliku blokady / var / lib / dpkg / lock - open (13: Odmowa dostępu)
E: Nie można zablokować katalogu administracyjnego (/ var / lib / dpkg /), czy jesteś rootem?

Następnie, jeśli uruchomimy sudo !!polecenie, wyjście będzie

Hit http://extras.ubuntu.com saucy/main amd64 Packages
Get:3 http://mirror.sov.uk.goscomb.net saucy-updates Release.gpg [933 B]
Hit http://ppa.launchpad.net saucy Release                                  
Hit http://extras.ubuntu.com saucy/main i386 Packages 
Hit http://mirror.sov.uk.goscomb.net saucy Release                             
99% [Waiting for headers] [Waiting for headers] [Waiting for headers]

Co oznacza, że !!część pobiera poprzednie polecenie uruchomienia, apt-get updatea poprzednia sudoczęść powoduje uruchomienie polecenia z uprawnieniami administratora.

I jak to sudo !!działa poprzednie polecenie z uprawnieniami administratora środków, zazwyczaj wszystkie polecenia mamy wpisane na terminalu są przechowywane w command history.Run historypoleceń w terminalu, pokazuje wszystkie polecenia, które entered.The !!udział w sudo !!zgarnięcia ostatnie polecenie przechowywane w historii poleceń i całość sudo !!uruchamia ostatnie polecenie z uprawnieniami administratora.

Niektóre inne polecenia Bang zostały wyjaśnione w tym poście na blogu .

Avinash Raj
źródło
3
Jestem zaskoczony, gdy znów wspomniałem o „Bang Bang”. Myślałem, że raz wystarczyło.
kiri
1
+1, aby zobaczyć więcej przykładów poleceń huku.
WernerCD,
1
@Rmano Przynajmniej w Bash, i oczekuję, że wszystkie powłoki w stylu Bourne'a z obsługą historii, mkdir LongDirectoryNamei cd !$muszą być wydawane osobno, aby działały, chyba że LongDirectoryNamezdarzy się, że jest to ostatnie słowo poprzedniego polecenia. Do celów historii powłoki mkdir LongDirectoryName; cd !$jest jednym poleceniem. Historia interakcji z !!, !^i !$użyj ostatniego polecenia, które powłoka faktycznie w pełni przetworzyła przed zobaczeniem !. Oto przykład. Po uruchomieniu historyzobaczysz, że polecenia w połączonej linii ;są zapamiętywane jako jedno polecenie.
Eliah Kagan
@EliahKagan masz rację! Usunięte błędne informacje ...
Rmano
13

Odpowiedź składa się z dwóch części: !!isudo

!!jest częścią funkcjonalności powłoki (w przypadku Ubuntu jest to prawdopodobnie bash, ale obsługują to również inne powłoki, takie jak zsh lub csh), zwane „rozszerzaniem historii”. Zachowuje się podobnie jak inne rozszerzenia, ponieważ powłoka rozwija „symbol zastępczy” do zestawu słów. Chociaż foo*zostanie rozwinięty do listy wszystkich plików zaczynających się od „foo”, !!zostanie rozszerzony do zawartości poprzedniego wiersza poleceń.

$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar

Podobnie jak inne rozszerzenia, odbywa się to w całości przez powłokę, więc jeśli wpiszesz !!po jakimś innym poleceniu, to polecenie nie będzie wiedziało, że było !!, ale zobaczy tylko poprzednią linię poleceń. (W przeciwieństwie do innych rozszerzeń, rozszerzanie historii następuje przed zapisaniem polecenia w historii, czyli zamiast !!zastąpionego wiersza polecenia zostanie zapisany w historii).


sudoKomenda umożliwia wykonywanie poleceń jako inny użytkownik, pod warunkiem, że uprawnienia przyznane przez ar polityki bezpieczeństwa (domyślnie jest skonfigurowany /etc/sudoers).

Domyślnie hasło roota nie jest ustawione w Ubuntu. Aby wykonać zadania administracyjne systemu, użytkownik utworzony podczas instalacji otrzymuje uprawnienia sudo. Ten użytkownik może teraz wykonać dowolne polecenie w powłoce jako root, po prostu przygotowując sudo. Niektóre programy GUI również używają mechanizmu sudo, na przykład do zarządzania pakietami.

Powodem, dla którego sudomożna wykonywać inne polecenia jako root (lub inny użytkownik), jest to, że sudo binary ( /usr/bin/sudo) ma ustawiony bit setuid w swoim uprawnieniu i należy do roota. Dowolny (binarny) plik wykonywalny z ustawionym bitem setuid jest uruchamiany z uprawnieniami właściciela. Oznacza to, że sudo działa skutecznie z uprawnieniami root, bez względu na to, który użytkownik tak naprawdę to nazwał. Tylko on polityk bezpieczeństwa wewnętrznego sudo zarządza tym, który użytkownik jest dozwolony, i uniemożliwia arbitralnym użytkownikom wykonywanie dowolnych czynności.


Tak więc w przypadku sudo !!tych środków

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!

jest w zasadzie identyczny z

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt

po prostu mniej pisania. W obu przypadkach sudo po prostu widzi mount /dev/sdb1 /mnti uruchamia je z uprawnieniami administratora.

Adaefon
źródło
5

!!jest najprostszym składniowo i prawdopodobnie najczęstszym wyrażeniem ekspansji historii .

Jak zapewne zauważyłeś, po podstawieniu ostatniego wykonanego polecenia !!, bash robi dwie rzeczy (w domyślnej konfiguracji):

  1. Wyświetlane jest pełne polecenie z podstawionym tekstem.

    Na przykład, jeśli twoje polecenie było lshw -c videoi uruchomisz je sudo !!dalej, to polecenie po rozwinięciu historii to sudo lshw -c video.

  2. To polecenie jest uruchamiane.

Zwykle te dwa kroki odbywają się bez przerwy i bez możliwości interakcji z użytkownikiem, ponieważ shopt histverifydomyślnie jest ono wyłączone ( shopt -u histverify).

Jeśli jednak włączysz shopt histverify( shopt -s histverify), rozszerzenie historii działa inaczej:

  1. Otrzymasz nowy monit podstawowy z automatycznie wprowadzonym rozszerzonym tekstem. To tak, jakbyś sam napisał ten tekst z kursorem na końcu, ale jeszcze nie uruchomił polecenia.
  2. Użytkownik musi następnie nacisnąć przycisk, Enteraby uruchomić polecenie. Możesz też edytować polecenie, anulować je ( Ctrl+ C) itp. Pamiętaj, że nie jest to specjalny monit, ale zwykły podstawowy monit. To tak, jakbyś sam napisał tekst.

(Zauważ, że histverify opcja powłoki działa tylko wtedy, gdy używana jest biblioteka readline - ale gdy używasz basha interaktywnie na Ubuntu lub innym systemie GNU / Linux, zasadniczo tak jest zawsze.)

Bez względu na to, czy histverifyopcja powłoki jest włączona , ekspansja historii różni się od wielu innych rozszerzeń powłoki. Inne rozszerzenia powłoki nie pokazują rozwiniętego polecenia przed jego uruchomieniem. W przeciwieństwie do innych rozszerzeń, które mają być używane zarówno interaktywnie, jak i nieinteraktywnie (na przykład w skrypcie powłoki), ekspansja historii jest prawie zawsze używana interaktywnie.

Eliah Kagan
źródło
3

! jest używany w Linuksie do skrótów związanych z historią. Więc, !! po prostu uruchomi poprzednio wykonane polecenie.

Jest to bardzo pomocne w przypadkach, gdy albo zapomnisz umieścić sudo przed poleceniem, które tego wymaga, albo otrzymasz Odmowę uprawnień lub coś takiego po prostu zrób

sudo !!
i jesteś skończony.

tapananand
źródło
0

!! powtórzy i uruchomi poprzednią komendę, a wraz z sudo da komendzie uprawnienia roota. (Nie ma go na stronie podręcznika? !! Nie widzę go tam.)

Farimah
źródło
Dla każdego, kto szuka strony man:man --pager='less -p "Event Designators"' bash
Sebi