
Estoy ejecutando RHEL6 (kernel 2.6.32-573.el6.x86_64). Tengo alias que se obtienen al ssh
ingresar a myserver
. Uno de estos es
alias scl-devtoolset-3='source /usr/local/bin/scls/devtoolset-3'
Presumiblemente tiene un alias en shells sin inicio de sesión (ver más abajo), pero ssh
ing proporciona un shell de inicio de sesión, y esto se confirma con la línea
shopt -q login_shell && echo 'This is a login shell' || echo 'This is a non-login shell'
en mi ~/.bashrc
, que produce
This is a login shell
como se esperaba. Por lo tanto, no tengo idea de por qué/dónde está establecido el alias.
¿Cómo racionalizar esta circunstancia aparentemente contradictoria?
Archivos presentes en mi sistema:
/etc/profile
/etc/bashrc
/etc/profile.d/*
~/.bashrc
Archivos no presentes en mi sistema:
/etc/bash.bashrc
~/.profile
TL;DR
El alias parece estar establecido (solo en shells sin inicio de sesión) mediante las siguientes líneas en /etc/bashrc
:
...
if ! shopt -q login_shell ; then # We're not a login shell
...
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
...
fi
qué archivo fuente /etc/profile.d/scl-aliases.sh
contiene
#!/bin/bash
sources_dir=/usr/local/bin/scls
for scl in `ls $sources_dir`; do
alias scl-$scl="source $sources_dir/$scl"
done
y dado que
$ ls /usr/local/bin/scls
devtoolset-3 devtoolset-4 devtoolset-6 python27 python33
Esto se confirmó (¿parcialmente?) ejecutando bash -x
en el símbolo del sistema después de ssh
ing.
Respuesta1
En realidad, este es un comportamiento normal. Todo se reduce a los diferentes archivos obtenidos por scripts de inicio de sesión y sin inicio de sesión. Esto ha sidocubierto extensamente en otros lugarespero, brevemente, los shells bash (interactivos) sin inicio de sesión obtienen la familia de archivos bashrc ( /etc/bash.bashrc
, ~/.bashrc
) y los shells de inicio de sesión (interactivos) obtienen los diversos archivos de perfil ( /etc/profile
, ~/.profile
).
Entonces, tu /etc/bashrc
(que creo que es el equivalente /etc/bash.bashrc
en macOS y tal vez en otros sistemas) solo se lee mediante shells interactivos sin inicio de sesión ydemonios de shell remotos. Cuando se lee ese archivo, si el shell que lo lee es un shell sin inicio de sesión (por lo tanto, no es un demonio de shell remoto), también incluye archivos específicos en /etc/profile.d
.
Sin embargo, los shells de inicio de sesión no leen este archivo, por lo que no es relevante aquí. En cambio, leerán /etc/profile
y, si revisas ese archivo, encontrarás algo como esto (del /etc/profile
archivo en mi Arch):
# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
for profile in /etc/profile.d/*.sh; do
test -r "$profile" && . "$profile"
done
unset profile
fi
Es por eso que los ves en un shell de inicio de sesión. Esto se debe a que los shells de inicio de sesión no funcionan bashrc
y, en cambio, tienen sus propios archivos de configuración y estos incluyen los archivos que se encuentran debajo, /etc/profile.d
pero sin excluir los shells de inicio de sesión.
Respuesta2
Estoy publicando esto como respuesta, dado que los comentarios no pueden tener código con sangría. Felicitaciones ala respuesta de terdon.
Como lo indicó terdon, mi /etc/profile
tiene las siguientes líneas.
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
Estos serían los responsables del alias, no /etc/bashrc
. Esto podría verificarse fácilmente con una solución paraSecuencia de seguimiento de scripts/comandos ejecutados en ssh