비대화형 및 비로그인 쉘에 표시되는 최소 환경 변수는 무엇입니까?

비대화형 및 비로그인 쉘에 표시되는 최소 환경 변수는 무엇입니까?

안녕하세요. 누구든지 나에게 제공할 수 있는 도움에 대해 미리 감사드립니다.

나는 쉘 로그인 프로세스에 대한 이해를 높이려고 노력해 왔으며 언제 시작해야 하는지에 대한 규칙이 있어 끝이 없는 토끼굴인 것 같습니다. 현재 저는 최소한의 환경에서 비대화형 및 비로그인 쉘이 어떤 변수를 볼 수 있는지 이해하려고 노력하고 있습니다. (나는 Centos 7 distro btw를 사용하고 있습니다)

다음 스크립트를 실행하고 내 스크립트가 $- & shopt 출력을 사용하여 비대화형 및 비로그인 셸에서 실행되고 있는지 확인할 수 있을 뿐만 아니라 printenv 명령 출력에서 ​​정의된 변수도 확인할 수 있습니다.

#!/bin/bash
#BASH_ENV=/home/kmg/environment

echo $-
shopt | grep login_shell
printenv
# echo $TEST1

이것은 내 스크립트의 출력입니다.

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

무엇을 기대해야 할지 잘 모르겠습니다... 하지만 printenv 명령에서 예상했던 것보다 더 많은 출력을 얻고 있습니다. 특히 /etc/environment 파일에 정의된 변수가 나타나는 위치(PAM이 변수를 읽기 때문에 먼저 정의될 것으로 예상했음)와 TERM, LESSOPEN 및 LS_COLORS 변수가 정의되어 있다는 사실 때문에 혼란스럽습니다.

나는 그 주제에 대해 읽으려고 노력했지만 이것이 가장 잘 문서화된 주제인 것 같지 않습니다. 내가 읽은 게시물 중 사람들은 자신이 말하려는 내용을 설명하기 위해 부정확하거나 상충되는 용어를 사용하고 있는 것 같습니다... 그리고 한 게시물은 한 가지 말을 하고 다른 게시물은 다른 말을 합니다. 그리고 그것은 나를 망쳐 놓고 혼란스럽게 만들었습니다.

이 주제를 내 머릿속에서 바로잡는 데 약간의 시간을 할애할 의향이 있는 분이라면 누구에게나 매우 감사하겠습니다!

다시 한 번... 시간을 내어 이 글을 읽어주신 분들께 미리 감사드립니다.

답변1

내보낸 환경 변수는 상위 프로세스에서 하위 프로세스로 상속됩니다. 따라서 실제로 환경 변수를 제거하는 컨텍스트(예: via sudo, env_reset 옵션 적용)에서 스크립트를 실행하지 않는 한 상위 프로세스에서 일부 변수를 얻을 수 있습니다.

Sudo의 기본 환경 변수 목록은 sudoers(5)다음과 같이 문서화되어 있습니다.

기본적으로 env_reset 옵션은 활성화되어 있습니다. 이로 인해 새로운 최소 환경에서 명령이 실행됩니다. AIX(및 PAM이 없는 Linux 시스템)에서 환경은 /etc/environment 파일의 내용으로 초기화됩니다. 새 환경에는 env_check 및 env_keep 옵션에서 허용하는 호출 프로세스의 변수 외에도 TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME 및 SUDO_* 변수가 포함됩니다. 이는 사실상 환경 변수에 대한 화이트리스트입니다.

그런데 /proc 파일 시스템을 통해 자신이 소유한 모든 프로세스의 환경을 엿볼 수 있습니다. 또는 루트인 경우 시스템의 모든 프로세스를 엿볼 수 있습니다.

예를 들어, init 프로세스(프로세스 #1)에 어떤 변수가 있는지 알고 싶다면 루트가 되어 다음을 수행할 수 있습니다.

# 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

(이 예제는 사용자 정의 커널이 있는 Debian 9 시스템에서 나온 것입니다.)

따라서 SHLVL, HOME, TERM, PATH 및 PWD와 같은 initramfs 또는 커널 자체에서 제공되는 몇 가지 기본 사항이 있습니다. 부팅 프로세스 및 다양한 선택적 보안 기능과 관련된 몇 가지 변수도 있습니다.

관련 정보