Login vs Non-Login Shell
이번엔 좀 다른 관점에서 shell 이 실행되는 환경을 두가지로 나누어 볼 수 있습니다. 리모트 서버에 ssh 이나 telnet 으로 접속해서 login 과정을 거쳐 사용하게 되는 login shell 과 윈도우 매니저에서 메뉴로 제공하는 터미널 프로그램을 실행시켜 사용하게 되는 non-login shell 입니다.
login shell 인지 아닌지는 shopt -q login_shell; echo $?
을 통해 알아볼 수 있습니다.
Login Shell
시작시 /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profile 순서로 파일을 읽어들여 실행합니다. (
bash -l -c
와 같은 login shell 에도 적용됩니다 ). 보통 /etc/profile 에서는.
( source 명령 ) 을 이용해 /etc/bash.bashrc 를 읽어들이고 ~/.profile 에서는 ~/.bashrc 파일을 읽어들입니다.logout ( 또는 exit ) 시에 ~/.bash_logout 파일을 실행합니다.
shopt -s huponexit
옵션 설정을 통해 logout 시에 background 로 실행되는 job 들에게 HUP 시그널을 보내 종료하게 할 수 있습니다.logout builtin 명령을 사용할 수 있습니다.
group membership 설정( /etc/group ) 은 login 또는 ssh 시에만 적용됩니다.
Non-Login Shell
- 시작시 /etc/bash.bashrc 와 ~/.bashrc 파일을 실행합니다.
.rc 파일의 유래: 1965 년 MIT Compatible Time-Sharing System (CTSS) 에는 하나의 파일에 여러 명령을 넣어놓고 실행하는 기능이 있었는데 'run commands' 를 뜻하는 의미로 'runcom' 이라 불렀다고 합니다. 여기서 앞 글자를 따서 .rc 파일 이라고 합니다.
- Non-login shell 에서도
su - userid
나bash -l
같은 명령을 사용해서 login shell 을 만들 수 있습니다.
Real user id vs Effective user id
Real user id 는 시스템에 로그인했을 때의 id 를 말하며
$UID
readonly 환경 변수에 저장됩니다.
effective user id 는 set uid 비트가 설정된 프로그램을 실행했을 때 변경되며
$EUID
readonly 환경 변수에 저장됩니다.
EUID 는 명령을 실행할 때 실질적인 권한에 해당합니다.
### alice 계정 ###
alice@box:/tmp/priv$ cp /bin/bash bash
alice@box:/tmp/priv$ chmod u+s bash # set uid 비트 설정
### bob 계정 ###
bob@box:/tmp/priv$ ./bash -p
bash-4.3$ id # euid 가 alice 로 변경되었다
uid=1002(bob) gid=1005(gamers) euid=1004(alice) groups=1002(bob),1005(gamers)
.bashrc.d 만들어 사용하기
shell 을 사용하다 보면 내가 만든 함수, alias, 자동완성 이 쌓이게 되는데요. 이럴때 ~/.bashrc.d
디렉토리를 만들어서 한 곳에서 관리하면 좋습니다. 이름 뒤에 .d
를 붙인것은 .bashrc 에서 사용하는 파일들이 위치하는 디렉토리 라는 뜻입니다.
# ~/.bashrc 에 들어갈 내용
# alias 설정 읽어들이기
file=~/.bashrc.d/aliases
test -f "$file" && source "$file"
# 함수 설정 읽어들이기
for file in ~/.bashrc.d/functions/*.sh
do
source "$file"
done
# 자동완성 설정 읽어들이기
for file in ~/.bashrc.d/completions/*.sh
do
source "$file"
done
unset -v file