
Contexto
Estás trabajando en Ubuntu LTS 14.04. Ha iniciado sesión como usuario root. Ejecute el siguiente comando:
exec su simple_user -c "/bin/bash /etc/init.d/simple_user_service"
Para que "simple_user_service" se inicie con privilegios de "simple_user" y no con privilegios de root.
Pregunta
Parece que "exec su simple_user -c" no genera .bashrc ni .profile ni ningún otro archivo de origen normal para el nuevo terminal de shell interactivo. Lo confirmé agregando esta línea en el archivo simple_user .bashrc:
export TEST="Hello"
Luego, en mi script de inicio "simple_user_service":
#!/bin/bash
### BEGIN INIT INFO
# Provides: test_script
# X-Interactive: true
# Short-Description: Test script
### END INIT INFO
echo $TEST
Cuando ejecuto el script no se imprime nada, pero si ejecuto los siguientes comandos:
su simple_user
echo $TEST
> Hello
La variable TEST está configurada e impresa correctamente.
Entonces me preguntaba: ¿el comando "exec su simple_user -c" genera algún archivo de perfil/bashrc de usuario simple? Si es así, ¿hay alguna manera de saber cuáles?
¡Muchas gracias por tu ayuda!
[Editar - 2 horas después]
Gracias a la respuesta que recibí, entendí con mayor precisión las instrucciones de 'man bash'. Encontré esto:
When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and
uses the expanded value as the name of a file to read and execute. Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file name.
Es realmente interesante ya que puedes configurar BASH_ENV en un archivo que ejecuta comandos específicos cada vez que usas "su simple_user -c" sin necesidad de cargar la lógica interactiva completa.
Entonces, antes de ejecutar su simple_user -c
, simplemente puedes hacer:
export BASH_ENV=~/.bash_script
Y configure cosas en su archivo simple_user .bash_script, como:
export TEST="Hello"
Luego, cuando ejecuto el script "simple_user_service", "Hola" se imprime correctamente.
Fue realmente útil para mí ya que lo necesitaba para cargar todo el entorno "rvm" (ruby) para ejecutar un script específico.
¿Quiere saber más?
¿Por qué todo este problema?
Porque instalé Ruby God:http://godrb.com/para monitorear este script específico (un trabajo retrasado).
Y estoy usando "rvm" para gestionar diferentes rubíes.
Y el script elimina automáticamente los privilegios si es necesario ejecutandoexec su application_user -c "/bin/bash application_script"
Como dios necesita ejecutarse con privilegios de root y rvm solo se carga en archivos .bashrc/.profile, necesitaba una forma de cargar correctamente el entorno rvm en mi script. Simplemente podría agregar el comando rvm load en el script, pero entonces mi script habría dependido del entorno y eso no era aceptable.
Entonces agregué esto en mi script antes de que se eliminen los privilegios:
if [ -e "config/BASH_ENV" ]; then
export BASH_ENV=$(cat config/BASH_ENV)
fi
Gracias a eso puedo cargar rvm en el archivo que configuré en el archivo config/BASH_ENV. Por ejemplo podría ser:
# In config/BASH_ENV file of your rails app:
export BASH_ENV="~/.bash_script"
# In /home/simple_user/.bash_script
[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function
Entonces, mi guión y Dios funcionan como se esperaba.
No expliqué todas esas cosas antes de obtener respuestas para que los lectores pudieran concentrarse en la pregunta real.
Pero como obtuve una buena respuesta y encontré una buena solución gracias a eso, escribí esta edición para que pueda ser útil para otros.
¡Gracias de nuevo!
Respuesta1
Cuando tu lo hagas:
su some_user -c 'some_command'
Se some_command
ejecutará como:
bash -c 'some_command'
Suponiendo bash
que some_user
el shell esté definido en /etc/passwd
.
Ahora, cuando lo haces, bash -c 'some_command'
básicamente estás generando unno interactivo(y por supuestosin iniciar sesión) sesión de bash
. Como el shell no obtiene ningún archivo mientras está en modo no interactivo, no se espera que se lea ningún archivo.
Tenga en cuenta que ~/.profile
se obtiene en una sesión interactiva de inicio de sesión de bash
y ~/.bashrc
se obtiene en una sesión interactiva sin inicio de sesión de bash
. También tenga en cuenta que Ubuntu obtiene fuentes ~/.bashrc
de ~/.profile
.
Consulta la INVOCATION
sección de man bash
para tener más ideas.