La respuesta tiene dos partes: !!
ysudo
!!
es parte de la funcionalidad del shell (en el caso de Ubuntu esto 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 en que el shell expande el 'marcador de posición' a un conjunto de palabras. Si bien foo*
se expandiría a una lista de todos los archivos que comienzan con 'foo', !!
se expande al contenido de la línea de comando anterior.
$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar
Al igual que otras expansiones, esto se hace completamente por el shell, por lo que si escribe !!
después de algún otro comando, este comando no es consciente de que hubo un !!
, pero solo verá la línea de comando anterior. (A diferencia de otras expansiones, la expansión del historial ocurre antes de que un comando se guarde en el historial, es decir, en lugar de !!
la línea de comando reemplazada se guardará en el historial).
El sudo
comando 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, el usuario creado durante la instalación tiene derechos de sudo. Este usuario ahora puede ejecutar cualquier comando en el shell como root, simplemente anteponiendo sudo
. Algunos programas GUI también usan 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 sudo binary ( /usr/bin/sudo
) tiene el bit setuid establecido en su permiso y pertenece a root. Cualquier ejecutable (binario) con bit setuid establecido se ejecuta con los permisos de su propietario. Esto significa que sudo se ejecuta efectivamente con permisos de root sin importar qué usuario realmente lo haya llamado. Solo las políticas de seguridad internas de sudo administran a qué usuario se le permite qué y evitan que los 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 lo ve mount /dev/sdb1 /mnt
y lo ejecuta con permisos de root.