TL; DR: puede usar sudo -ipara 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, sudosolo buscará comandos y omitirá el shell, por lo que la ejecución sudo llsolo funcionará si hay un llejecutable 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 sho sudo bash, aunque moderno sudo(estoy probando esto en sudo 1.8.19p1) tiene opciones -sy -ipara 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 $SHELLes Bash, que parece ser el caso basado en lo rcfileque 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/bashpara ejecutarlo. Los alias (y funciones) que tienes en tu ~/.bashrcno serán accesibles desde ese script ...
Entonces la siguiente es la -iopció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 llalias?
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 -lleerlos).
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ó llcomo una función en lugar de un alias, podría usarla directamente con el -iatajo 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/.bashrcpero en realidad lo que busca la Q son los alias de este archivo, esto no es posible por esto, unix.stackexchange.com/questions/1496/… .