Connecting
Shell 특수 변수 본문
본 문서는 다음 링크를 참조하여 작성하였음을 알린다.
이번 시간에서는 유닉스/리눅스에서 사용하는 특수 변수에 대해서 알아보도록 한다. 이러한 변수 이름은 예약어로 지정되어 있기 때문에 지역, 전역 변수로 사용할 수 없으며, 스크립트 작성 시 각별하게 유의해야 한다.
예약 변수 (Reserved Variable)
일반적인 프로그래밍 언어에서 사용하는 예약 변수와 동일한 기능을 담당한다고 생각하면 된다. 쉘 프로그래밍을 작성할 때, 예약변수를 사용하면 보편적인 실행환경으로 작성할 수 있으므로 편리하게 사용할 수 있다.
변수명 | 설명 |
---|---|
HOME | 사용자 홈 디렉터리 |
PATH | 실행 파일을 찾을 경로 |
LANG | 프로그램 사용시 기본 지원되는 언어 |
FUNCNAME | 현재 함수 이름 |
SECONDS | 스크립트가 실행된 시간 (초 단위) |
SHLVL | 중첩된 쉘 레벨 (현재 실행중인 쉘 레벨 수이며, Linux 배포판에 따라 다름) |
SHELL | 로그인해서 사용하고 있는 쉘 |
PPID | 부모 프로세스의 PID |
BASH | BASH 실행 파일 경로 |
BASH_ENV | 스크립트 실행시 BASH 시작 파일을 읽을 위치 변수 |
BASH_VERSION | 현재 설치된 BASH 버전 |
BASH_VERSINFO | 배열로 상세 정보 출력 |
메일 보관 경로 | |
MAILCHECK | 메일 확인 시간 |
OSTYPE | 운영체제 종류 |
TERM | 터미널의 종류 |
HOSTNAME | 호스트 이름 |
HOSTTYPE | 시스템 하드웨어 종류 |
MACHTYPE | 머신 종류 |
LOGNAME | 로그인 이름 |
UID | 사용자 UID |
TMOUNT | 로그아웃할 시간, 0일 경우 무제한 |
USER | 사용자의 이름 |
USERNAME | 사용자 이름 |
GROUPS | 사용자 그룹 (/etc/passwd) |
HISTFILE | 히스토리 파일 경로 |
HISTFILESIZE | 히스토리 파일 사이즈 |
HISTSIZE | 히스토리에 저장된 개수 |
HISTCONTROL | 중복되는 명령에 대한 기록 유무 |
DISPLAY | X 디스플레이 이름 |
IFS | 입력 필드 구분자 |
VISAUL | VISUAL 편집기 이름 |
EDITOR | 기본 편집기 이름 |
COLUMNS | 터미널의 컬럼 수 |
LINES | 터미널의 라인 수 |
LS_COLORS | ls 명령의 색상 관련 옵션 |
PS1 | 기본 프롬프트 스트링. 기본값은 `\s-\v$ ' |
PS2 | 긴 문자 입력을 위해 나타나는 문자열. 기본 값은 > |
PS3 | 쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #? ) |
PS4 | 쉘 스크립트 디버깅 모드의 프롬프트 변수 |
부록 - 특수 권한
일반적으로 리눅스 유닉스는 사용자의 파일 권한을 부여하여 기초적인 보안체계를 유지한다. 파일이나 디렉터리에서는 user, group, other 권한이 존재하며 각각 읽기, 쓰기, 실행 권한을 부여할 수 있다.
이러한 권한을 수정하기 위해서 chmod 명령을 사용하는데 쉘에서 특수 권한을 주기 위해서도 같은 명령을 사용한다.
SetUID
-
파일을 실행할 때 일시적으로 소유자의 권한을 얻어 실행할 수 있도록 한다.
-
root 권한으로 지정된 프로그램에 SetUID가 지정되어 있으면 root 권한으로 실행된다.
$ touch setuid $ ll -rw-r--r-- 1 seongwon staff 0B 1 25 14:50 setuid $ chmod 4644 ./setuid -rwSr--r-- 1 seongwon staff 0B 1 25 14:50 setuid
-
기존에 실행권한이 없으면 대문자 S, 있으면 소문자 s로 표시된다.
-
리눅스에서 설정되어 있는 대표적인 파일은 /usr/bin/passwd이다.
$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 68208 May 28 2020 /usr/bin/passwd
- 해당 파일은 계정의 비밀번호를 변경할 수 있도록 하는 실행파일로 root만 변경 가능하도록 설정되어 있다.
- /usr/bin/passwd에 SetUID가 설정되어 있지 않으면 일반 사용자는 root 사용자를 통해 비밀번호를 변경해야 하므로 일반 사용자도 /etc/passwd 파일을 수정 가능하도록 설정되어 있다.
- /etc/passwd는 사용자의 이름과 같은 권한에 대한 데이터베이스만 존재하며, 실제 비밀번호는 /usr/bin/passwd 사용자가 패스워드를 변경할 때만 사용한다. 과거 패스워드가 파일 형태로 저장되어 있으나 현재는 저장되지 않는다. 이러한 부분에 대한 자세한 설명은 shadow파일의 대해 검색하길 바란다.
SetGID
-
파일을 실행할 때 일시적으로 파일 소유 그룹의 권한을 얻어 실행할 수 있도록 한다.
$ touch setgid $ ll -rw-r--r-- 1 seongwon staff 0B 1 25 15:20 setgid $ chmod 2644 ./setuid -rw-r-Sr-- 1 seongwon staff 0B 1 25 15:20 setgid
- 기존 권한에 실행권한이 없으면 대문자 S, 있으면 소문자 s로 표시된다.
Sticky Bit
-
Sticky Bit가 설정된 디렉토리에 파일을 생성하면 해당 파일은 생성한 사람의 소유가 되며 소유자와 root만이 해당 파일에 대한 삭제 및 수정에 대한 권한을 가질 수 있다.
-
즉 Sticky Bit가 설정된 디렉토리안에 누구나 파일을 생성할 수는 있지만 삭제는 본인과 관리자만 가능하다.
$ mkdir sticky $ chmod 1644 sticky $ ll drw-r--r-T 2 seongwon staff 64B 1 25 15:22 sticky
-
일반적으로 리눅스, 유닉스는 파일이나 디렉터리의 소유자 혹은 소유 그룹만이 삭제, 수정할 수 있도록 권한을 지정하지만 모든 사용자들이 파일을 생성, 수정, 삭제할 수 있는 다음과 같은 공용 디렉터리도 존재한다.
- /tmp
- /var/tmp
-
파일의 소유자가 아닌 다른 사용자가 퍼미션이 777인 파일을 삭제, 수정하는 과정에서 문제가 발생할 수 있기 때문에 를 방지하기 위해 Sticky Bit를 설정하여 공용 디렉터리라도 해당 파일의 소유자와 관리자만 삭제, 수정 권한을 줄 수 있도록 한다.
특수 변수
변수명 | 설명 |
---|---|
$0 | 현재 스크립트 파일 이름 |
$n | 스크립트가 호출된 인수, n은 인수의 십진수를 표현 ($1, $2, $3 ...) |
$# | 매개 변수의 총 개수 |
$* | 전체 인자 값 |
$@ | 모든 인자가 ""로 묶여 있으며, 스크립트가 두 개의 인수를 받으면 $1, $2와 동일하다. |
$? | 마지막으로 실행된 명령어, 함수, 스크립트 자식의 종료 상태 |
$$ | 현재 스크립트의 PID |
$! | 마지막으로 실행된 백그라운드 PID |
Command-Line Arguments
위에서 설명한 특수 변수를 활용하여 쉘 스크립트를 작성하고, 인수를 넘긴다.
#!/bin/sh
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
$ ./arguments.sh lucas wisoft
File Name: ./arguments.sh
First Parameter : lucas
Second Parameter : wisoft
Quoted Values: lucas wisoft
Quoted Values: lucas wisoft
Total Number of Parameters : 2
#!/bin/sh
for TOKEN in $*
do
echo $TOKEN
done
$ ./arguments2.sh lucas wisoft hanbat seongwon
lucas
wisoft
hanbat
seongwon
'쉘 스크립트' 카테고리의 다른 글
쉘 스크립트 조건문 사용하기 (0) | 2021.02.13 |
---|---|
쉘 스크립트 기본 연산자 (0) | 2021.01.28 |
쉘 스크립트 배열 (0) | 2021.01.27 |
Shell Script 변수 (0) | 2021.01.19 |
쉘 스크립트 기본 (0) | 2021.01.12 |