์ค๋ ์ฐ๋ฆฌ๋ Sherlock ์์คํ ์ ์ต์ ์ ๋ฐ์ดํธ ์ค ์ผ๋ถ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค. [์ด๊ฒ์ ์คํ ํฌ๋ ๋ํ์ ๊ณ ์ฑ๋ฅ ํด๋ฌ์คํฐ์ ๋๋ค. trans.]๋ฅผ ์ฌ์ฉํ๋ฉด ํญ๋ชฉ ์๊ฐ ๋ง์ ๋๋ ํฐ๋ฆฌ์ ํ์ผ ๋์ด ์๋๊ฐ ํฌ๊ฒ ๋นจ๋ผ์ง๋๋ค.
์ผ๋ฐ ๊ธฐ์ฌ์๋ ๋ฌ๋ฆฌ, ์ด๊ฒ์ Sherlock์ด ์ฌ์ฉ์๋ฅผ ์ํด ์ต์์ ์ํ๋ก ์ ์ง๋๋๋ก ์ ๊ธฐ์ ์ผ๋ก ์์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ด๋ถ์ ๋ณด๊ณ ์์ ๊ฐ๊น์ต๋๋ค. ์์ผ๋ก๋ ์ด์ ๊ฐ์ ๊ธฐ์ฌ๋ฅผ ๋ ๋ง์ด ์ถํํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ง์ ํ์ผ์ ๋์ดํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๋ชจ๋ ๊ฒ์ ์ฌ์ฉ์์ ๊ธฐ์ ์ง์ ์ง๋ฌธ์ผ๋ก ์์๋์์ต๋๋ค. ๊ทธ๋ ์คํ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ณด๊ณ ํ๋ค. ls
15๊ฐ๊ฐ ๋๋ ํญ๋ชฉ์ด ์๋ ๋๋ ํ ๋ฆฌ์์ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆฝ๋๋ค. $SCRATCH
[์์ ํ์ผ์ฉ ๋๋ ํ ๋ฆฌ - ์ฝ. ๋ ์ธ].
ํ ๋๋ ํฐ๋ฆฌ์ ์์ฒ ๊ฐ์ ํ์ผ์ด ์์ผ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํ์ผ ์์คํ
์ ๋ถ๋ด์ ์ฃผ๋ฏ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค. ์ฌ์ฉ์๋ ์ด๋ฅผ ์๊ณ ์ข์ง ์๋ค๊ณ ์ธ์ ํ๋ฉด์๋ ์์ ์ ๋
ธํธ๋ถ์์ ์
๋ก๋ณด๋ค ๋ชฉ๋ก์ด 1000๋ฐฐ ๋ ๋น ๋ฅด๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์์ฒ๋ฅผ ์
ํ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ ๊น์ด ์ดํด๋ณด์์ต๋๋ค.
์๋๋ฉด ls๋ ๋ฉ์์ด ๋ณด์ด๊ฑฐ๋ ์
์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋ฌด์์ ํ๋์ง ์ดํด๋ณด์์ต๋๋ค. ls
๋๋ ํ ๋ฆฌ๋ฅผ ๋์ดํ ๋ ํ๋ก์ธ์ค๊ฐ ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋์ง. ๋๋ถ๋ถ์ ์ต์ ๋ฐฐํฌํ์์ ls
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์คํ๋ฉ๋๋ค. ls --color=auto
, ๋ชจ๋๊ฐ ์์์ ์ข์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ์ง๋ง ์๋ฆ๋ค์ด ์์์๋ ๋๊ฐ๊ฐ ๋ฐ๋ฆ
๋๋ค. ๋ชจ๋ ํ์ผ์๋ ๋๊ฐ๊ฐ ๋ฐ๋ฆ
๋๋ค. ls
์ ์ ํ ์์์ ์ ํํ๋ ค๋ฉด ํ์ผ ์ ํ, ๊ถํ, ํ๋๊ทธ, ํ์ฅ ์์ฑ ๋ฑ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ด์ผ ํฉ๋๋ค.
๋ฌธ์ ์ ๋ํ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ค ํ๋๋ ls์์ ์์์ ์์ ํ ๋นํ์ฑํํ๋ ๊ฒ์ด์ง๋ง ์ฌ์ฉ์์ ๋ถ๋ ธ๋ฅผ ์์ํด๋ณด์ญ์์ค. ์ด๋ ํ ๊ฒฝ์ฐ์๋ ์ปฌ๋ฌ ์ถ๋ ฅ์ ์ ๊ฑฐํด์๋ ์ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ดด๋ฌผ์ด ์๋๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ ๊น์ด ์ดํด๋ณด์์ต๋๋ค. ls
ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ ์์ ํญ๋ชฉ LS_COLORS
, ์ด๋ ์ค์ ๋จ dircolors(1)
๊ตฌ์ฑ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก dir_colors(5)
. ๋ค,
์ข ๋ ์์ธํ ์ดํด๋ณด์
์ด๋ค ์ ๊ตฌ์ฑํ๊ฐ ์๋ ์ ํ๋ฅผ ์ผ์ผํค๋์ง ํ์ธํ๊ธฐ ์ํด ์คํ ํ๊ฒฝ์ ๋ง๋ค์์ต๋๋ค.
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
real 0m12.758s
user 0m0.104s
sys 0m0.699s
12,7๊ฐ ํ์ผ์ ๊ฒฝ์ฐ 10์ด๋ก ๊ทธ๋ฆฌ ์ข์ง ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๊น๋ฐ์ด ํ์ํด์
--color=always
: ๋น๋ก ๊ทธ๊ฐ ๋์์ฐ์ง๋งls --color=auto
ํ์ง๋งls
ํฐ๋ฏธ๋์ ์ฐ๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ(์: ํ์ดํ ๋๋ ์ถ๋ ฅ ๋ฆฌ๋๋ ์ ์ ํตํด)๋ฅผ ๊ฐ์งํ๊ณ ๋ค์์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ์์ ์ง์ ์ ๋นํ์ฑํํฉ๋๋ค.auto
. ์๋ฆฌํ ์ฌ๋.
๊ทธ๋ผ ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋์? ์ฐ๋ฆฌ๋ ํจ๊ป ๋ณด์๋ค strace
:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
44.21 0.186617 19 10000 lstat
42.60 0.179807 18 10000 10000 getxattr
12.19 0.051438 5 10000 capget
0.71 0.003002 38 80 getdents
0.07 0.000305 10 30 mmap
0.05 0.000217 12 18 mprotect
0.03 0.000135 14 10 read
0.03 0.000123 11 11 open
0.02 0.000082 6 14 close
[...]
์์ฐ: 10 ํตํ lstat()
, 10 ํตํ getxattr()
(์ฐ๋ฆฌ ํ๊ฒฝ์ ls๊ฐ ์ฐพ๊ณ ์๋ ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์คํจ), 10๋ฒ์ ํธ์ถ capget()
.
ํ์คํ ์ด๊ฒ์ ์ต์ ํ๋ ์ ์์ต๋๋ค.
๊ธฐ๋ฅ ์์ฑ? ์๋์
์กฐ์ธ์ ๋ฐ๋ฅด๋ค
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
98.95 0.423443 42 10000 lstat
0.78 0.003353 42 80 getdents
0.04 0.000188 10 18 mprotect
0.04 0.000181 6 30 mmap
0.02 0.000085 9 10 read
0.02 0.000084 28 3 mremap
0.02 0.000077 7 11 open
0.02 0.000066 5 14 close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.427920 10221 6 total
real 0m8.160s
user 0m0.115s
sys 0m0.961s
์, ๊ฐ์ ์ต๋ 8์ด! ์ฐ๋ฆฌ๋ ๊ทธ ๋น์ผ ์ ํ๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ์ต๋๋ค getxattr()
, ๊ทธ๋ฆฌ๊ณ ๋์ capget()
๊ทธ๊ฒ๋ ์ฌ๋ผ์ก์ด์, ์ข์์.
๊ทธ๋ฐ๋ฐ ์์ง๋ ์ด๋ฐ ๊ท์ฐฎ์ ์ ํ๊ฐ ์์ lstat()
, ํ์ง๋งโฆ
์ผ๋ง๋ ๋ง์ ๊ฝ์ด ํ์ํฉ๋๊น?
๊ทธ๋์ ์ข ๋ ์์ธํ ์ดํด๋ณด์์ต๋๋ค LS_COLORS
.
๋จผ์ ์ด ๋ณ์๋ฅผ ๋นํ์ฑํํ์ต๋๋ค.
$ echo $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:su=37;41:sg=30;43:ca=: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=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: $ unset LS_COLORS $ echo $LS_COLORS $ time ls --color=always $SCRATCH/dont | wc -l 10000 real 0m13.037s user 0m0.077s sys 0m1.092s
๋ฌด์!?! ์์ง 13์ด?
ํ๊ฒฝ ๋ณ์๊ฐ LS_COLORS
ํด๋น ์์ ์ค ํ๋๋ง ์ ์๋์ง ์์๊ฑฐ๋ ๋๋ฝ๋์์ต๋๋ค. <type>=color:
, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฌ์ ํ ์์์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ํน์ ํ์ผ ํ์์ ๋ํ ์์ํ๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฌ์ ์ํด์ผ ํฉ๋๋ค. <type>=:
๋๋ <type> 00
ํ์ผ์ DIR_COLORS
.
๋ง์ ์ํ์ฐฉ์ค ๋์ ๊ฒ์ ๋ฒ์๋ฅผ ๋ค์์ผ๋ก ์ขํ์ต๋๋ค.
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
์ด๋ ๋ค์๊ณผ ๊ฐ์ด ์ฐ์ฌ ์์ต๋๋ค.
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
์ด๋ ์์ฑ๋ณ๋ก ํ์ผ ์์์ ์ง์ ํ์ง ์์์ ์๋ฏธํฉ๋๋ค.
, ์ด๋ ์ชฝ๋ ์๋๊ณ
์ฐ๋ฆฌ๋ ์๋๋ฅผ ๋์ธ๋ค ls
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํ์ธ ์ค ํ๋๋ ์ํํ์ง ์์ผ๋ฉด ์ ํ๋ฅผ ๊ฒ๋๋ค. lstat()
์ฌ๋ผ์ง๊ณ ์ด์ ๋ ์์ ํ ๋ค๋ฅธ ๋ฌธ์ ์
๋๋ค.
$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
63.02 0.002865 36 80 getdents
8.10 0.000368 12 30 mmap
5.72 0.000260 14 18 mprotect
3.72 0.000169 15 11 open
2.79 0.000127 13 10 read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.004546 221 6 total
real 0m0.337s
user 0m0.032s
sys 0m0.029s
0,3๊ฐ์ ํ์ผ ๋ชฉ๋ก ์ค 10์ด, ํ๋์ ๊ธฐ๋ก์ ๋๋ค.
์ ๋ก ์ค์ ํ๊ธฐ
๊ธฐ๋ณธ ์ค์ ์ ๊ฒฝ์ฐ 13์ด์์ ์ฝ๊ฐ์ ์กฐ์ ์ ํตํด 0,3์ด๊น์ง LS_COLORS
๋ถ์ฌ๋ก ์ธํด 40๋ฐฐ ๊ฐ์์ ์๋ฏธํฉ๋๋ค. setuid
/ setgid
๊ทธ๋ฆฌ๊ณ ์ปฌ๋ฌ ์คํ ํ์ผ. ๊ทธ๋ฆฌ ํฐ ์์ค์ ์๋๋๋ค.
๋ฌผ๋ก ์ด๊ฒ์ ์ด์ ๊ฐ ์ฌ์ฉ์์ ๋ํด Sherlock์์ ๊ตฌ์ฑ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์์์ ๋๋๋ฆฌ๋ ค๋ฉด ๊ฐ๋จํ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค.
$ unset LS_COLORS
ํ์ง๋ง ํ์ผ์ด ๋ง์ ๋๋ ํ ๋ฆฌ์์๋ ์คํ ์ค์ ์ปคํผ๋ฅผ ๋์ฌ์ผ ํฉ๋๋ค. ls
.
์ถ์ฒ : habr.com