
Hallo und danke im Voraus für jede Hilfe, die mir jemand anbieten kann
Ich habe versucht, mein Verständnis des Shell-Anmeldevorgangs zu verbessern, und es scheint ein nie endendes Kaninchenloch mit seinen Regeln zu sein, was wann gestartet wird. Derzeit versuche ich zu verstehen, welche Variablen eine nicht interaktive und nicht anmeldebasierte Shell in einer minimalen Umgebung sehen würde. (Ich verwende übrigens die Centos 7-Distribution)
Ich führe das folgende Skript aus und kann anhand der Ausgabe von $- und shopt sowie der definierten Variablen aus der Ausgabe des Befehls printenv überprüfen, ob mein Skript in einer nicht interaktiven Shell ohne Anmeldung ausgeführt wird.
#!/bin/bash
#BASH_ENV=/home/kmg/environment
echo $-
shopt | grep login_shell
printenv
# echo $TEST1
Dies ist die Ausgabe meines Skripts
hB
login_shell off
XDG_SESSION_ID=407
HOSTNAME=centos7lab
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
USER=kmg
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/kmg/.local/bin:/home/kmg/bin
MAIL=/var/spool/mail/kmg
PWD=/home/kmg
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
HOME=/home/kmg
SHLVL=2
TEST_ENV=this is a test of the /etc/environment file
LOGNAME=kmg
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/1000
_=/bin/printenv
Ich bin nicht sicher, was ich erwarten soll ... Aber ich bekomme mehr Ausgabe vom printenv-Befehl, als ich erwarten würde. Besonders verwirrt mich, dass die in der Datei /etc/environment definierte Variable where erscheint (ich hätte erwartet, dass sie zuerst definiert wird, da PAM sie liest) und dass die Variablen TERM, LESSOPEN und LS_COLORS definiert sind.
Ich habe versucht, mich in das Thema einzulesen, aber es scheint nicht das am besten dokumentierte Thema zu sein. Aus den Beiträgen, die ich gelesen habe, geht hervor, dass die Leute falsche oder widersprüchliche Begriffe verwenden, um zu beschreiben, was sie sagen wollen ... Und in einem Beitrag steht das eine, in einem anderen etwas anderes. Und das hat mich irgendwie verwirrt und durcheinandergebracht.
Ich wäre jedem äußerst dankbar, der bereit wäre, ein wenig Zeit zu investieren, um mir dabei zu helfen, dieses Thema in meinem Kopf zu ordnen!
Noch einmal... vielen Dank im Voraus an alle, die sich die Zeit genommen haben, dies zu lesen
Antwort1
Exportierte Umgebungsvariablen werden vom übergeordneten Prozess an den untergeordneten Prozess vererbt. Wenn Sie Ihr Skript also nicht in einem Kontext ausgeführt haben, der tatsächlich Umgebungsvariablen entfernt (wie z. B. über sudo
, mit der Option env_reset), erhalten Sie wahrscheinlich einige Variablen vom übergeordneten Prozess.
Die Liste der grundlegenden Umgebungsvariablen von Sudo ist wie sudoers(5)
folgt dokumentiert:
Standardmäßig ist die Option env_reset aktiviert. Dadurch werden Befehle mit einer neuen, minimalen Umgebung ausgeführt. Unter AIX (und Linux-Systemen ohne PAM) wird die Umgebung mit dem Inhalt der Datei /etc/environment initialisiert. Die neue Umgebung enthält die Variablen TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME und SUDO_* sowie die Variablen aus dem aufrufenden Prozess, die durch die Optionen env_check und env_keep zugelassen werden. Dies ist praktisch eine Whitelist für Umgebungsvariablen.
Übrigens können Sie über das /proc-Dateisystem einen Blick auf die Umgebung jedes Ihrer Prozesse werfen – oder, wenn Sie Root sind, auf jeden beliebigen Prozess im System.
Wenn Sie beispielsweise wissen möchten, welche Variablen der Init-Prozess (Prozess Nr. 1) hat, können Sie Root werden und Folgendes tun:
# strings /proc/1/environ
selinux=0
SHLVL=1
HOME=/
init=/sbin/init
TERM=linux
drop_caps=
BOOT_IMAGE=/vmlinuz-4.9.61-atom
PATH=/sbin:/usr/sbin:/bin:/usr/bin
crashkernel=384M-:128M
PWD=/
rootmnt=/root
(Dieses Beispiel stammt von einem Debian 9-System mit einem benutzerdefinierten Kernel.)
Es gibt also einige grundlegende Dinge, die wahrscheinlich entweder vom initramfs oder vom Kernel selbst bereitgestellt werden, wie SHLVL, HOME, TERM, PATH und PWD. Es gibt auch einige Variablen, die mit dem Startvorgang und den verschiedenen optionalen Sicherheitsfunktionen zusammenhängen.