Ejecute el mismo comando nuevamente pero como root


117

A veces, cuando ejecuto un comando, no me doy cuenta de que necesito ejecutarlo como superusuario para tener suficiente permiso.

¿Hay alguna manera de volver a ejecutar el mismo comando pero como superusuario?

Respuestas:


196

La forma más simple es ejecutar:

sudo !!

Esto ejecutará el último comando pero como superusuario.

Fuente .


55
Encontré esto bastante útil y no lo había encontrado antes (aunque puede ser de conocimiento común). No pude encontrarlo en el sitio, así que pensé en responderlo yo mismo.
Trufa

30
Por otro lado, la ejecución !!por sí solo ejecuta su comando anterior según lo guardado en history. Además, hacer !-1, !-2y así sucesivamente ejecuta su último comando, el segundo último comando, etc. ¡Práctico!
oaskamay

66
Como otro lado, !<command>ejecutará el último evento desde ~/.bash_historyese comienzo con<command>
Radu Rădeanu

1
ctrl-r también es muy útil. buscará hacia atrás en su historial comandos que coincidan con lo que escribe. Esto le permitirá editar el comando antes de ejecutarlo nuevamente
KayEss

44
Esta estúpida !cosa de bash copiada tcshme ha jodido más veces de lo que alguna vez ha sido útil. Las comillas dobles no protegen de la interpretación de !. $ foo "!bar"-> !bar: event not found.
Kaz

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ingrese la descripción de la imagen aquí

respuesta : ingresa sudo !!directamente después para repetir el comando anterior con privilegios escalados.

editar: imagen encontrada a través de reddit , y es una parodia del cómic original xkcd de Randall Munroe.


3
por favor no tenga una conversación a favor o en contra aquí en los comentarios. Si desea discutir los méritos o no, utilice Meta. Gracias.
fossfreedom

17

Puede probar la tecla de flecha hacia arriba para desplazarse por sus comandos anteriores y volver a escribirlos / cambiarlos y agregarlos sudodelante de ellos. (el botón de inicio sobre las teclas de flecha establecerá la posición al principio).

No me gusta la sudo !!idea, porque a veces agregas otro comando en el medio y ya no lo recuerdo.


1
Afortunadamente, cuando lo haga sudo !!, el shell se expandirá !!para que pueda ver qué comando está tratando de ejecutar. Por lo tanto, puede terminar siendo irritante presionar Ctrl-C y encontrar el comando correcto, pero al menos no lo tomará por sorpresa.
Reid

44
@Reid No se expandirá hasta después de presionar enter, y si está dentro de esa ventana donde no tiene que ingresar su contraseña nuevamente, se ejecutará sin confirmación. +1 a usar el historial en lugar de usar a ciegas!!
Izkata

55
@ Izkata: supongo que es verdad. Uso zsh, así que solo escribo sudo !!<TAB>y se completa automáticamente !!para mí. Bash puede expandir el historial con M-^(para mí, alt + shift + 6), pero eso es menos fluido (aunque podría volver a vincular esto). También existe shopt -s histverify, lo que hace que cuando use la expansión del historial y presione enter, en su lugar, le dará otra línea de aviso con la expansión realizada para permitirle verla / editarla.
Reid

1
Estaba pensando más en la situación en la que escribí un comando, el comando devolvió que el permiso fue denegado, y sé que quiero ejecutar exactamente el mismo comando nuevamente, pero como sudo, el proceso de presionar, inicio, escribir sudo y se siente mucho más lento para mi Es la forma en que lo he estado haciendo desde siempre y me pareció ineficiente.
Trufa

@Reid: shopt -s histverifyno ayudará un poco. La mayoría de las personas se acostumbrarán a golpear Enterdos veces. En ese momento todavía son demasiado tarde para verificar lo que sucedió.
Frank Kusters

13

Solo agregaré una alternativa: tan breve como escribir sudo !!y más flexible:

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

Es exactamente el mismo número de pulsaciones de teclas (cuento "ctrl + A" como una ...), pero agregando "flecha arriba" puede hacerlo en cualquier comando que esté en su historial.


1
Ctrl + A es de los enlaces emacs, también puede usar los enlaces vi ( set -o vi). Luego puede escapar (ir al modo de comando) y luego 'I' (mayúscula 'i', insertar al comienzo de la línea).
Gerhard Burger

1
@GerhardBurger: Lo sé, pero, extrañamente, me encanta vi (especialmente vim) para la edición de documentos de varias líneas, pero prefiero el enlace de emacs en el shell (tener que cambiar del comando al modo de edición en el shell no Realmente tiene sentido, la OMI, y los atajos de emacs son suficientes para el uso diario, incluso si son menos potentes)
Olivier Dulac

Es cierto, lo agregué solo para completar, para mí es lo mismo, sin embargo, me resulta muy conveniente buscar con '/';)
Gerhard Burger

@GerhardBurger: sobre el modo vi "/", bash regular (enlace de emacs) también tiene una forma muy útil de encontrar comandos anteriores escribiendo algunas letras y luego 'ctrl + r' hasta encontrarlo
Olivier Dulac

7

Hay algunas maneras de hacer esto.

  • Simplemente ingrese el comando nuevamente agregando sudoantes del comando

  • Presione Up arrowpara obtener el último comando y ponerlo sudodelante.

  • Entrar sudo !!

El se !!expande al último comando ingresado. Puedes hacer cosas similares con otras cosas con el historial de la línea de comandos, mira aquí


7

Esta pregunta podría haberse generalizado en " Ejecutar el mismo comando pero con alguna modificación ", ya que una de las decisiones de diseño brillantes en Unix es que lo que se implementa una vez en el shell, puede ser aprovechado por cualquier comando que se invoque desde el shell.

En otras palabras, este truco no se aplica solo a sudo:

  • Repita el comando anterior como superusuario ( sudo !!)
  • Repita el comando anterior y cronometra ( time !!)
  • Repita el comando anterior con un entorno diferente ( env A=b B=z !!)
  • Repita el comando anterior ( !!)

La expansión del historial (también conocida como sustitución del historial) es solo una función de shell para facilitar la repetición de comandos anteriores (con menos pulsaciones de teclas). Revise su página de manual de shell para history expansion. Describe muchos más trucos y atajos que puedes hacer con el historial, por ejemplo:

Puede consultar los comandos anteriores por número:

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

Puede referirse a palabras individuales en comandos anteriores:

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

También puede buscar antes de repetir:

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

Puede buscar en el historial y reemplazar algo por otra cosa:

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

Y mucho más, ya que puede combinar selección de comandos, selección de argumentos, buscar y reemplazar de forma independiente.

La página de manual de su shell (en este caso man bash) es su amigo.


1
brillante! esa debería ser la respuesta aceptada.
Eliran Malka

5

Uso zsh en lugar de bash y tengo esto en mi ~/.zshrc, por lo que presiono Alt+ Sinserta sudoal comienzo de la línea de comando:

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

Desafortunadamente, no pude encontrar una manera de hacer lo mismo en bash.


3
Puede hacer lo mismo fácilmente en Bash usando GNU Readline: agregue a su ~/.inputrc "\es":"\C-asudo "y se moverá al comienzo de una línea larga y sudo se insertará al comienzo de la línea al presionar alt-s. Reinicie el terminal o vuelva a leer ~/.inputrcpara que funcione.

2

Si desea hacerlo en un alias, debe usarlo alias redo='sudo $(history -p !!)'por alguna razón.


1
su -c "!!"

Si no tiene permiso para ser root con sudo o el programa sudo no se instaló en el sistema.


1

La forma en que lo prefiero:

  • Tecla de flecha arriba
  • Casa
  • "sudo"
  • Entrar

Pero puede ser más fácil hacer "sudo !!", depende de usted.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.