
Hola y gracias de antemano por cualquier ayuda que alguien pueda ofrecerme.
He estado tratando de mejorar mi comprensión del proceso de inicio de sesión del shell y parece ser una madriguera interminable con sus reglas sobre qué comenzar y cuándo. Actualmente, estoy tratando de comprender qué variables vería un shell no interactivo y sin inicio de sesión en un entorno mínimo. (Estoy usando la distribución Centos 7 por cierto)
Ejecuto el siguiente script y puedo verificar que mi script se esté ejecutando en un shell no interactivo y sin inicio de sesión con la salida $- & shopt... así como las variables definidas desde la salida del comando printenv.
#!/bin/bash
#BASH_ENV=/home/kmg/environment
echo $-
shopt | grep login_shell
printenv
# echo $TEST1
Este es el resultado de mi script.
hB
login_shell off
XDG_SESSION_ID=407
HOSTNAME=centos7lab
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
USER=kmg
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/kmg/.local/bin:/home/kmg/bin
MAIL=/var/spool/mail/kmg
PWD=/home/kmg
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
HOME=/home/kmg
SHLVL=2
TEST_ENV=this is a test of the /etc/environment file
LOGNAME=kmg
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/1000
_=/bin/printenv
No estoy seguro de qué esperar... Pero estoy obteniendo más resultados del comando printenv de lo que esperaría. Estoy particularmente confundido por la variable donde aparece definida en el archivo /etc/environment (habría esperado que se definiera primero porque PAM la lee) y el hecho de que las variables TERM, LESSOPEN y LS_COLORS están definidas.
Intenté leer sobre el tema pero no parece que sea el tema mejor documentado. De la publicación que he leído, parece que las personas están usando terminología incorrecta o contradictoria para describir lo que están tratando de decir... Y una publicación dirá una cosa mientras que otra publicación diferente dirá otra. Y en cierto modo me ha jodido y confundido.
¡Estaría extremadamente agradecido con cualquiera que estuviera dispuesto a dedicar un poco de tiempo para ayudarme a aclarar este tema en mi cabeza!
Una vez más... gracias de antemano a cualquiera que se haya tomado el tiempo de leer esto.
Respuesta1
Las variables de entorno exportadas se heredan del proceso principal al secundario. Entonces, a menos que haya ejecutado su script en un contexto que realmente elimine las variables de entorno (como via sudo
, con la opción env_reset vigente), probablemente obtendrá algunas variables del proceso principal.
La lista de variables de entorno básicas de Sudo se documenta a sudoers(5)
continuación:
De forma predeterminada, la opción env_reset está habilitada. Esto hace que los comandos se ejecuten con un entorno nuevo y mínimo. En AIX (y sistemas Linux sin PAM), el entorno se inicializa con el contenido del archivo /etc/environment. El nuevo entorno contiene las variables TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME y SUDO_* además de las variables del proceso de invocación permitidas por las opciones env_check y env_keep. Esta es efectivamente una lista blanca para variables de entorno.
Por cierto, a través del sistema de archivos /proc, puedes echar un vistazo al entorno de cualquier proceso de tu propiedad o, si eres root, de cualquier proceso del sistema.
Por ejemplo, si desea saber qué variables tiene el proceso de inicio (proceso n.° 1), puede convertirse en root y hacer esto:
# strings /proc/1/environ
selinux=0
SHLVL=1
HOME=/
init=/sbin/init
TERM=linux
drop_caps=
BOOT_IMAGE=/vmlinuz-4.9.61-atom
PATH=/sbin:/usr/sbin:/bin:/usr/bin
crashkernel=384M-:128M
PWD=/
rootmnt=/root
(Este ejemplo fue de un sistema Debian 9 con un kernel personalizado).
Entonces, hay algunos fundamentos, probablemente proporcionados por initramfs o por el propio kernel, como SHLVL, HOME, TERM, PATH y PWD. También hay algunas variables relacionadas con el proceso de arranque y las diversas funciones de seguridad opcionales.