source code 추적 방법 - 왜less 명령이 바이너리 파일을 읽을 수 있습니까 -

3279 단어 Linux

왜 less 명령이 바이너리 파일을 읽을 수 있습니까


rpm 파일을 less 명령으로 열면 발표 노트를 읽을 수 있습니다.

왜 리스로 열어? 2진 파일인 rpm로 읽어야지.
소스가 빠른 것 같아서 조사하면서 했어요.
얻기 어려운 기회인 만큼 설치된 패키지를 읽기 위한 소스 코드를 정리하기로 했다.

명령 실행의 전체 경로 확인

[root@tkd003 tmp]# which less
/usr/bin/less
less 지령의 실제 상황은
/usr/bin/less
알고 있습니다.

rpm 파일 이름 확인


어느 rpm 파일에 설치되었는지 확인하십시오
[root@tkd003 tmp]# rpm -qf /usr/bin/less
less-458-9.el7.x86_64
less-458-9.el7.x86_64개의 파일인 것 같습니다.
이 이름을 바탕으로 보냅니다.

rpm 파일 다운로드


알았어. 다운받을 수 있는 거.

출처도 있지만 이번엔 비니어 파일을 꼭 다운로드해야 해요
[root@tkd003 less]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/less-458-9.el7.x86_64.rpm
--2018-02-14 14:09:32--  http://mirror.centos.org/centos/7/os/x86_64/Packages/less-458-9.el7.x86_64.rpm
mirror.centos.org (mirror.centos.org) をDNSに問いあわせています... 111.90.139.14
mirror.centos.org (mirror.centos.org)|111.90.139.14|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 122672 (120K) [application/x-rpm]
`less-458-9.el7.x86_64.rpm' に保存中

100%[===========================================================================================>] 122,672      516KB/s 時間 0.2s   

2018-02-14 14:09:37 (516 KB/s) - `less-458-9.el7.x86_64.rpm' へ保存完了 [122672/122672]

[root@tkd003 less]# 

rpm 파일 동결해제

[root@tkd003 less]# rpm2cpio less-458-9.el7.x86_64.rpm | cpio -idv
./etc/profile.d/less.csh
./etc/profile.d/less.sh
./usr/bin/less
./usr/bin/lessecho
./usr/bin/lesskey
./usr/bin/lesspipe.sh
./usr/share/doc/less-458
./usr/share/doc/less-458/LICENSE
./usr/share/man/man1/less.1.gz
./usr/share/man/man1/lessecho.1.gz
./usr/share/man/man1/lesskey.1.gz
424 blocks
[root@tkd003 less]# 

grep로 맞히기.

[root@tkd003 less]# grep rpm -r *
バイナリファイル less-458-9.el7.x86_64.rpm に一致しました
usr/bin/lesspipe.sh:*.rpm) rpm -qpivl --changelog -- "$1" ;;
[root@tkd003 less]# 
usr/bin/lesspipe.sh에 뭐라고 쓰여있는 것 같은데.
소스를 읽어보고.
less 명령을 통해 rpm, tar, zip을 열면 다른 명령으로 바꿀 수 있습니다.
less -N usr/bin/lesspipe.sh

     49 *.tar) tar tvvf "$1" ;;
     50 *.tgz|*.tar.gz|*.tar.[zZ]) tar tzvvf "$1" ;;
     51 *.tar.xz) tar Jtvvf "$1" ;;
     52 *.xz|*.lzma) xz -dc -- "$1" ;;
     53 *.tar.bz2|*.tbz2) bzip2 -dc -- "$1" | tar tvvf - ;;
     54 *.[zZ]|*.gz) gzip -dc -- "$1" ;;
     55 *.bz2) bzip2 -dc -- "$1" ;;
     56 *.zip|*.jar|*.nbm) zipinfo -- "$1" ;;
     57 *.rpm) rpm -qpivl --changelog -- "$1" ;;
     58 *.cpi|*.cpio) cpio -itv < "$1" ;;
     59 *.gpg) gpg -d "$1" ;;
     60 *.gif|*.jpeg|*.jpg|*.pcd|*.png|*.tga|*.tiff|*.tif)
즉,less로rpm를 열면 실제로는
rpm -qpivl --changelog -- less-458-9.el7.x86_64.rpm 
집행하다.그러니까
바이너리를 열 때less 명령은 각각 대응하는 명령으로 대체되며, 결과는 바이너리 파일을 읽을 수 있습니다.

좋은 웹페이지 즐겨찾기