Eseguire di nuovo lo stesso comando ma come root


117

A volte quando eseguo un comando non noto che avevo bisogno di eseguirlo come superutente per avere abbastanza autorizzazioni.

C'è un modo per eseguire di nuovo lo stesso comando ma come superutente?

Risposte:


196

Il modo più semplice è eseguire:

sudo !!

Questo eseguirà l'ultimo comando ma come superutente.

Fonte .


5
L'ho trovato abbastanza utile e non l'avevo mai trovato prima (anche se potrebbe essere una conoscenza comune). Non sono riuscito a trovarlo sul sito, quindi ho pensato di rispondere da solo.
Trufa,

30
Per inciso, l'esecuzione !!da sola esegue il comando precedente come da salvato in history. Inoltre, doing !-1, !-2e così via esegue l'ultimo comando, il secondo ultimo comando e così via. Maneggevole!
Oaskamay,

6
A parte un altro, !<command>eseguirà l'ultimo evento da ~/.bash_historyquell'inizio con<command>
Radu Rădeanu,

1
ctrl-r è anche molto utile. cercherà all'indietro nella cronologia i comandi corrispondenti a ciò che scrivi. Ciò ti consentirà di modificare il comando prima di eseguirlo nuovamente
KayEss,

4
Questa stupida !cosa da bash copiata tcshmi ha rovinato più volte di quanto non sia mai stata utile. Le doppie virgolette non proteggono dall'interpretazione di !. $ foo "!bar"-> !bar: event not found.
Kaz,

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​inserisci qui la descrizione dell'immagine

risposta : si immette sudo !!subito dopo per ripetere il comando precedente con privilegi di escalation.

modifica: immagine trovata tramite reddit , ed è una parodia del fumetto originale xkcd di Randall Munroe.


3
per favore non tenere una conversazione pro o contro qui nei commenti. Se desideri discutere dei meriti o meno, usa Meta. Grazie.
Fossfreedom

17

Puoi provare il tasto freccia su per scorrere i tuoi vecchi comandi e riscriverli / cambiarli e aggiungere il sudodavanti. (il pulsante home sopra i tasti freccia imposterà la posizione all'inizio).

Non mi piace l' sudo !!idea, perché a volte aggiungi un altro comando in mezzo e non ricordi più.


1
Fortunatamente, quando lo fai sudo !!, la shell si espanderà in !!modo da poter vedere quale comando sta cercando di eseguire. Quindi, potrebbe essere irritante premere Ctrl-C e trovare il comando giusto, ma almeno non ti sorprenderà.
Reid,

4
@Reid Non si espanderà fino a quando non premi Invio, e se ti trovi in ​​quella finestra in cui non devi inserire nuovamente la password, verrà eseguito senza conferma. +1 all'utilizzo della cronologia anziché all'utilizzo cieco!!
Izkata,

5
@Izkata: suppongo sia vero. Uso zsh, quindi scrivo sudo !!<TAB>e si completa automaticamente !!per me. Bash può espandere la storia con M-^(per me, alt + maiusc + 6), ma è meno fluente (potresti ribaltarlo, però). C'è anche shopt -s histverify, che lo rende in modo che quando usi l'espansione della cronologia e premi invio, ti dà invece un'altra riga di prompt con l'espansione eseguita per permetterti di vederlo / modificarlo.
Reid,

1
Stavo pensando di più alla situazione in cui ho digitato un comando, il comando ha restituito che l'autorizzazione è stata negata e so che voglio eseguire di nuovo esattamente lo stesso comando ma come sudo, il processo di premere su, home, digitare sudo e mi sento molto più lento per me. È il modo in cui l'ho fatto per sempre e mi è sembrato inefficiente.
Trufa,

@Reid: shopt -s histverifynon aiuta un po '. La maggior parte delle persone si abituerà a colpire Enterdue volte. A quel punto sono ancora troppo tardi per controllare cosa è successo.
Frank Kusters,

13

Aggiungerò solo un'alternativa: breve quanto la digitazione sudo !!e più flessibile:

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

È esattamente lo stesso numero di sequenze di tasti (io conto "ctrl + A" come uno ...), ma aggiungendo "freccia su" puoi farlo su qualsiasi comando nella tua cronologia.


1
ctrl + A proviene dai bind emacs, puoi anche usare i bind vi ( set -o vi). Quindi puoi uscire (vai in modalità comando) e poi 'I' (maiuscolo 'i', inserisci all'inizio della riga).
Gerhard Burger,

1
@GerhardBurger: lo so, ma, stranamente, adoro vi (specialmente vim) per l'editing di documenti multilinea, ma preferisco di gran lunga il legame di emacs nella shell (dover passare dal comando alla modalità di modifica nella shell non lo fa ha davvero senso, imo, e le scorciatoie di emacs sono abbastanza per l'uso quotidiano, anche se meno potente)
Olivier Dulac,

È vero, l'ho aggiunto solo per completezza, per me è lo stesso, tuttavia trovo molto utile la ricerca con '/';)
Gerhard Burger,

@GerhardBurger: a proposito della modalità "/", regolare (emacs binding) bash ha anche un modo molto utile per trovare i comandi precedenti digitando alcune lettere quindi 'ctrl + r' fino a quando non lo trovi
Olivier Dulac

7

Ci sono alcuni modi per farlo

  • Basta inserire nuovamente il comando aggiungendo sudoprima del comando

  • Premere Up arrowper ottenere l'ultimo comando e metterlo sudodi fronte.

  • accedere sudo !!

Si !!espande all'ultimo comando inserito. Puoi fare cose simili con altre cose con la cronologia della riga di comando vedi qui


7

Questa domanda avrebbe potuto essere generalizzata in " Esegui lo stesso comando ma con qualche modifica ", poiché una delle brillanti decisioni di progettazione in Unix, è che ciò che è implementato una volta nella shell, può essere sfruttato da qualsiasi comando invocato dalla shell.

In altre parole, questo trucco non si applica solo a sudo:

  • Ripeti il ​​comando precedente come superutente ( sudo !!)
  • Ripeti il ​​comando precedente e cronometra ( time !!)
  • Ripeti il ​​comando precedente con un ambiente diverso ( env A=b B=z !!)
  • Ripeti il ​​comando precedente ( !!)

L'espansione della cronologia (nota anche come sostituzione della cronologia) è solo una funzione della shell che semplifica la ripetizione dei comandi precedenti (con meno tasti). Controlla la pagina man della shell per history expansion. Descrive molti altri trucchi e scorciatoie che puoi fare con la storia, ad esempio:

È possibile fare riferimento ai comandi precedenti in base al numero:

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

È possibile fare riferimento a singole parole nei comandi precedenti:

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

Puoi anche cercare prima di ripetere:

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

Puoi cercare nella cronologia e sostituire qualcosa con qualcos'altro:

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

E molto altro, dal momento che è possibile combinare la selezione dei comandi, la selezione arg, la ricerca e la sostituzione in modo indipendente.

La pagina man della tua shell (in questo caso man bash) è tua amica.


1
Briliant! quella dovrebbe essere la risposta accettata.
Eliran Malka,

5

Uso zsh invece di bash e ho questo nel mio ~/.zshrc, quindi premendo Alt+ Sinserisce sudoall'inizio della riga di comando:

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

Sfortunatamente, non sono riuscito a trovare un modo per fare la stessa cosa a Bash.


3
Puoi fare facilmente lo stesso in Bash usando GNU Readline: aggiungi al tuo ~/.inputrc "\es":"\C-asudo "e ti sposterai all'inizio di una lunga linea e sudo verrà inserito all'inizio della linea premendo alt-s. Riavvia il terminale o rileggilo ~/.inputrcaffinché funzioni.

2

Se vuoi farlo in un alias, devi usarlo alias redo='sudo $(history -p !!)'per qualche motivo.


1
su -c "!!"

Se non si dispone dell'autorizzazione per essere root con il programma sudo o sudo non installato sul sistema.


1

Il modo in cui lo preferisco:

  • Tasto freccia su
  • Casa
  • "sudo"
  • accedere

Ma potrebbe essere più semplice fare semplicemente "sudo !!", dipende da te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.