He estado actualizando algunos de los perfiles predeterminados para bash, y vi en los tutoriales que seguía que podía volver a cargar el nuevo perfil con la nueva configuración del entorno usando:
source /etc/bash.bashrc
Lo único es que las nuevas variables de entorno solo estaban disponibles para mi usuario actual y se ignoraron cuando usé sudo. Solo estuvieron disponibles para sudo cuando cerré mi sesión de terminal y me reincorporé.
Cuando trato de usar:
sudo source /etc/bash.bashrc
Me sale el error:
sudo: source: command not found
¿Hay una manera simple de cargar en la nueva configuración de perfil de bash para sudo sin tener que cerrar la terminal y reiniciar?
- Inicialmente, estaba usando algunos scripts de instalación que hacían referencia a las variables. Descubrí que, si bien podían acceder a las variables cuando llamaba a los scripts directamente (aunque esto causaría un problema posterior con la creación de directorios, ya que necesitaba ser root), llamar a los scripts de instalación usando sudo no lo haría.
Lo probé probando con estos simples comandos:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
El primero generaría el valor de la variable, pero el segundo no generaría nada.
fuente
Respuestas:
El problema es que
source
es un comando de bash incorporado (no un programa comols
ogrep
). Creo que un enfoque es iniciar sesión como root y luego ejecutar el comando de origen.fuente
source
es una cáscara incorporada.sudo su
es una forma extraña de decirlo, mejor decirsudo -s
cuál es la forma en que sudo dice "iniciar un shell como este usuario". Su versión de una línea no funcionará porque cada uno de los comandos en él es ejecutado por el shell del usuario principal en un subproceso separado.su
inicia un nuevo shell y la "fuente" se ejecuta solo después de que finaliza. El primer ejemplo solo funciona si la segunda línea se usa dentro del shell raíz.sudo -s
no es mejor quesudo su
. No tendrá ningún efecto de ninguna manera.sudo -s
tiene un efecto similar al iniciar un shell, pero para mí parece poco elegante apilar dos comandos de "convertirse en otro usuario" cuando uno lo haría.El problema no es que
source
sea un comando integrado de shell. El hecho de que sea así es lo que realmente le arroja elcommand not found
error, pero no significa que funcionaría si lo fuera.El problema real es cómo funcionan las variables de entorno. Y funcionan así: cada vez que se inicia un nuevo proceso, si no sucede nada, hereda el entorno de su padre. Debido a esto, usar una subshell (por ejemplo, escribir
bash
dentro de una instancia de bash) y mirar la salida deenv
debería dar resultados similares a los de su padre.Sin embargo, debido a cómo
sudo
funciona (como se indica en su página de manual), sudo intenta eliminar el entorno del usuario y crear un entorno "predeterminado" para el usuario suplantador, de modo que la ejecución del comando se ejecute como si el usuario que lo invocara tuviera sido el usuario llamante (que es el comportamiento esperado) y, por lo tanto, ejecuta nautilus comosudo nautilus
debería abrir una carpeta en la/root
carpeta, y no/home/yourusername
.Entonces:
Haciendo algo así
sudo source script.sh
y luegosudo command
, incluso si funcionara, no sería exitoso establecer ninguna variable para más adelantesudo command
.Para pasar variables de entorno, puede decirle a sudo que conserve el entorno (a través del
-E
conmutador y que tenga los permisos adecuados en su archivo sudoers) y / o configurarlo para el comando comosudo VAR1=VALUE1 VAR2=VALUE2 command
.fuente
Usando la sustitución del proceso bash puedes hacer:
fuente
sudo
para acceder al perfil. Lo anterior proporciona un medio para importar el perfil evitando elsudo: source: command not found
problema mencionado.Como dice Marcos , su principal problema aquí es que
source
es un comando integrado de shell que afecta solo al proceso de shell en el que se ejecuta.La solución fácil es simplemente iniciar un nuevo shell como root, y bash leerá automáticamente
/etc/bash.bashrc
cuando se inicie. Eso es tan simple como decirfuente
Cerrar y volver a abrir la terminal no debería cambiar las cosas. Por defecto, sudo elimina el entorno. Para deshabilitar eso, agregue -E a sudo.
fuente
El error ocurre porque el binario al que está intentando llamar desde la línea de comandos es solo una parte de la variable PATH del usuario actual, pero no una parte de la PATH del usuario root.
Puede verificar esto localizando la ruta del binario al que está intentando acceder. En mi caso, estaba tratando de llamar "bettercap-ng". Entonces corrí
Verifiqué si esta ubicación es parte de la RUTA de mi usuario raíz.
Entonces sudo no puede encontrar el binario que estoy tratando de llamar desde la línea de comandos. Por lo tanto, devuelve el comando de error no encontrado.
Puede indicarle a sudo que use la RUTA del usuario actual cuando llame a un binario como se muestra a continuación.
De hecho, uno puede hacer un alias:
También es posible nombrar el alias en sí mismo sudo, reemplazando el sudo original.
fuente