Aparentemente se contradice el inicio de sesión versus el shell sin inicio de sesión en ssh

Aparentemente se contradice el inicio de sesión versus el shell sin inicio de sesión en ssh

Estoy ejecutando RHEL6 (kernel 2.6.32-573.el6.x86_64). Tengo alias que se obtienen al sshingresar 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 sshing 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.shcontiene

#!/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 -xen el símbolo del sistema después de sshing.

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.bashrcen 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/profiley, si revisas ese archivo, encontrarás algo como esto (del /etc/profilearchivo 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 bashrcy, en cambio, tienen sus propios archivos de configuración y estos incluyen los archivos que se encuentran debajo, /etc/profile.dpero 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/profiletiene 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

información relacionada