안녕하세요. 누구든지 저에게 도움을 주실 수 있어서 미리 감사드립니다.
나는 쉘 로그인 프로세스에 대한 이해를 높이려고 노력해 왔으며 언제 시작해야 하는지에 대한 규칙이 있는 끝없는 토끼굴인 것 같습니다. 현재 저는 최소한의 환경에서 비대화형 및 비로그인 쉘이 어떤 변수를 보는지 이해하려고 노력하고 있습니다. (그런데 저는 Centos 7 배포판을 사용하고 있습니다)
다음 스크립트를 실행했고 printenv 명령 출력에 정의된 변수와 함께 $- & shopt 출력을 사용하여 내 스크립트가 비대화형 및 비로그인 셸에서 실행되고 있는지 확인할 수 있습니다.
#!/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 시스템에서 가져온 것입니다.)
따라서 SLVL, HOME, TERM, PATH 및 PWD와 같이 initramfs 또는 커널 자체에서 제공할 수 있는 몇 가지 기본 사항이 있습니다. 시동 프로세스와 관련된 변수와 다양한 옵션 안전 기능도 있습니다.