TL; DR: puede usar sudo -i
para ejecutar una función definida /root/.bashrc
(pero no un alias) y también tener acceso a las variables exportadas desde ese archivo:
argumentos del comando sudo -i
Sin embargo, los alias no funcionan allí, pero puede convertirlos fácilmente en funciones si desea que estén disponibles sudo -i
.
Siga leyendo para un análisis completo y más detalles.
Aquí hay algunos problemas, algunos sobre cómo funciona sudo y otros sobre cómo funciona bash en sí ...
De forma predeterminada, sudo
solo buscará comandos y omitirá el shell, por lo que la ejecución sudo ll
solo funcionará si hay un ll
ejecutable en uno de los directorios $PATH
. Entonces, para usar alias (o funciones) debe asegurarse de que se invoque un shell como parte del proceso.
Una forma sería ejecutar algo como sudo sh
o sudo bash
, aunque moderno sudo
(estoy probando esto en sudo 1.8.19p1) tiene opciones -s
y -i
para ese propósito.
Entonces, un intento sería algo así sudo -s ll
(lo que es equivalente a sudo bash -c 'll'
, suponiendo que su $SHELL
es Bash, que parece ser el caso basado en lo rcfile
que mencionó). Pero eso tampoco funciona, ya que inicia el shell en un modo no interactivo, modo sin inicio de sesión, que no lee ninguno de sus archivos de inicio. Es esencialmente lo mismo que si escribes un script de shell y lo usas #!/bin/bash
para ejecutarlo. Los alias (y funciones) que tienes en tu ~/.bashrc
no serán accesibles desde ese script ...
Entonces la siguiente es la -i
opción, que crea un shell de inicio de sesión. Eso es más prometedor, ya que va a leer sus archivos de inicio! Y sin embargo, sudo -i ll
(equivalente a sudo bash -l -c 'll'
) todavía no funcionará. Entonces, ¿cómo es esto posible, dado que se lee la definición del ll
alias?
Bueno, la siguiente explicación aquí es que, por defecto, bash no expandirá los alias, excepto cuando el shell es interactivo ... Este shell iniciado por sudo -i
(o bash -l
) es un shell de inicio de sesión , pero aún no es interactivo.
Entonces, el siguiente paso es obtener un shell interactivo , que luego funciona :
sudo bash -i -c 'll'
(Tener inicio de sesión e interactivo también está bien, por supuesto, bash -l -i -c ...
funcionará).
Otra alternativa es seguir usando un shell de inicio de sesión (no interactivo) pero pedirle explícitamente que expanda los alias, para que esto también funcione:
sudo bash -l -O expand_aliases -c 'll'
(El caso en el que bash era interactivo no necesitaba un shell de inicio de sesión , ya que es suficiente para leer los archivos de inicialización, pero este debe -l
leerlos).
Estas son líneas de comando bastante largas ... Y también requieren que cite todo el comando de shell, por lo que si está llamando a un alias con argumentos, tendrá que convertir todo eso en una cadena ... Entonces es una especie de torpe de usar ...
Tenga en cuenta que antes estaba hablando de alias y funciones ... Eso fue a propósito, ya que las funciones en realidad son mucho más convenientes aquí. No necesita nada especial (como tener un shell interactivo o configurar una opción específica) para ejecutar funciones en un shell, siempre que obtenga su definición.
Entonces, si definió ll
como una función en lugar de un alias, podría usarla directamente con el -i
atajo de sudo :
sudo -i ll
Y si tiene una línea de comando más larga, con argumentos, podría pasarlos directamente aquí también:
sudo -i ll -C -R /etc
(Comparar con sudo bash -i -c 'll -C -R /etc'
)
Las funciones también son mucho más flexibles y, por lo general, más fáciles de mantener ... Por lo general, es fácil convertir un alias en una función, la única advertencia es usar siempre "$@"
donde se espera que se tomen argumentos adicionales (generalmente al final del alias.)
Por ejemplo, este alias:
alias ll='ls $LS_OPTIONS -l'
Podría convertirse en esta función:
ll () {
ls $LS_OPTIONS -l "$@"
}
Son, para la mayoría de los propósitos, equivalentes. Y, como se mencionó anteriormente, la función debe ser accesible directamente desde sudo -i
, por lo que es una ventaja adicional.
¡Espero que encuentre útil esta respuesta y explicación!
/root/.bashrc
pero en realidad lo que busca la Q son los alias de este archivo, esto no es posible por esto, unix.stackexchange.com/questions/1496/… .