Aparentemente contradiz login e não-login shell no ssh

1

Estou executando o RHEL6 (kernel 2.6.32-573.el6.x86_64). Eu tenho aliases que são originados em ssh ing em myserver . Uma delas é

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

É presumivelmente aliado em shells não-login (veja abaixo), mas ssh ing dá 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. Assim, não tenho idéia do porque / onde é o alias definido.

Como racionalizar essa circunstância aparentemente contraditória?

Arquivos presentes no meu sistema:
/etc/profile
/etc/bashrc
/etc/profile.d/*
~/.bashrc

Arquivos não presentes no meu sistema:

/etc/bash.bashrc
~/.profile

TL; DR

O alias parece estar definido (somente em shells de não-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.sh contendo

#!/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 -x no prompt de comando após ssh ing.

    
por sancho.s 01.12.2017 / 02:34

2 respostas

1

Este é realmente um comportamento normal. Tudo se resume aos diferentes arquivos originados por login e scripts que não são de login. Isso tem sido coberto extensivamente em outros lugares mas, resumidamente, shells bash não-login (interativos) originam a família de arquivos bashrc ( /etc/bash.bashrc , ~/.bashrc ) e shells de login (interativos) originam os vários arquivos de perfil ( /etc/profile , ~/.profile ).

Portanto, seu /etc/bashrc (que eu acho que é o equivalente de /etc/bash.bashrc no macOS e talvez outros sistemas) é lido apenas por shells interativos que não são de login e daemons de shell remotos . Quando esse arquivo é lido, se a leitura do shell for um shell não-login (portanto, não um daemon remoto), ele também traz arquivos específicos sob /etc/profile.d .

Os shells de login, no entanto, não lêem este arquivo, por isso não é relevante aqui. Em vez disso, eles lerão /etc/profile e, se você verificar esse arquivo, encontrará algo parecido com isto (do arquivo /etc/profile 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 através de bashrc e, em vez disso, têm seus próprios arquivos de configuração e eles trazem os arquivos em /etc/profile.d , mas sem excluir os shells de login.

    
por 04.12.2017 / 21:49
0

Estou postando isso como uma resposta, uma vez que os comentários não podem ter código recuado. Parabéns para a resposta por terdon .

Como afirmado por terdon, meu /etc/profile tem 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 /etc/bashrc . Isso pode ser facilmente verificado com uma solução para Sequência de rastreamento de scripts / comandos executados em ssh

    
por 05.12.2017 / 01:33

Tags