Me he personalizado .bashrc
con varios alias, específicamente ll
yexport LS_OPTIONS='--color=auto'
Desafortunadamente, esto no funciona cuando se usa con sudo
, por lo que también modifiqué /root/.bashrc
, pero parece que esto no ha hecho ninguna diferencia.
sudo env
espectáculos HOME=/root
ySHELL=/bin/bash
¿Cómo puedo obtener sudo
comandos para usar la configuración /root/.bashrc
?
Entiendo que esto sucede solo cuando bash
se ejecuta de forma interactiva, por lo que estoy abierto a cualquier otra sugerencia sobre cómo personalizar.
/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/… .-r
opción paracrontab
:crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}
. Esto funciona cuando inicias sesión como cualquier usuario, sin embargo, cuando lo ejecutosudo crontab -r
todavía se ejecuta.Respuestas:
sudo
ejecuta un ejecutable, no un comando de shell. Entonces no sabe sobre alias. Si ejecutasudo ls
, es comosudo /bin/ls
, no utiliza ningúnls
alias que pueda tener.Puede hacer
sudo ls
que se expanda el alias al poner lo siguiente en su.bashrc
:Tenga en cuenta el espacio final, que le dice al shell que continúe la expansión de alias con la palabra que viene después
sudo
. Tenga en cuenta que expandir los alias después de sudo puede no ser siempre una buena idea, depende de qué tipo de alias tenga.Además, sudo elimina la mayoría de las variables del entorno. Esto no afectará a un alias como
alias ls='ls $LS_OPTIONS'
, porque esa es una variable de shell utilizada por el shell mientras expande el comando (y exportarlo no.bashrc
sirve para nada). Pero afectaría a las variables que utiliza el comando, comoLS_COLORS
. Puede configurar sudo para mantener ciertas variables de entorno editando su configuración: ejecutevisudo
y agregue la líneaCon esta configuración,
sudo ll
le dará los colores a los que está acostumbrado.Alternativamente, puede ejecutar un shell raíz con
sudo -s
. Este shell cargará su archivo de configuración (~/.bashrc
para bash). Dependiendo de cómo esté configurado sudo, esto puede mantenerseHOME
configurado en su directorio de inicio, o cambiarlo a/root
. Puede forzar que el directorio de inicio se configure en raíz consudo -Hs
; por el contrario, para mantener el directorio de inicio original, ejecutesudo env HOME="$HOME" bash
.fuente
Gracias a los que respondieron, que me impulsaron a leer
man sudo
más detenidamente.sudo -s
Si no se especifica ningún comando, se ejecuta un shell interactivo.Este shell interactivo utiliza
/root/.bashrc
y, por lo tanto, incluye mis personalizaciones.Requiere que el comando se ingrese por separado, pero esto está bien.
fuente
Antecedentes
Siempre he sentido que esta pregunta es un problema XY . El título implica que quieren algo,
/root/.bashrc
pero en realidad lo que busca son los alias de este archivo (se cree que esto no es posible por esto). ¿Por qué mi script Bash no reconoce los alias? .Básicamente, es por diseño que sus alias no se detectarán en
sudo
y en otros lugares porque no son portátiles, y esta es mi opinión sobre ellos también.Cualquier cosa que esté en el entorno del usuario no debe ser asumida por los scripts y cualquier software que pueda ejecutarse en un cuadro determinado. Pero me doy cuenta de que hay escenarios en los que puede haber algunos alias en una cuenta de usuario determinada
$HOME/.bashrc
que otros quieran aprovechar en escenarios interactivos.Con ese fin, simplemente puede decirle al intérprete de Bash que expanda los alias que encuentre durante el proceso de inicio de sesión fuera de los comportamientos normales de shell que se encuentran al usar
sudo
.Ejemplo
Preparar
Para configurar las cosas, he agregado los siguientes alias, variables de entorno y funciones a mis usuarios
/root/.bashrc
y/root/.bash_profile
archivos raíz .Sin hacer nada de ninguno de estos trabajos (sin sorpresas):
Vemos que el
alias
comando no muestra alias cuando se ejecuta ensudo
:Este comportamiento es su sugerencia de que no debe esperar que los alias sean accesibles. Pero seguimos ...
Paso # 1 - alias visibles
Si corremos
bash -ci
, podemos inducir a Bash a leer al menos nuestro$HOME/.bashrc
:Genial, ¿entonces tal vez podamos ejecutarlo?
Paso 2 -
shopt -s expand_aliases
No Una vez más, esto es por diseño, estamos haciendo algo que no se supone que debemos hacer, por lo que hay una serie de "seguridad" que tenemos que desactivar. la otra "seguridad" es Bash.
Aquí podemos ver nuestro mensaje
/root/.bashrc
, hemos ejecutado con éxito el alias del usuario raízbrc_smurf
.Paso # 3: ¿qué pasa con las env env?
Si está utilizando el método que se muestra arriba, estos también deberían funcionar.
Paso 4: ¿qué pasa con las funciones?
Estos también funcionan como se esperaba:
TLDR;
Puede hacer esto para obtener acceso a variables de entorno + alias de
/root/.bashrc
:Llevar lejos
Este método habilita el contenido de
/root/.bashrc
, no recoge el contenido de/root/.bash_profile
.Referencias
fuente
.bashrc
con sudo; específicamente eliminar la-r
opción decrontab
?sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'
lugar de un simplesudo echo $brc_smurf_env
?alias
, que era simplemente para mostrarles, que había necesidad de hacerlosudo bash -ci 'shopt -s expand_aliases; <cmds>'
Hay un montón de configuraciones en el archivo / etc / sudoers específicamente o configurar un entorno para cuando se ejecutan los comandos sudo (por ejemplo, asegurarse de que la RUTA solo tenga ubicaciones de confianza), pero dependiendo de lo que espera obtener de esto es posible que no pueda hacer lo que busca si se trata de ejecutar comandos reales en un shell para configurar el entorno. Sudoing específicamente no le da un shell de inicio de sesión raíz, por lo que no configurará un perfil regular para usted.
fuente
Digamos que editamos /root/.bashrc para que sea:
Permite cerrar sesión y volver a iniciar sesión para que bash lea el archivo:
Como puede ver, se leyó el archivo, se cambió la RUTA y se establecieron los alias. Todo es funcional como lo solicite.
Sin embargo, sudo todavía no funcionará como esperabas.
RUTA no ha cambiado. Puede haber formas de cambiar el camino en sudoers, pero le recomiendo encarecidamente que evite hacerlo. Y, de todos modos, los alias, las funciones y algunos otros cambios aún no se aplicarán cambiando solo la RUTA. Un archivo debe ser de origen. Hacer eso para cada script o comando le pedirá a la computadora que realice más trabajo sin ningún beneficio real. Los guiones no usan alias (no hay un uso práctico para ellos dentro de los guiones).
Entonces, solo inicie sesión, el
.bashrc
archivo se cargará automáticamente y comenzará a funcionar.Puedes comenzar bash así:
Pero como puede ver arriba, el pwd (el directorio de trabajo) no ha cambiado y, si inspecciona un poco más, algunas otras configuraciones tampoco han cambiado. Es por eso que el comando correcto es usar:
Si ese comando es demasiado largo para escribir, cree un alias o una función en el usuario (no root) donde se usará ese comando, algo como:
fuente
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: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ónsudo ll
solo funcionará si hay unll
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
osudo bash
, aunque modernosudo
(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 asudo bash -c 'll'
, suponiendo que su$SHELL
es Bash, que parece ser el caso basado en lorcfile
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 asudo bash -l -c 'll'
) todavía no funcionará. Entonces, ¿cómo es esto posible, dado que se lee la definición delll
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
(obash -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 :
(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:
(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 :Y si tiene una línea de comando más larga, con argumentos, podría pasarlos directamente aquí también:
(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:
Podría convertirse en esta función:
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!
fuente
sudo -i command arguments
de ser capaz de ejecutar funciones de/root/.bashrc
y tienen variables exportadas disponible. Pero veo cómo mi respuesta fue quizás demasiado larga y esa información estaba algo oculta allí ... Así que agregué un TL; DR para resumirlo (sin dejar de mantener los detalles técnicos de la investigación). Por favor, eche otro vistazo.