Header Ads

Ejecutar alias con privilegios


Para crear un alias simplemente editamos nuestro bashrc (sin privilegios sudo):
nano ~/.bashrc
Y agregamos el alias al final del archivo. Ejemplo creando un alias para actualizar Ubuntu:
alias upgrade='sudo apt-get update && sudo apt-get dist-upgrade && sudo aptitude -y safe-upgrade && sudo fc-cache && sudo sync && sudo updatedb'
Y cargamos el alias con:
source ~/.bashrc
Y listo. A partir de ahora, en lugar de ejecutar esa cantidad de comandos, podemos abrir la consola y escribir "upgrade" y se ejecutarán todos en secuencia. Y hasta aquí debería llegar este post.
Pero, qué pasaría si queremos automatizar este proceso con un bash script y de paso incluirle más cosas, como instalación de programas, etc. Bueno, en este caso se complica un poco, puesto que los alias no se expanden en un contexto no interactivo (como un script) y bashrc tiene unas líneas que impiden esto:
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Entonces, la solución, como bien nos explican en linuxhandbook, podría ser crear un alias temporal (hay una explicación más larga de cómo funcionan los alias, y su diseño que pueden consultarla AQUÍ).
Pero el post solo explica cómo ejecutarlo en el terminal, no en un bash script, por tanto, hay que hacer algunos cambios.
Workaround
Primero hay que habilitar la expansión de alias en shells no interactivos, para evadir la restricción de bashrc, preferentemente después del shebang, y después de ejecutar el alias temporal, desactivamos la expansión y, si queremos, lo agregamos a nuestro bashrc para que esté disponible después del reinicio del PC, quedando así:
Asumiendo que ya tenemos nuestro script con los permisos:
sudo touch myscript.sh
sudo chmod +x myscript.sh
Le agregamos el siguiente contenido:
#!/bin/bash
  
# enabling alias expansion in non-interactive shells / habilitando la expansión de alias en shells no interactivos
shopt -s expand_aliases

# create temporary aliases (no sudo) / creando alias temporal (sin sudo)
alias myupgrade='apt-get update && apt-get dist-upgrade && aptitude -y safe-upgrade && fc-cache && sync && updatedb'

# creating temporary sudo aliases / creando alias temporal de sudo
alias sudo='sudo '

# run temporary aliases / ejecutando alias temporal
myupgrade

# disabling alias expansion in non-interactive shells (optional) / deshabilitando la expansión de alias en shells no interactivos (opcional)
shopt -u expand_aliases

# local user with sudo privileges / usuario local con privilegios sudo
local_user=${SUDO_USER:-$(whoami)}

# create permanent aliases (with sudo - Change will be permanent after reboot) / creando alias permamente (con sudo - El cambio será permanente después de reiniciar)
sudo -u $local_user bash -c "echo alias myupgrade=\"'sudo apt-get update && sudo apt-get dist-upgrade && sudo aptitude -y safe-upgrade && sudo fc-cache && sudo sync && sudo updatedb'\"" >> /home/$local_user/.bashrc

# rest of script / resto del script
apt -y install etc etc etc
Y solo resta ejecutar el script:
sudo ./myscript.sh
Y es todo. Ya puede ejecutar su alias en el terminal con su script y también dejarlo permanente en bashrc.

Fuentes consultadas: askubuntulinuxhandbook, 6.6 Aliases GNU
Con la tecnología de Blogger.