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


긴 이야기 짧게

별칭은 다음 줄을 통해 설정된 것으로 보입니다(비로그인 쉘에서만) /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

이는 ing bash -x후에 명령 프롬프트에서 실행하여 (부분적으로?) 확인 되었습니다 ssh.

답변1

이는 실제로 정상적인 동작입니다. 이는 로그인 스크립트와 비로그인 스크립트 소스에 대한 서로 다른 파일로 귀결됩니다. 이건 이미다른 곳에서도 광범위하게 다루어짐그러나 간단히 말하면 (대화형) 비로그인 bash 쉘은 bashrc 시리즈 파일( /etc/bash.bashrc, ~/.bashrc)을 획득하고, (대화형) 로그인 쉘은 다양한 구성 파일( /etc/profile, ~/.profile)을 획득합니다.

따라서 귀하의 /etc/bashrc(내 생각에 이것은 /etc/bash.bashrcmacOS 및 기타 시스템과 동일하다고 생각합니다) 대화형 비로그인 셸에서만 읽을 수 있습니다.원격 쉘 데몬. 파일을 읽을 때 파일을 읽는 쉘이 비로그인 쉘(따라서 원격 쉘 데몬이 아닌 경우)인 경우에도 이 현상이 발생합니다 /etc/profile.d.

그러나 로그인 쉘은 이 파일을 읽지 않으므로 여기서는 관련이 없습니다. 대신 그들은 를 읽고 /etc/profile파일을 검사하면 다음과 같은 내용을 찾을 수 있습니다( /etc/profile내 아치의 파일에서).

# 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를 통해 실행된 스크립트/명령의 추적 순서

관련 정보