¿Qué significa '!!' significa en 'sudo !!'?

64

Soy un usuario de Ubuntu con poca experiencia y he estado usando sudo .

¿Qué hace sudo !! y cómo?

    
pregunta RamHS 18.11.2013 - 11:24

7 respuestas

74

!! en bash es un alias para el comando anterior (consulte Designadores de eventos ). Por lo tanto, vuelve a ejecutar el comando anterior con sudo de permisos.

    
respondido por el chronitis 18.11.2013 - 11:28
64

sudo bang bang es un comando muy útil cuando se trabaja en la interfaz de línea de comandos.

Algunas distribuciones de Linux te hacen iniciar sesión como usuario en lugar de administrador.

Entonces, para hacer algo como administrador, debes continuar con el comando con sudo (Superusuario DO), que le dice al sistema "harás esto, porque yo lo dije". ¡¡El !! / bang-bang (! = bang) es básicamente un atajo que puede usar para repetir el comando anterior.

Por lo tanto, el escenario típico es que pruebes un comando, y se descarta un mensaje que indica que tienes que ser un administrador para hacerlo. Entonces, puede escribir sudo para ejecutar ese comando como superusuario / administrador, o puede escribir sudo !! donde !! le dice al sistema que use el comando anterior que se intentó. UfH

Hay muchos otros comandos bang. Para obtener una lista de ellos y explicaciones de lo que son, consulte Linux Bang Commands , consulte también Historial de Bash y comandos de explosión

    
respondido por el Mitch 18.11.2013 - 11:31
38

El comando bang bang (!!) es un atajo para repetir y ejecutar el comando anterior que ingresaste en tu terminal. Este comando es muy útil cuando olvida que necesita derechos de administrador para realizar una determinada acción, y le permite repetirlo con derechos de superusuario simplemente escribiendo,

sudo !!

!! toma el último comando de ejecución.

Por ejemplo:

apt-get update

La salida será,

  

E: no se pudo abrir el archivo de bloqueo / var / lib / apt / lists / lock - abierto (13: permiso denegado)
  E: No se puede bloquear el directorio / var / lib / apt / lists /
  E: No se pudo abrir el archivo de bloqueo / var / lib / dpkg / lock - abierto (13: permiso denegado)
  E: No se puede bloquear el directorio de administración (/ var / lib / dpkg /), ¿eres root?

Después de eso, si ejecutamos el comando sudo !! , la salida será

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]

Lo que significa que la parte !! toma el comando de ejecución anterior apt-get update y la parte anterior sudo hace que el comando se ejecute con derechos de superusuario.

Y cómo el sudo !! ejecuta el comando anterior con privilegios de superusuario, normalmente todos los comandos que ingresamos en el terminal se almacenan en el command history . Ejecute el comando history en el terminal, muestra todos los comandos que ingresó. La parte !! en sudo !! toma el último comando almacenado en el historial de comandos y todo sudo !! ejecuta el último comando con privilegios de administrador.

Algunos otros comandos bang se explican en este publicación del blog .

    
respondido por el Avinash Raj 18.11.2013 - 12:05
13

La respuesta tiene dos partes: !! y sudo

!! es parte de la funcionalidad del shell (en el caso de Ubuntu, probablemente sea bash, pero otros shells como zsh o csh también lo admiten) llamado "expansión de historial". Se comporta de manera similar a otras expansiones, ya que el shell expande el 'marcador de posición' a un conjunto de palabras. Mientras foo* se expandiría a una lista de todos los archivos que comienzan con 'foo', !! se expandirá al contenido de la línea de comando anterior.

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

Al igual que otras expansiones, esto se realiza en su totalidad por el shell, por lo que si escribe !! después de algún otro comando, este comando no es consciente de que hubo !! , pero solo verá la línea de comandos anterior. (A diferencia de otras expansiones, la expansión del historial ocurre antes de que se guarde un comando en el historial, es decir, en lugar de !! , la línea de comando reemplazada se guardará en el historial).

El comando sudo permite ejecutar comandos como otro usuario, siempre que los permisos sean otorgados por la política de seguridad (el valor predeterminado está configurado en /etc/sudoers ).

Por defecto, la contraseña de root permanece sin configurar en Ubuntu. Para realizar tareas de administración del sistema, al usuario creado durante la instalación se le otorgan derechos de sudo. Este usuario ahora puede ejecutar cualquier comando en el shell como root, solo al anteponer sudo . Algunos programas GUI también utilizan el mecanismo sudo, por ejemplo, la gestión de paquetes.

La razón por la que sudo puede ejecutar otros comandos como root (u otro usuario) es que el binario sudo ( /usr/bin/sudo ) tiene el bit setuid establecido en su permiso y pertenece a root. Cualquier ejecutable (binario) con el conjunto setuid bit se ejecuta con los permisos de su propietario. Esto significa que sudo se ejecuta efectivamente con permisos de raíz, sin importar qué usuario lo haya llamado. Solo las políticas de seguridad internas de sudo gestionan qué usuario tiene permiso y evita que usuarios arbitrarios hagan cosas arbitrarias.

Entonces, en el caso de sudo !! esto significa

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

es básicamente idéntico a

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

solo menos escribiendo En ambos casos, sudo solo ve mount /dev/sdb1 /mnt y lo ejecuta con permisos de root.

    
respondido por el Adaephon 21.11.2013 - 00:28
5

!! es la expresión sintácticamente más simple y probablemente más común para expansión de la historia .

Como habrás notado, después de sustituir el último comando ejecutado por !! , bash hace dos cosas (en su configuración predeterminada):

  1. Se muestra el comando completo con el texto sustituido.

    Por ejemplo, si su comando fue lshw -c video y ejecuta sudo !! a continuación, entonces el comando después de la expansión del historial es sudo lshw -c video .

  2. Se ejecuta ese comando.

Normalmente, estos dos pasos ocurren sin interrupción y sin oportunidad para la interacción del usuario, ya que shopt histverify no está establecido de manera predeterminada ( shopt -u histverify ).

Sin embargo, si habilitas shopt histverify ( shopt -s histverify ), entonces la expansión del historial funciona de manera diferente:

  1. Obtienes un nuevo mensaje primario, con el texto expandido ingresado automáticamente en él. Es como si usted mismo hubiera escrito ese texto, con el cursor al final, pero aún no haya ejecutado el comando.
  2. Usted, el usuario, debe presionar Ingresar para ejecutar el comando. O puede editar el comando, cancelarlo ( Ctrl + C ), etc. Tenga en cuenta que esto no es un indicador especial, sino un indicador primario habitual. Realmente es como si usted mismo escribiera el texto.

(Tenga en cuenta que la opción de shell histverify shell surte efecto solo si la biblioteca readline se está utilizando, pero cuando se usa bash de forma interactiva en un Ubuntu u otro sistema GNU / Linux, este es esencialmente el caso.)

Si la opción histverify shell está o no habilitada , la expansión del historial es diferente a muchas otras expansiones de shell. Otras expansiones de shell no muestran el comando expandido antes de ejecutarse. A diferencia de otras expansiones, que están destinadas a ser usadas tanto de forma interactiva como no interactiva (por ejemplo, en un script de shell), la expansión del historial casi siempre se usa de manera interactiva.

    
respondido por el Eliah Kagan 23.04.2015 - 19:47
3

! Se utiliza en Linux para accesos directos relacionados con la historia. Asi que, !! simplemente ejecutará el comando anterior que ejecutó.

Es muy útil en los casos en que olvidaste poner el sudo antes de un comando que lo requiera o que obtengas un permiso denegado o algo por el estilo simplemente

sudo !!
y listo.     
respondido por el tapananand 21.11.2013 - 20:09
0

!! repetirá y ejecutará el comando anterior, y con sudo le dará al comando el privilegio de raíz.   (¿No está en la página de manual? !! No puedo verlo allí.)

    
respondido por el Farimah 18.11.2013 - 20:49

Lea otras preguntas en las etiquetas