Vraag Voer hetzelfde commando opnieuw uit maar als root


Soms merk ik tijdens het uitvoeren van een opdracht niet dat ik het als supergebruiker moet uitvoeren om voldoende toestemming te hebben.

Is er een manier om dezelfde opdracht opnieuw uit te voeren, maar als een supergebruiker?


90
2018-05-27 20:31


oorsprong




antwoorden:


De eenvoudigste manier is om uit te voeren:

sudo !!

Hiermee wordt de laatste opdracht uitgevoerd, maar dan als supergebruiker.

Bron.


165
2018-05-27 20:31



Ik vond dit vrij handig en ik was er nog niet eerder tegengekomen (hoewel het misschien algemeen bekend is). Ik kon het niet vinden op de site, dus ik dacht dat ik het zelf zou beantwoorden. - Trufa
Als terzijde, executeren !! zelfstandig voert u uw vorige commando uit per opgeslagen in history. Bovendien, doen !-1, !-2, enzovoort, voert je laatste opdracht, het tweede laatste commando, enzovoort uit. Handig! - oaskamay
Als een ander terzijde, !<command> zal de laatste gebeurtenis uitvoeren vanaf ~/.bash_history die beginnen met <command> - Radu Rădeanu
ctrl-r is ook erg handig. het zal in uw geschiedenis achteruit zoeken naar opdrachten die overeenkomen met wat u typt. Hiermee kunt u de opdracht bewerken voordat u deze opnieuw uitvoert - KayEss
Dit is stom ! bash ding gekopieerd van tcsh heeft me meer keren verpest dan ooit nuttig geweest. Dubbele aanhalingstekens beschermen niet tegen de interpretatie van !. $ foo "!bar" -> !bar: event not found. - Kaz


enter image description here

Antwoord: je komt binnen sudo !! direct daarna om het vorige commando te herhalen met geëscaleerde privileges.

Bewerk:  Afbeelding gevonden via reddit, en het is een parodie op de origineel xkcd strip van Randall Munroe.


64
2018-05-27 21:31



alsjeblieft niet een voor-of-tegen-gesprek hier in reacties. Als u de voordelen of anderszins wilt bespreken, gebruik dan Meta. Bedankt. - fossfreedom♦


U kunt de pijl-omhoogtoets gebruiken om door uw oude opdrachten te bladeren en deze te herschrijven / wijzigen en de sudo voor hen. (de startknop boven de pijltjestoetsen zal de positie naar het begin instellen.)

Ik vind de sudo !! idee, omdat je soms tussendoor een ander commando toevoegt en je het niet meer herinnert.


17
2018-05-28 11:09



Gelukkig als je dat doet sudo !!, de schaal zal uitbreiden !! zodat je kunt zien welk commando het probeert uit te voeren. Het kan dus irritant worden om op Ctrl-C te drukken en het juiste commando te vinden, maar het zal je in ieder geval niet verbazen. - Reid
@Reid Het zal niet uitbreiden tot na u drukt op enter en als u zich binnen dat venster bevindt waar u uw wachtwoord niet opnieuw hoeft in te voeren, zal het zonder bevestiging worden uitgevoerd. +1 om de geschiedenis te gebruiken in plaats van blindelings te gebruiken !! - Izkata
@Izkata: Ik veronderstel dat dat waar is. Ik gebruik zsh, dus ik typ gewoon sudo !!<TAB> en het autocompletes !! voor mij. Bash kan de geschiedenis uitbreiden met M-^ (voor mij, alt + shift + 6), maar dat is minder vloeiend (je zou dit echter nog een keer kunnen herhalen). Er is ook shopt -s histverify, wat het zo maakt dat wanneer u de uitbreiding van de geschiedenis gebruikt en op Enter drukt, u in plaats daarvan een nieuwe aanwijzing krijgt met de uitgevoerde uitbreiding zodat u deze kunt zien / bewerken. - Reid
Ik dacht meer aan de situatie waarin ik een opdracht typte, de opdracht gaf terug dat toestemming werd geweigerd en ik weet dat ik exact hetzelfde commando opnieuw wil uitvoeren, maar als sudo, het proces van opdrukken, thuis typen, sudo typen en veel voelt langzamer voor mij. Het is de manier waarop ik het voor altijd heb gedaan en het voelde gewoon inefficiënt. - Trufa
@Reid: shopt -s histverify zal geen enkel stukje helpen. De meeste mensen zullen wennen aan slaan Enter tweemaal. Op dat moment zijn ze nog steeds te laat om te controleren wat er is gebeurd. - Frank Kusters


Ik voeg gewoon een alternatief toe: zo kort als typen sudo !! en flexibeler:

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

Het is precies hetzelfde aantal toetsaanslagen (ik tel "ctrl + A" als één ...), maar door "pijl omhoog" toe te voegen, kunt u dit doen op elke opdracht uit uw geschiedenis.


12
2018-05-28 09:22



ctrl + A komt uit de emacs-bindingen, je kunt ook de vi-bindingen gebruiken (set -o vi). Vervolgens kunt u Escape (ga naar de opdrachtmodus) en vervolgens 'I' (hoofdletter 'i' invoegen aan het begin van de regel). - Gerhard Burger
@GerhardBurger: ik weet het, maar gek hoor ik liefde vi (vooral vim) voor het bewerken van meerdere regels documenten, maar ik prefereer de emacs-binding in de shell (het is niet echt logisch om van commando- naar edit-modus te wisselen in de shell, en de snelkoppelingen van emacs zijn voldoende voor dagelijks gebruik, zelfs als het minder krachtig is) - Olivier Dulac
Toegegeven, ik heb het alleen voor de volledigheid toegevoegd, voor mij is het hetzelfde, maar ik vind zoeken met '/' erg handig;) - Gerhard Burger
@GerhardBurger: over "/" van vi-modus, reguliere (emacs-binding) bash heeft ook een erg handige manier om vorige commando's te vinden door een paar letters te typen en vervolgens 'ctrl + r' totdat je het vindt - Olivier Dulac


Er zijn een paar manieren om dit te doen

  • Voer eenvoudig de opdracht opnieuw in toevoegen sudo voor het commando

  • druk op Pijltje omhoog om het laatste commando te krijgen en te plaatsen sudo voor.

  • invoeren sudo !!

De !! breidt uit naar de laatst ingevoerde opdracht. U kunt soortgelijke dingen met andere dingen doen met de geschiedenis van de opdrachtregel hier 


7
2018-05-31 19:07





Deze vraag had kunnen worden gegeneraliseerd in "Voer dezelfde opdracht uit, maar met wat aanpassingen", omdat een van de briljante ontwerpbeslissingen in Unix is ​​dat wat eenmaal in de shell is geïmplementeerd, kan worden gebruikt door elk commando dat wordt aangeroepen vanuit de shell.

Met andere woorden, deze truc is niet van toepassing net  naar sudo:

  • Herhaal de vorige opdracht als superuser (sudo !!)
  • Herhaal de vorige opdracht en de tijd (time !!)
  • Herhaal de vorige opdracht met een andere omgeving (env A=b B=z !!)
  • Herhaal de vorige opdracht (!!)

Geschiedenisuitbreiding (ook bekend als geschiedenisvervanging) is slechts een shell-functie om herhalende eerdere opdrachten eenvoudiger te maken (met minder toetsaanslagen). Kijk op de shell man-pagina voor history expansion. Het beschrijft nog veel meer trucs en kortere wegjes die je met geschiedenis kunt doen, bijvoorbeeld:

U kunt naar de vorige opdrachten verwijzen op nummer:

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

U kunt in eerdere opdrachten verwijzen naar afzonderlijke woorden:

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

U kunt ook zoeken voordat u het volgende herhaalt:

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

U kunt de geschiedenis doorzoeken en iets vervangen door iets anders:

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

En nog veel meer, omdat u commandoselectie, argenselectie, zoeken en onafhankelijk van elkaar kunt combineren.

De man-pagina van je shell (in dit geval man bash) is jouw vriend.


6
2018-05-27 23:58



briliant! dat zou het geaccepteerde antwoord moeten zijn. - Eliran Malka


ik gebruik zsh in plaats van bash en heb dit in mijn ~/.zshrc, dus drukken alt+S inserts sudo aan het begin van de opdrachtregel:

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

Helaas kon ik geen manier vinden om hetzelfde te doen in bash.


5
2018-05-29 04:37



Je kunt eenvoudig hetzelfde doen in Bash met GNU Readline: voeg toe aan je ~/.inputrc  "\es":"\C-asudo " en je gaat naar het begin van een lange rij en sudo wordt bij het begin van de regel ingevoegd bij het indrukken van alt-s. Start terminal opnieuw of lees opnieuw ~/.inputrc om het te laten werken.


su -c "!!"

Als u geen toestemming hebt om root te zijn met sudo of sudo, is het programma niet op het systeem geïnstalleerd.


1
2018-06-14 14:22





De manier waarop ik het verkies:

  • Pijltjestoets omhoog
  • Huis
  • "sudo"
  • invoeren

Maar het is misschien eenvoudiger om gewoon "sudo !!" te doen, het is aan jou.


1
2017-07-07 09:55