Aparentemente contradizendo login vs. shell sem login no ssh

Aparentemente contradizendo login vs. shell sem login no ssh

Estou executando o RHEL6 (kernel 2.6.32-573.el6.x86_64). Eu tenho aliases que são originados sshem myserver. Um deles é

alias scl-devtoolset-3='source /usr/local/bin/scls/devtoolset-3'

Presumivelmente, é um alias em shells que não são de login (veja abaixo), mas sshing fornece um shell de login, e isso é confirmado pela linha

shopt -q login_shell && echo 'This is a login shell' || echo 'This is a non-login shell'

no meu ~/.bashrc, que produz

This is a login shell

como esperado. Portanto, não tenho ideia de por que/onde o alias está definido.

Como racionalizar esta circunstância aparentemente contraditória?


Arquivos presentes em meu sistema:

/etc/profile
/etc/bashrc
/etc/profile.d/*
~/.bashrc

Arquivos não presentes em meu sistema:

/etc/bash.bashrc
~/.profile


DR

O alias parece estar definido (somente em shells que não são de login) pelas seguintes linhas em /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

qual arquivo de origem /etc/profile.d/scl-aliases.shcontém

#!/bin/bash

sources_dir=/usr/local/bin/scls

for scl in `ls $sources_dir`; do
        alias scl-$scl="source $sources_dir/$scl"
done

e dado que

$ ls /usr/local/bin/scls
devtoolset-3  devtoolset-4  devtoolset-6  python27  python33

Isso foi (parcialmente?) Confirmado executando bash -xno prompt de comando após sshing.

Responder1

Na verdade, esse é um comportamento normal. Tudo se resume aos diferentes arquivos provenientes de scripts de login e scripts sem login. Isto tem sidocoberto extensivamente em outro lugarmas, resumidamente, os shells bash (interativos) sem login originam a família bashrc de arquivos ( /etc/bash.bashrc, ~/.bashrc) e os shells de login (interativos) originam os vários arquivos de perfil ( /etc/profile, ~/.profile).

Então, o seu /etc/bashrc(que eu acho equivalente ao /etc/bash.bashrcmacOS e talvez em outros sistemas) só é lido por shells interativos sem login edaemons shell remotos. Quando esse arquivo é lido, se o shell que o lê for um shell sem login (portanto, não um daemon de shell remoto), ele também trará arquivos específicos em /etc/profile.d.

Os shells de login, entretanto, não leem este arquivo, portanto ele não é relevante aqui. Em vez disso, eles irão ler /etc/profilee se você verificar esse arquivo, você encontrará algo assim (no /etc/profilearquivo no meu 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

É por isso que você está vendo isso em um shell de login. É porque os shells de login não funcionam bashrce, em vez disso, têm seus próprios arquivos de configuração e eles trazem os arquivos abaixo, /etc/profile.dmas sem excluir os shells de login.

Responder2

Estou postando isso como resposta, visto que os comentários não podem ter código recuado. Parabéns aa resposta de terdon.

Conforme afirmado por terdon, my /etc/profiletem as seguintes linhas.

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

Estes seriam responsáveis ​​pelo alias, não pelo /etc/bashrc. Isto poderia ser facilmente verificado com uma solução paraSequência de rastreamento de scripts/comandos executados no ssh

informação relacionada