Offenbar widersprüchliche Login- und Nicht-Login-Shell bei SSH

Offenbar widersprüchliche Login- und Nicht-Login-Shell bei SSH

Ich verwende RHEL6 (Kernel 2.6.32-573.el6.x86_64). Ich habe Aliase, die beim sshAufrufen von verwendet werden myserver. Einer davon ist

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

Es wird vermutlich in Nicht-Login-Shells als Alias ​​verwendet (siehe unten), aber sshing gibt eine Login-Shell aus, und dies wird durch die Zeile bestätigt

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

in meinem ~/.bashrc, die produziert

This is a login shell

wie erwartet. Daher habe ich keine Ahnung, warum/wo der Alias ​​festgelegt ist.

Wie lässt sich dieser scheinbar widersprüchliche Umstand rationalisieren?


In meinem System vorhandene Dateien:

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

In meinem System nicht vorhandene Dateien:

/etc/bash.bashrc
~/.profile


Kurz zusammengefasst

Der Alias ​​scheint (nur in Nicht-Login-Shells) durch die folgenden Zeilen festgelegt zu werden /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

welche Quelldatei /etc/profile.d/scl-aliases.shenthält

#!/bin/bash

sources_dir=/usr/local/bin/scls

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

und angesichts dessen

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

bash -xDies wurde (teilweise?) durch die Ausführung in der Eingabeaufforderung nach sshing bestätigt .

Antwort1

Dies ist eigentlich ein normales Verhalten. Es hängt von den unterschiedlichen Dateien ab, die von Login- und Nicht-Login-Skripten verwendet werden. Dies wurdeanderswo ausführlich behandeltaber kurz gesagt: (Interaktive) Bash-Shells ohne Anmeldung verwenden die bashrc-Dateifamilie ( /etc/bash.bashrc, ~/.bashrc) als Quelle, und (Interaktive) Login-Shells verwenden die verschiedenen Profildateien ( /etc/profile, ~/.profile).

Ihr /etc/bashrc(was meiner Meinung nach das Äquivalent zu /etc/bash.bashrcmacOS und vielleicht auch anderen Systemen ist) wird also nur von interaktiven Nicht-Login-Shells gelesen undRemote-Shell-Daemons. Wenn diese Datei gelesen wird und es sich bei der Shell, die sie liest, um eine Nicht-Login-Shell handelt (also nicht um einen Remote-Shell-Daemon), werden auch bestimmte Dateien darunter geladen /etc/profile.d.

Login-Shells lesen diese Datei jedoch nicht, daher ist sie hier nicht relevant. Stattdessen lesen sie sie, /etc/profileund wenn Sie diese Datei überprüfen, werden Sie etwas wie das Folgende finden (aus der /etc/profileDatei auf meinem 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

Deshalb sehen Sie diese in einer Login-Shell. Das liegt daran, dass Login-Shells nicht durchgehen bashrc, sondern über eigene Setup-Dateien verfügen, die die Dateien darunter einbringen, /etc/profile.dohne jedoch Login-Shells auszuschließen.

Antwort2

Ich poste dies als Antwort, da Kommentare keinen eingerückten Code enthalten können. Ein großes Lob andie Antwort von terdon.

Wie von Terdon angegeben, /etc/profileenthält meins die folgenden Zeilen.

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

Diese wären für den Alias ​​verantwortlich, nicht /etc/bashrc. Dies ließe sich leicht mit einer Lösung für überprüfen.Ablaufverfolgung der über SSH ausgeführten Skripte/Befehle

verwandte Informationen