sudo: fuente: comando no encontrado

54

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.

HorusKol
fuente
¿Cómo trataste de usar las variables de sudo? Tenga en cuenta que si usa "sudo command $ variable", reemplazará la variable de su shell, no del entorno de sudo.
João Pinto

Respuestas:

72

El problema es que sourcees un comando de bash incorporado (no un programa como lso grep). Creo que un enfoque es iniciar sesión como root y luego ejecutar el comando de origen.

sudo -s
source /etc/bash.bashrc
Marcos Roriz Junior
fuente
3
Tienes razón en que el problema es que sourcees una cáscara incorporada. sudo sues una forma extraña de decirlo, mejor decir sudo -scuá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.
Poolie
1
Derecha. Además, BASH lee / etc / bashrc al iniciar sesión. Por lo tanto, también puede usar 'su' con -, -l o --login switch para obtener el entorno de ese usuario: 'sudo su -' para convertirse en root o 'su - $ username' para convertirse en otro usuario.
El ejemplo de "una línea" no funcionará porque suinicia 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.
loevborg
sudo -sno es mejor que sudo su. No tendrá ningún efecto de ninguna manera.
loevborg
1
sudo -stiene 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.
Poolie
14

El problema no es que sourcesea ​​un comando integrado de shell. El hecho de que sea así es lo que realmente le arroja el command not founderror, 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 bashdentro de una instancia de bash) y mirar la salida de envdebería dar resultados similares a los de su padre.

Sin embargo, debido a cómo sudofunciona (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 como sudo nautilusdebería abrir una carpeta en la /rootcarpeta, y no /home/yourusername.

Entonces:

Haciendo algo así sudo source script.shy luego sudo command, incluso si funcionara, no sería exitoso establecer ninguna variable para más adelante sudo command.

Para pasar variables de entorno, puede decirle a sudo que conserve el entorno (a través del -Econmutador y que tenga los permisos adecuados en su archivo sudoers) y / o configurarlo para el comando como sudo VAR1=VALUE1 VAR2=VALUE2 command.

ssice
fuente
4

Usando la sustitución del proceso bash puedes hacer:

source <(sudo cat /etc/bash.bashrc)
TomDotTom
fuente
1
¿Cómo ayudaría esto a iniciar un shell raíz con la nueva configuración, que es lo que OP está buscando hacer?
muru
1
El OP en realidad estaba preguntando cómo "... volver a cargar el nuevo perfil ..." desde un shell que necesita usar sudopara acceder al perfil. Lo anterior proporciona un medio para importar el perfil evitando el sudo: source: command not foundproblema mencionado.
TomDotTom
"Lo único es que las nuevas variables de entorno solo estaban disponibles para mi usuario actual y se ignoraron cuando usé sudo".
muru
3

Como dice Marcos , su principal problema aquí es que sourcees 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.bashrccuando se inicie. Eso es tan simple como decir

sudo bash
billar
fuente
2

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.

psusi
fuente
2

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í

$ which bettercap-ng
/home/user/work/bin/bettercap`

Verifiqué si esta ubicación es parte de la RUTA de mi usuario raíz.

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

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.

sudo -E env "PATH=$PATH" [command] [arguments]

De hecho, uno puede hacer un alias:

alias mysudo='sudo -E env "PATH=$PATH"'

También es posible nombrar el alias en sí mismo sudo, reemplazando el sudo original.

Ornitorrinco anónimo
fuente