Очевидно, противоречие между входом в систему и не входом в систему через SSH

Очевидно, противоречие между входом в систему и не входом в систему через SSH

Я использую RHEL6 (ядро 2.6.32-573.el6.x86_64). У меня есть псевдонимы, которые берутся при sshпереходе в myserver. Один из них —

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

Предположительно, он является псевдонимом в оболочках, не предназначенных для входа (см. ниже), но sshing дает оболочку входа, и это подтверждается строкой

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

в моем ~/.bashrc, который производит

This is a login shell

как и ожидалось. Таким образом, я понятия не имею, почему/где установлен псевдоним.

Как объяснить это, казалось бы, противоречивое обстоятельство?


Файлы, присутствующие в моей системе:

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

Файлы, отсутствующие в моей системе:

/etc/bash.bashrc
~/.profile


TL;DR

Похоже, что псевдоним задается (только в оболочках без входа в систему) следующими строками в /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

какой исходный файл /etc/profile.d/scl-aliases.shсодержит

#!/bin/bash

sources_dir=/usr/local/bin/scls

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

и учитывая, что

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

Это было (частично?) подтверждено запуском bash -xв командной строке после sshing.

решение1

Это на самом деле нормальное поведение. Это сводится к разным файлам, которые исходят из скриптов входа и не входа. Это былошироко освещено в других местахно, вкратце, (интерактивные) оболочки bash без входа в систему являются источником семейства файлов bashrc ( /etc/bash.bashrc, ~/.bashrc), а (интерактивные) оболочки входа в систему являются источником различных файлов профилей ( /etc/profile, ~/.profile).

Итак, ваш /etc/bashrc(который, как я думаю, является эквивалентом /etc/bash.bashrcв macOS и, возможно, в других системах) читается только интерактивными оболочками, не требующими входа в систему, иудаленные демоны оболочки. При чтении этого файла, если оболочка, читающая его, не является оболочкой входа в систему (то есть не является демоном удаленной оболочки), она также добавляет определенные файлы в /etc/profile.d.

Однако оболочки входа не читают этот файл, поэтому он здесь не актуален. Вместо этого они будут читать, /etc/profileи если вы проверите этот файл, вы найдете что-то вроде этого (из /etc/profileфайла на моем 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

Вот почему вы видите их в оболочке входа. Это потому, что оболочки входа не работают bashrc, а вместо этого имеют свои собственные файлы настройки, и они вносят файлы под /etc/profile.dоболочки входа, но не исключают их.

решение2

Я публикую это как ответ, учитывая, что комментарии не могут иметь отступ кода. Респектответ тердона.

Как заявил terdon, у меня /etc/profileесть следующие строки.

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

Они будут отвечать за псевдоним, а не /etc/bashrc. Это можно легко проверить с помощью решения дляОтслеживание последовательности скриптов/команд, выполняемых по ssh

Связанный контент