Bash - 윈디하나의 솔라나라
|
2014년 9월에 알려진 Bashdoor 로 알려져있는 Shellshock 버그로 인해, 반드시 Bash 4.3(027) 이후 버전을 사용할 것을 권장한다.
아래와 같이 실행되면 문제가 있으며 반드시 패치해야 한다.
windy@wl ~ $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" vulnerable this is a test windy@wl ~ $ env X='() { (a)=>\' bash -c "echo date"; cat echo /bin/bash: X: line 1: syntax error near unexpected token `=' /bin/bash: X: line 1: `' /bin/bash: error importing function definition for `X' 2015년 X월 X일 화요일 오전 10시 21분 56초
패치한 경우 아래와 같이 실행된다.
windy@wl ~ $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" this is a test windy@wl ~ $ env X='() { (a)=>\' bash -c "echo date"; cat echo date 2015년 X월 X일 화요일 오전 10시 21분 56초자세한 사항은 CVE-2014-6271, CVE-2014-6277, CVE-2014-6278, CVE-2014-7169, CVE-2014-7186, CVE-2014-7187 을 참조하자.
windy@wl ~/src $ wget http://ftp.gnu.org/gnu/bash/bash-5.0.tar.gz windy@wl ~/src $ tar xvfz bash-5.0.tar.gz windy@wl ~/src $ cd bash-5.0 windy@wl ~/src/bash-5.0 $ for i in {1..999}; do wget http://ftp.gnu.org/gnu/bash/bash-5.0-patches/bash50-$(printf "%03d" $i) || break done windy@wl ~/src/bash-5.0 $ cat bash50-??? | patch -p0 patching file bashline.c ... windy@wl ~/src/bash-5.0 # ./configure --enable-static-link CFLAGS="-m64" LDFLAGS="-m64" windy@wl ~/src/bash-5.0 # make windy@wl ~/src/bash-5.0 # sudo make install windy@wl ~/src/bash-5.0 # /usr/local/bin/bash --version GNU bash, version 5.0.7(1)-release (x86_64-pc-solaris2.11) ...
--login
옵션을 주어 실행한경우/etc/profile
파일이 있는 경우 실행~/.bash_profile
, ~/.bash_login
, ~/.profile
를 순서대로 찾아 존재하는 파일 하나만 실행한다. 앞의 파일이 존재해 실행했으면 뒤 파일은 실행하지 않는다~/.bash_logout
파일이 있는 경우 실행~/.bashrc
파일이 있는 경우 실행if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
#!/bin/bash
처럼 사용된 경우BASH_ENV
환경변수에 내용이 있는 경우 이 환경변수가 지정한 파일을 실행. 아래와 같은 구문을 실행한다고 생각할 수 있다.
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
/etc/profile
을 실행하고, ~/.profile
가 있을 경우 실행한다.
login as: root Using keyboard-interactive authentication. Password: Last login: Wed Sep 16 09:38:48 2009 from 192.168.0.2 Sun Microsystems Inc. SunOS 5.10 Generic January 2005 /etc/profile .profile root@wl ~ # bash .bashrc root@wl ~ # exit root@wl ~ # logout .bash_logout
/etc/profile
에서 /etc/inputrc
, /etc/profile.d/*.sh
를 읽어들이고,
이후 실행되는 ~/.bash_profile
에서 ~/.bashrc
를 읽도록 스크립트가 짜여져 있으며,
다시 ~/.bashrc
에서는 /etc/bashrc
를 읽도록 스크립트가 프로그래밍되어있다.
즉 /etc/inputrc
, /etc/profile.d/*.sh
, /etc/bashrc
는 bash 내부에서 읽어들이는 스크립트가 아니다./etc/profile
와 ~/.bashrc
를 사용하며, 셸 실행시 ~/.bashrc
를 사용한다. sh와 호환되도록 스크립트를 작성한다.\
이다.'
는 인용부호 안의 내용을 변경하지 않고 셸에 전달한다."
는 $
, `
, \
, !
(히스토리 확장이 활성화된경우에 한함)에 대해서는 지정된 규칙에 따라 변경하고 셸에 전달한다. 또한 셸 확장인 *
와 @
에 대해서도 변환을 수행한다.\
뒤에 아래와 같은 문자가 올 수 있다.
\a
\b
\e
, \E
\f
\n
\r
\t
\v
\\
\'
\"
\nnn
\xHH
\uHHHH
\uHHHHHHHHHH
\cx
|
, |&
를 통해 파이프라인을 정해줄 수 있다. |&
은 2>&1 |
과 동일하다.;
, &
, &&
, ||
를 사용해 여러개의 명령을 한번에 실행할 수 있다. ;
, &
, CR
은 명령의 끝을 의미하기도 한다.until
until test-commands; do consequent-commands; done
while
while test-commands; do consequent-commands; done
for
for name [ [in [words …] ] ; ] do commands; done
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
if
if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi
case
case word in [ [(] pattern [| pattern]…) command-list ;;]… esac
select
select name [in words …]; do commands; done
((…))
(( expression ))
let "expression"
[[…]]
[[ expression ]]
()
( list )
{}
{ list; }
coproc
coproc [NAME] command [redirections]
name () compound-command [ redirections ]
function name [()] compound-command [ redirections ]
name=[value]
형태로 정의 해주며, $name
형태로 사용하는 것이 기본이다. +=
구문도 사용 가능하다.declare
명령을 통해 설정 가능하며, unset
을 통해 파라메터를 제거할 수 있다.*
: 첫번째 파라메터부터 모든 파라메터를 의미. "$1c$2c..." 와 동일@
: 첫번째 파라메터부터 모든 파라메터를 의미. "$1" "$2"#
: 파라메터의 개수?
: 최근에 종료된 명령어의 종료코드-
: 현재 옵션 플래그$
: 셸의 PID!
: 최근에 백그라운드로 실행한 잡의 PID0
: 셸 스크립트 이름_
: 셸 스크립트 전체 경로{}
지정한 이름들로 각각 확장
a{d,c,b}e
→ ade ace abe
{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
{x..y[..incr]}
~
사용자의 홈 디렉토리($HOME
)
~
→ $HOME
~/foo
→ $HOME/foo
~fred/foo
→ fred사용자의
$HOME/foo
~+/foo
→ $PWD/foo
~-/foo
→ ${OLDPWD}/foo
~N
, ~+N
, ~-N
→ dirs(1)의 확장입력/출력의 방향을 지정한 파일로 (복제되어) 대체(Redirections)한다. /dev/stdin, /dev/stdout, /dev/stderr, /dev/fd/* 의 파일 디스크립터로 대체할 수 있으며, 일부 운영체제에서는 /dev/tcp/host/port 나 /dev/udp/host/port 으로도 리다이렉트 가능하다.
구문을 사용할 때 주의점은 설정이 복사되어 지정된다는 것이다. ls > dirlist 2>&1
와 ls 2>&1 > dirlist
는 다르다.
[n]<word
[n]>[|]word
[n]>>word
[n]<<[-]word here-document delimiter
[n]<<< word
[n]<&word
, [n]>&word
[n]<&digit-
, [n]>&digit-
[n]<>word
stdin 과 stdout 을 같은 word 으로 대체하려면 >word 2>&1
을, 붙이려면 >>word 2>&1
을 사용하자.
셸에 내장되어있는 명령에 대해 간단히 설명한다. 전체 내용은 셸 내장 명령을 참조하자.
: [arguments]
. filename [arguments]현재 셸 컨텍스트에서 지정한 파일을 읽어 실행
break [n]for, while, until, select 루프를 탈출
cd [-L|[-P [-e]] [-@] [directory]현재 디렉토리를 이동
continue [n]for, while, until, select 루프를 다음 이터레이션으로 지속
eval [arguments]
exec [-cl] [-a name] [command [arguments]]
exit [n]셸을 종료
export [-fn] [-p] [name[=value]]지정한 인자를 가진 셸 지역변수(Local Variable)를 셸 환경변수(Environment Variable)로 변경한다. 환경변수는 새로운 셸 인스턴스가 실행되어도 동일하게 전달된다
getopts optstring name [args]
hash [-r] [-p filename] [-dt] [name]
pwd [-LP]현재 작업 디렉토리를 출력한다
readonly [-aAf] [-p] [name[=value]] …지정한 name 에 대해 읽기 전용 속성을 준다. 읽기 전용 속성을 준 name 에 대해서는 수정할 수 없다.
return [n]
shift [n]
test expr
[ expr
times셸과 그 차일드 프로세스가 소비한 유저 시간(User Time, 사용자 영역에서 실행된 CPU 시간), 시스템 시간(User Time, 시스템 영역에서 실행된 CPU 시간)을 출력한다. 1개의 코어를 사용해 1초동안 실행했다면 1초 소비한 것으로 출력된다. (멀티 쓰레드 응용인 경우와, 멀티 코어 시스템인 경우를 감안해 출력을 확인해야 한다)
trap [-lp] [arg] [sigspec …]
umask [-p] [-S] [mode]
unset [-fnv] [name]
set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]BASH 의 셸 작동 방식을 변경한다.
bash 가 POSIX 모드로 작동할 경우 아래와 같은 내장 명령을 사용할 수 있다.
break : . continue eval exec exit export readonly return set shift trap unset
CDPATH
: cd
에서 사용할 콜론으로 구분된 검색 디렉토리들.HOME
: 사용자의 홈 디렉토리IFS
: MAIL
: MAILPATH
: OPTARG
: OPTIND
: PATH
: 콜론으로 구분된 커맨드 검색 디렉토리들.PS1
: 프라이머리 셸 프롬프트 문자. 기본값은 \s-\v\$
PS2
: 세컨더리 셸 프롬프트 문자. 기본값은 >
BASH
: BASHOPTS
: BASHPID
: BASH_ALIASES
: BASH_ARGC
: BASH_ARGV
: BASH_CMDS
: BASH_COMMAND
: BASH_COMPAT
: BASH_ENV
: BASH_EXECUTION_STRING
: BASH_LINENO
: BASH_LOADABLES_PATH
: BASH_REMATCH
: BASH_SOURCE
: BASH_SUBSHELL
: BASH_VERSINFO
: BASH_VERSION
: BASH_XTRACEFD
: CHILD_MAX
: COLUMNS
: COMP_CWORD
: COMP_LINE
: COMP_POINT
: COMP_TYPE
: COMP_KEY
: COMP_WORDBREAKS
: COMP_WORDS
: COMPREPLY
: COPROC
: DIRSTACK
: EMACS
: ENV
: EUID
: EXECIGNORE
: FCEDIT
: FIGNORE
: FUNCNAME
: FUNCNEST
: GLOBIGNORE
: GROUPS
: histchars
: HISTCMD
: HISTCONTROL
: HISTFILE
: HISTFILESIZE
: HISTIGNORE
: HISTSIZE
: HISTTIMEFORMAT
: HOSTFILE
: HOSTNAME
: HOSTTYPE
: IGNOREEOF
: INPUTRC
: LANG
: LC_ALL
: LC_COLLATE
: LC_CTYPE
: LC_MESSAGES
: LC_NUMERIC
: LC_TIME
: LINENO
: LINES
: MACHTYPE
: MAILCHECK
: MAPFILE
: OLDPWD
: OPTERR
: OSTYPE
: PIPESTATUS
: POSIXLY_CORRECT
: PPID
: PROMPT_COMMAND
: PROMPT_DIRTRIM
: PS0
: PS3
: PS4
: PWD
: RANDOM
: READLINE_LINE
: READLINE_POINT
: REPLY
: SECONDS
: SHELL
: SHELLOPTS
: SHLVL
: 셸 레벨을 알려줌. 로그인 셸은 1TIMEFORMAT
: TMOUT
: TMPDIR
: UID
: root@wl ~ # export HISTIGNORE="&:ls:[bf]g:exit"
root@wl ~ # export HISTCONTROL=erasedupsBASH의 버전이 낮은 경우 아래와 같이 적용
root@wl ~ # export HISTCONTROL=ignoreboth
windy@wl ~/argtest $ touch file1 windy@wl ~/argtest $ touch file2 windy@wl ~/argtest $ touch -- "-al" windy@wl ~/argtest $ cat arg #!/bin/bash echo $@ windy@wl ~/argtest $ chmod +x arg windy@wl ~/argtest $ ls -alhF 총 4 -rw-r--r-- 1 windy staff 0 2월 19일 00:00 -al -rwxr-xr-x 1 windy staff 20 2월 19일 00:00 arg* -rw-r--r-- 1 windy staff 0 2월 19일 00:00 file1 -rw-r--r-- 1 windy staff 0 2월 19일 00:00 file2 windy@wl ~/argtest $ ls -al arg file1 file2 windy@wl ~/argtest $ ls * 1) -rwxr-xr-x 1 windy staff 20 2월 19일 00:00 arg -rw-r--r-- 1 windy staff 0 2월 19일 00:00 file1 -rw-r--r-- 1 windy staff 0 2월 19일 00:00 file2 windy@wl ~/argtest $ ls -al -- -al 2) -rw-r--r-- 1 windy staff 0 2월 19일 00:00 -al windy@wl ~/argtest $ ./arg * -al arg file1 file2 windy@wl ~/argtest $ ls "*" *: 해당 파일이나 디렉토리가 없음 windy@wl ~/argtest $ ./arg -- -f -- -f windy@wl ~/argtest $ rm -- -al 3) windy@wl ~/argtest $ ls -lhF 총 4 -rwxr-xr-x 1 windy staff 20 2월 19일 00:00 arg* -rw-r--r-- 1 windy staff 0 2월 19일 00:00 file1 -rw-r--r-- 1 windy staff 0 2월 19일 00:00 file2 windy@wl ~/argtest $1) 이 챕터의 핵심이다. 셸이 * 을 해석해 넘겨준 '-al' 은 ls 에 의해 옵션으로 해석되었다.
RSS ATOM XHTML 5 CSS3 |
Copyright © 2004-2025 Jo HoSeok. All rights reserved. |