한빛미디어에서 나온 유닉스 리눅스 프로그래밍 필수 유틸리티라는 책은 제가 리뷰용으로 받은 아이템 중에서 가장 인상이 깊었고 충격을 받은 물건입니다.

일단 795페이지에 달하는 책의 페이지 수도 방대하지만 지금까지 읽어본 개발서와는 전혀 다른 느낌을 받았기 때문입니다. 임베디드 개발자인 저는 개발에 관련된 책들이나 관련 분야에 대한 해설서, 통계 자료, 소개서, 동향 자료, 브로셔, 사용설명서, 사용자 가이드, 데이터 시트 등의 문서를 많이 봅니다만 그 퀄리티가 천차만별입니다. 다른 건 다 제외 하더라도 개발 관련 책을 보더라도 내용이 붕 떠 있거나, 튜토리얼보다 못한 수준이거나, 뭔가 중요한 내용이 핀트가 틀려 있어서 사람을 혼동하게 하거나, 구성이 엉망이거나, 이건 꼭 알아야 한다고 생각되는 내용인데도 빠져 있는 경우가 많습니다.

예를 들어 작년에 구입했던 리눅스 커널 구조와 원리라는 책을 언급해보기로 하죠. 


위의 링크에서 소개글을 보실 수 있습니다. 하지만 이 책을 펼쳐서 읽어보면 정말 이해가 하나도 안될 정도입니다. 제가 커널을 한번도 들여다 본적이 없긴 하지만 당연히 잘 아는 사람이 재확인 하려고 사기보다는 그 구조와 원리를 알고 이해해서 써먹어보려고 사는게 당연하겠지요. 하지만 그런 입문자가 읽고 이해할 수 있는 배려가 하나도 되어 있지를 않습니다. 당연히 입문자니까 간단한 책을 봐야지 왜 이런 책을 사보냐고 하시면 곤란합니다. 이쪽 개발 일을 하다 보면 사실 물질적으로 형성되어서 손이 잡히는 게 하드웨어고, 코드로 되어 있는 게 소프트웨어 일뿐 쓰다 보면 그 기본적인 인터페이스나 원리는 유사한 경우가 많습니다. 다 개발자가 자기 쓰려고 만들다보니 기본적인 부분은 비슷할 수 밖에 없거든요. 그렇다면 개발에서 쓰이는 예를 들어가면서 설명하고 이게 어떤 식으로 중요하다는 언급을 하게 되면 쉽게 이해를 하게 되어 있습니다만 위에서 언급한 책은 그냥 소스코드를 보는 것보다 조금 나은 수준을 제공해 줍니다.

리뷰하고자 하는 책에 대한 링크를 걸겠습니다.


이 방대한 책을 설명할 엄두도 안나거니와 링크 아래쪽에 보시면 10개에 달하는 리뷰가 각 분야를 개발해본 사람들에 대한 입장에서 기술하고 있습니다. 따라서 저 리뷰를 읽어보시면 좀 더 자세한 느낌을 받으실 수 있을거라고 생각하고 이 리뷰에서는 저의 입장에서 느끼는 점들과 책에서 받은 느낌들을 이야기해보고 싶습니다.



1. 이 책은 개발자가 개발자를 위해서 쓴 배려 깊은 책입니다.

리뷰를 해서 칭찬을 하는게 아니라 이 책 자체가 정말 국내의 입문 개발자들을 위해서 쓴 책이라는걸 읽다보면 느낄 수 있습니다. 책 전반에 걸쳐서 이 툴이 어떤 식으로 쓰이고 툴이 어떤 환경에서 쓰이는지, 그리고 왜 쓰는지 어떻게 써야 하는지를 주로 짚고 있습니다.

VI 에디터라는 툴이 있습니다. 이 툴은 개발자라면, 그리고 코딩을 해야 할 일이 있는 사람이라면 기본적인 기능은 꼭 익혀두기를 권하고 있습니다. 개발자가 언제나 자기 작업 환경에서 코딩을 하면 좋겠지만 일을 언제나 리눅스 환경에서 일을 할 수 있는 것도 아니라서 윈도우에서 왔다 갔다 해야 하기도 하고, 멀리서 원격으로 일을 해야 하기도 하다보니 꼭 필요한 툴입니다. 제대로 못 쓰면 몸이 고생하겠지요. 이런 툴에 대해서 처음 개발하는 사람이 알려면 어떻게 해야 할까요? 대부분은 네이버 블로그나 구글링해서 쓰는 법에 대해서 참조를 하겠지요? 하지만 대부분의 문서들은 영문 설명서를 번역해놓은 수준일 뿐 어떤 경우에 어떻게 쓰라고 손에 잡히듯이 설명을 해주지는 않습니다. 어차피 취미로 하는 블로그 생활이고 수준 높은 개발자가 블로그를 그렇게 운영할리가 없는 이상 다 고만고만한 수준이죠. 그래서 명령어 몇개 찾아보고, 명령어표 인쇄해서 벽에 붙여놓고 봅니다만.. 네.. 저두 종이 몇변이나 잊어먹고 아는건 VI 여는 것. VI에서 편집 시작하는 것. 저장하는 것. 강제 종료밖에 못했습니다. 복사야 찾아보면 어찌 저찌 한다지만 쏙쏙 편리한 기능을 익하는건 참으로 난해한 일이지요. 하지만 이 책은 예를 들어가면서 설명을 잘 하고 있습니다. 그리고 다른 책과 차별되는 점이 예 자체가 실제로 개발에 쓰일만한 일들을 가지고 친절하게 예를 들고 있습니다. 사용자는 조금 인내심을 가지고 따라해보면 되고, 실제로 개발에 가까운 걸 바로 쓸 수 있게 가르쳐 주기 때문에 이걸 내가 왜 하고 있나, 이거 정말 쓸만한건가 하는 의구심을 지울 수 있습니다. 그리고 참 다행인것은 쓸만한걸 일하는 것처럼 연습 하고 있기 때문에 옆 자리 동료가 바라볼때 저 사람이 일은 안하고 책만 들여다보는 그런 게 아니라 뭔가를 하고 있는 것 같군이라고 인식 시켜준다는 점이 큽니다.

2. 구성 자체가 개발에 바로 쓸 수 있는 툴을 순서대로 쓸 수 있도록 가르쳐 주고 있습니다.

개발자가 개발에 필요한 일을 할 때 학교 다닐때나 강좌 배울 때처럼 하나하나 과목별로 찾아가면서 배울 수가 없습니다. 맨날 납땜만 하던 사람이 만져본거라고는 매트랩, pspice, 어셈블리, PIC, 8051용 C 정도나 만져봤으면 다행인데 갑자기 리눅스에서 BSP(Board support package)로 나온 부트로더와 커널, 드라이버, 응용 프로그램을 개발 환경을 옮겨서 코드를 수정하고 잘 돌아갈 수 있도록 컴파일 하고, 퓨징하고, 옵션 수정해가면서 개발하기란 참 어려운 일입니다. 상위와는 또 다른 일이지요. 막상 하라고 해서 페도라 깔고 나면 덩그라니 떠 있는 X 윈도우 환경을 보면 한숨밖에 안나옵니다. 소스 코드 풀어서 안에 봐야 뭔지도 모르겠고, 영문 메뉴얼은 천몇백 페이지인데 이거 뭐 어떻게 하라는지 답도 안나오죠. 하지만 이 책을 보고 한번 따라해보고 이해를 해보면 제조사에서 보내준 가이드대로 하다가 막혀서 안될때는 참으로 답답하고 한숨만 나오고 뭘 어떻게 해야 할지 답이 안섭니다. 하지만 이 책은 에디팅과 컴파일, 링킹. 디버깅에 대한 내용을 확실하게 시스템적 하위 레벨에서 개념을 머리에 심어줍니다. 그리고 여러가지 기술을 가르쳐주지요.

3. 저자가 하위 레벨에 대해서 잘 이해하고 있고 그걸 바탕으로 책을 썼습니다.

저자는 RTOS와 컴파일러, 디비거를 개발한 적이 있고 그 경험을 바탕으로 책을 썼습니다. 굳이 그 사실을 언급하지 않더라도 책을 읽다보면 노련함이 책 전반적으로 배어 나옵니다. 코딩이 되었던 개발이 되었든간에 도구 없이는 개발할 수가 없습니다. 그리고 이 책은 그 도구의 사용법에 대해서 훌륭하게 가르쳐 주고 있습니다. 하위 내용에 대해서 필요가 없는 사람들은 이 책의 내용중에서 일부는 필요가 없을지도 모릅니다. 하지만 사실 저에게 있어서는 그 시스템의 기본 원리를 꿰뚫어 설명해주는 내용이 더 반가웠습니다. 한달동안 틈나는 사이마다 따라해보려고 했지만 개발일이 지금도 발목잡고 있기에 틈틈히 펼쳐서 중간중간 구경하기를 더 많이 하고 진도는 많이 못 나간 상태입니다. 하지만 앞으로 계속 펼쳐보고 싶다는 마음이 절로 드는 책입니다. 이 한권 마스터하면 중급 개발자로서의 확신이 들 것 같달까요?

4. 구성이 잘 되어 있습니다.

편집은 한빛미디어의 실력이겠지만 폰트도 좋고, 종이질도 좋고 줄 간격도 좋습니다. 적재 적소에 그림이 잘 배치되어 있고 이해하기 쉬워요. 안의 편집도 이쁘게 잘 되어 있습니다. 이런 작은 요소들은 종종 무시되는 경우가 많습니다. 최근들어 계속 좋아지고 있습니다만 그래도 이책은 제법 잘 나와 있습니다. 또한 내부에 글의 흐름이 읽기 편하고 기억하기 좋게 되어 있습니다. 많이 가르쳐보신 솜씨가 팍팍 느껴져요.



이 책의 가장 큰 미덕은 술술 읽혀 내려간다는 점에 있다고 생각합니다. 그리고 머릿속에도 잘 들어오고 해본다는 재미도 쏠쏠하다는 점이 크네요. 이것 이상의 개발서의 미덕이 있을까요? ㅎㅎ





'업무 > Linux' 카테고리의 다른 글

vsftpd 설정하기  (0) 2008.08.22
Fedora Core 6에서 고정 IP 잡기  (2) 2008.07.10
Linux 설정 두번째  (0) 2008.07.10
Linux IP 설정 파일들  (0) 2008.07.08
Linux에서 path 잡는다고 삽질했습니다.  (0) 2008.05.19

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,

vsftpd 설정하기

업무/Linux 2008. 8. 22. 18:01
ftp 서버로 오랫동안 지켜오던 Proftpd의 자리를 누군가 빼앗으려 한다. 그 분은 proftpd의 문제점을 모두 보완하고, 속도, 성능, 보안을 향상시켜 더욱 강력하게 만들어 졌다. 그분이 바로 금번 리뷰에서 소개할 vsftpd 이다. 이름에서부터 알 수 있듯 Very Secure FTP 서버이다. 이 프로그램은 배포사이트에서 최상급 형용사(most, fastest)를 사용하여 자랑할 만큼 자신 있게 말하는 부분이 속도와 보안성이다. 

   Probably the most secure and fastest FTP server for UNIX-like systems.

 최신버전인 2.0.3으로 업그래이드 되면서 많은 버그들이 고쳐졌으며, 특히 SSL 쪽 버그를 많이 고쳤다고 한다. 금번 리뷰에서는 vsftpd를 설치해서 운영하면서 장, 단점을 살펴보도록 하겠다.

  먼저 공식 웹사이트에서 소스를 다운로드 받는다.

  vsftpd-2.0.3.tar.gz 파일의 용량은 겨우 150K에 불과하다. 압축을 풀고, 모든 프로그램의 설치과정에 있었던 컴파일 환경설정과정인 configure 과정은 vsftpd는 없다. 바로 컴파일 한 다음 , 설치하면 된다.


tar xvfz vsftpd-2.0.3.tar.gz

cd vsftpd-2.0.3

make && make install


  컴파일을 성공적으로 마쳤다면, 설치가 될 것이다. 설치된 파일을 찾아보면 겨우 /usr/local/sbin/vsftpd 라는 것을 알 수 있다.


  그런 다음 설정파일 샘플을 복사한다. 아래는 install 명령어를 사용하여 소스디렉토리의 vsftpd.conf 파일을 /etc/vsftpd.conf 파일으로 복사하며, 퍼미션을 600으로 변경한다.

install -m 600 vsftpd.conf /etc/vsftpd.conf


  FTP서버를 xinetd모드로 운영하기 위해 xinetd.d/vsftpd 파일을 /etc/xinetd.d/vsftpd 으로 복사하며, 퍼미션을 600으로 변경한다.

install -m 600 xinetd.d/vsftpd /etc/xinetd.d/vsftpd


  마지막으로 pam인증을 하기위해 pam 설정파일을 복사해 준다. 이 파일을 복사해 주지 않으면, 접속은 되지만, 정확한 id와 비밀번호를 넣었음에도 로그인 실패라고 나오며, 별도 로그는 남지 않음에 주의하기 바란다.

cp RedHat/vsftpd.pam  /etc/pam.d/vsftpd


  이렇게 설치를 했다면, 이제 설정파일(/etc/vsftpd.conf)을 수정해야 한다. vsftpd의 운영방법은 크게 standalone으로 독자적인 데몬을 이용하여 서버를 운영하는 방법과, xinetd의 도움을 받아 운용하는 방법이 있다. FTP서버가 파일서버용도가 아니라면, 꼭 떠있을 필요는 없기에 xinetd모드로 설정하겠다. 하지만, 꼭 standalone모드로 돌려야 한다면, 간단하게 /etc/vsftpd.conf 파일에서 listen=YES 으로 하고, xinetd에 등록된 vsftp를 ntsysv등의 유틸리티로 내려주고 xinetd를 재 시작해주고, /usr/local/sbin/vsftpd & 이렇게 데몬을 띄워주면 운영가능하다. 이제 xinetd모드로 설정하는 법을 알아 보도록 하자.

  먼저 xinetd설정파일(/etc/xinetd.d/vsftpd)을 확인한다.

위 설정파일은 위 설치과정에서 소스파일 디렉토리에서 복사한 파일이다. 보다 자세한 설정을 하길 원한다면, xinetd 매뉴얼을 참고하길 바란다.

  ntsysv 명령으로 서버 시작시 자동 시작하게 설정한다.


이렇게 설정하고, xinetd를 재 시작한다.


이렇게 하면, 21번 포트로 접속을 받아들일 준비가 된다. 마지막으로 설정파일을 수정하여 일반적인 ftp 서버에 맞게 맞추어 보겠다.

위 설정파일은 기본적으로 ftp 서버를 운영하기 위한 설정이다.


  무명접속을 허용하지 않으며(anonymous_enable=NO), 서버의계정 접속을 허용하며(local_enable=YES), 디렉토리에 접근시 메시지를 보여주며(dirmessage_enable=YES), xferlog를 /var/log/vsftpd.log에 기록하며(xferlog_enable=YES, xferlog_file=/var/log/vsftpd.log), 기본적으로 모든 사용자 접속을 허용하며(userlist_enable=NO), pam인증에 사용될 서비스파일은 vsftpd라는 파일이라고 지정(pam_service_name=vsftpd)하였다. 이젠 접속해 보도록 하겠다.

지금까지 ftp 서버를 설치과정과, 기본적으로 운영할 수 있게 설정하는 과정에 대해서 알아 봤다. 이제 어떤점이 좋은지 알아 보도록 하겠다.


  설치과정에서 보았듯이 실행파일의 용량이 작다. 다음은 proftpd 1.2.10버전과 비교한 자료이다.

proftpd는 408KByte이며, vsftpd는 88KByte이다. 약 1/5배이다.


  설정파일이 간단하며 직관적이다.

항  목

Proftpd

vsftpd

standalone운용

ServerType  standalone

listen=YES

무명접속허용

<Anonymous  > ~~~~ </Anonymous>

anonymous_enable=NO

전송속도제한

TransferRate APPE,RETR,STOR,STOU 100.0:152428800

anon_max_rate=100

chroot home directory

DefaultRoot  ~

chroot_local_user=YES


위 표는 proftpd와 vsftpd 설정파일의 일부이다. vsftpd의 설정파일이 보다 직관적이며, 쉽게 설정할 수 있음을 알 수 있다.


  기본적으로 ascii 모드로 파일 전송을 막을 수 있다. 이 설정은 아주 유용하게 사용된다. PC에서 ftp 클라이언트로 알ftp, wsftp 등 ftp 전용 클라이언트를 사용하지 않고, 인터넷익스플러로를 사용한다면, 서버에 텍스트파일을 올리고 받으면 파일의 마지막 "CRLF"문자가 "LF"로 변하여 올라간다. 그 파일을 다시 PC로 받았을때 곤란한 경우가 생긴다. 근본적으로 ascii 모드의 사용을 차단하므로 이런 경우를 막을 수 있다. 나는 보안, 빠른 속도, 안정성 보다는 이면이 마음에 들어 vsftpd를 처음 사용하게 되었다. 설정항목은 다음과 같다.

ascii_download_enable = NO
ascii_upload_enable = NO


  SSL 을 사용한 보안 통신이 가능하다. 이는 ftp 취약점인 스누핑이나 스푸핑에 id와 password같은 중요정보가 노출된다는 점이 보완되며, 중요한 데이터를 보호 할 수 있다. 그렇지만, 아직 일반화 되지않았기 때문에 ftp서버는 SSL을 사용하지 않는 일반적인 형태로 운영해야 할 것 같다.

 

  vsftpd는 보안뿐만 아니리 뛰어난 성능을 자랑한다.

  위 그래프는 대형 사이트에서 1600접속 까지 지속적이며, 안정적이게 운영된다는 것을 강조하기위해배포 사이트에 올라온 그래프이다. 한 서버에서 저렇게 많은 접속자를 처리한다는 것은, 안정성, 성능을 신뢰 할 수 있을 듯 하다.


 다음은 이 vsftpd를 사용하는 커다란 ftp 사이트들이다.

ftp.redhat.com, ftp.suse.com, ftp.debian.org, ftp.openbsd.org, ftp.freebsd.org, ftp.gnu.org, ftp.gnome.org, ftp.kde.org, ftp.kernel.org, rpmfind.net, ftp.linux.org.uk, ftp.gimp.org, ftp-stud.fht-esslingen.de, gd.tuwien.ac.at, ftp.sunet.se, ftp.ximian.com, ftp.engardelinux.org, ftp.sunsite.org.uk, ftp.isc.org...


 vsftpd는 GPL라이센스를 따르는 아주 훌륭한 FTP서버이다. 단지 아쉬운 점은 가볍게 만들기 위해  mysql과의 연동과 같은 유용한 기능들이 빠져있다. 그만큼 성능이 우수하니 대 만족이다.


참고사이트 : vsftpd.beasts.org

참고서적 : 리눅스 서버관리 실무 바이블 ( 수퍼유저코리아, 박성수)

test OS : Fedora Core 2 (Kernel 2.6.10)

작성자 수퍼유저코리아 정우영 (doly@superuser.co.kr)

저작권 : 본 문서는 파일형식(pdf)을 바꾸지 않는 한 자유롭게 배포 가능합니다


WRITTEN BY
가별이
내가 천사의 말 한다 해도

,
페도라 코어 6에서 고정 아이피를 잡아줘야 하는데  ifcfg-eth0의 설정을 잡아주고 나서 핑은 되지만 파이어폭스가 동작을 안하더군요.

엄청 고민을 하고 있었는데 결론은 DNS서버 아이피를 잡아주지 않았던 것이 문제였어요.

시스템 -> 관리 -> 네트워크의 DNS탭에서 DNS의 주소를 디폴트 게이트웨이 즉 라우터(공유기)의 주소로 잡아주니까 되네요.

먼가 하나 해결되니 기분이 좋군요.

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,

1. 서비스 확인

# ps -aux | grep ftp

root    2485    0.0    0.1    4304    480    ?    Ss    10:02    0:00    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

와 같이 ftp 서비스가 실행되고 있어야 합니다.


2. ftp 접근 권한 확인

/etc/hosts.deny와 /etc/hosts.allow에서 알맞게 설정해 주세요.


/etc/hosts.deny의 ALL:ALL을 제거 하거나

/etc/hosts.allow에서 in.ftpd : IP 또는 vsftpd: IP를 적어주거나 둘중에 하나를 하면 됩니다.

참고로 저는

/etc/hosts.deny의 ALL:ALL을 #(주석)처리 했습니다


3. 서비스 재시작(/etc/rc.d/init.d/xinetd restart 명령은 안됨)

# /etc/rc.d/init.d/vsftpd restart


참고사항

1. ftp login 시 root 접근 제한

/etc/vsftpd/ftpusers 의 접근 제한 목록에 root가 포함되어 있으면  root로 login이 안됨

보안상의 이유로 root의 접속을 막아 놓는게 좋음


2. /etc/vsftpd/vsftpd.conf 의 주요 설정
# anonymous 사용자의 접속 허용 여부 (default = YES)
# 공개된 형태의 FTP 서버로 운영할 것이 아니라면 NO로 한다.
anonymous_enable=NO
# 로컬 계정 사용자의 접속 허용 여부 (default = NO)
local_enable=YES

# write 명령어 허용 여부 (defualt = NO)
write_enable=YES
# 로컬 계정 사용자용 umask (default = 077)
local_umask=022

# anonymous 사용자가 파일을 업로드 할 수 있는지 여부 (default = NO)
# anon_upload_enable=YES
# anonymous 사용자의 디렉토리 생성 허용 여부 (default = NO)
# anon_mkdir_write_enable=YES

# 파일 전송 로그를 남길 것인지 여부 (default = YES)
xferlog_enable=YES
# xferlog 표준 포맷으로 로그를 남길지 여부 (기본 설정파일은 YES)
# 아래에서 NO로 설정했을 때를 설명함
xferlog_std_format=YES
# 파일 전송 로그 파일명
xferlog_file=/var/log/vsftpd.log

# FTP 서버 접속할 때 로긴 메시지 (default = vsFTPd 버전번호)
# 한글 사용 가능
ftpd_banner=Welcome to blah FTP service.

# 사용자의 홈디렉토리를 벗어나지 못하도록 제한하기 위한 설정 (default=NO)

# 제한이 필요할 경우 YES로 바꾼 후 제한할 사용자 ID를 chroot_list 에 지정한다.
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

# PAM 파일명을 지정 (설치할 때 /etc/pam.d/vsftpd명으로 복사함)
pam_service_name=vsftpd

# wtmp에 로그 남기기 (YES로 해야만 last 명령어로 접속 여부 확인 가능)
session_support=YES


Telnet 설정 및 root 계정 허용하기

①telnet 설치

telnet은 기본적으로 standalone 타입 데몬이 아닌 xinetd 타입 데몬(xinetd 데몬에 종속되는 것을 의미하며 xinetd 데몬이 죽으면 telnet 데몬도 같이 죽음)이다.


- 먼저 telnet이 설치되어 있는 있는지 확인, telnet-server가 설치되어 있지 않으면 /etc/xinetd.d/telnet 파일이 존재하지 않는다.

# rpm -qa telnet-server


- 쉘에 아무것도 나타나지 않으면 설치되지 않은 것, yum을 이용하여 설치

# yum -y install telnet-server


②telnet 설정

설정 파일: /etc/xinetd.d/telnet


- vi 에디터로 연 후 disable=yes를 disable=no로 바꾸어 주고 저장

# vi /etc/xinet.d/telnet

# service xinetd restart


③root 계정으로 telnet 접속 설정

설정 파일: /etc/securetty


[중요]: /etc/securetty 파일은 시스템 관리자가 시스템에 로그인할 수 있는 안전한 터미널에 대한 정보가 저장되어 있다. 보안을 위해서 일반적으로 가상콘솔이 설정되어 있다.  /etc/securetty 파일을 다른 이름을 바꾸거나 삭제하면 된다. console, vc/1 ~ 11, tty1 ~ 11이 적용 됨

# mv /etc/securetty /etc/securetty.old


환경: Redhat Linux 9.0, Fedora Core 4


FTP서버 vsftpd 설치와 운영 (한글로그 패치 포함)
글쓴이 :
좋은진호 (2003년 10월 09일 오전 02:54) 읽은수: 5,839 [ 네트워크 # 트랙백(0) 인쇄용 페이지 본문 email로 보내기 ]
네트워크 작성자 : 좋은진호(truefeel, http://coffeenix.net/)
작성일 : 2003.10.01(수)
수정일 : 2004.01.08(목), chroot_list_enable 글 추가

이 글은 7월에 썼던 'vsftpd에서 한글파일로그와 lastlog 로긴확인하기'를 기초로 작성하였다.

1. vsftpd FTP 서버에 대해

vsftpd는 UNIX 시스템에서 사용할 수 있는 free FTP 서버(라이센스는 GPL)이다.
vsftpd가 내세우고 있는 것은 보안, 성능, 안정성이다. 지금까지 vsftpd의 자체 보안 문제가 있어
보안권고가 나온 적은 없다.(Redhat의 rpm 패키지중에 tcp_wrappers 지원없이 만들어져서 업데이트
rpm은 나온 적 있음)

* 지원 및 테스트된 OS

- Linux (Redhat, SuSE, Debian)
- Solaris (버전에 따라 IPv6나 inet_aton함수때문에 설치가 잘 안될 수 있음)
- FreeBSD, OpenBSD
- HP-UX
- IRIX

* 주요 기능

- 가상 IP별 별도의 환경 설정 기능 (설정파일의 listen_address= 이용)
- 가상 사용자 설정
- 전송 대역폭 지정
- PAM 지원 (버전 1.2.0부터는 PAM을 통한 wtmp에 로긴 로그를 남김)
- xferlog 표준 로그 파일보다 상세한 자체 로그 파일 형식 지원
- Standalone 방식과 inetd(xinetd)를 통한 운영 모두 지원
- IP별 다른 환경 파일 지정 기능 (tcp_wrappers와 함께 사용할 때)
- ...

2. vsftpd 설치

※ 설치는 Redhat 기준. 솔라리스의 PAM에 대한 것은 README.solaris 파일 참조한다.

http://vsftpd.beasts.org/ 에서 최신버전(현재 1.2.0)의 소스를 받아온다.

-------------------------------------------------------------
# tar xvfz vsftpd-1.2.0.tar.gz
# cd vsftpd-1.2.0
-------------------------------------------------------------

한글로 된 파일명을 전송할 때 로그에 파일명이 ???? 로 남지 않도록
logging.c 파일을 연 후 140번째 줄의

str_replace_unprintable(p_str, '?');

를 다음처럼 주석 처리한다.

/* str_replace_unprintable(p_str, '?'); */

또한 tcp_wrappers를 통한 접속제어를 사용하려면 builddefs.h 에서

#undef VSF_BUILD_TCPWRAPPERS 를
#define VSF_BUILD_TCPWRAPPERS 로 바꾼다.

-------------------------------------------------------------
# make
# make install (vsftpd 데몬, man page, xinetd 용 설정 파일 설치)
# cp vsftpd.conf /etc (환경설정 파일 복사)
# chmod 600 /etc/vsftpd.conf
# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd (PAM 설정 파일 복사)
-------------------------------------------------------------

/etc/pam.d/vsftpd 첫번째 줄에 다음과 같이 있다.

pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

즉, /etc/ftpusers 파일에 존재하는 ID는 접속할 수 없게된다.(sense=deny)

-------------------------------------------------------------
# FTP 접속을 허용하지 않을 ID를 등록한다.
# /etc/passwd를 참조해서 설치할 서버의 환경에 맞게 등록
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
smmsp
xfs
gdm
mysql
-------------------------------------------------------------

3. vsftpd.conf 의 주요 설정

-------------------------------------------------------------
# anonymous 사용자의 접속 허용 여부 (default = YES)
# 공개된 형태의 FTP 서버로 운영할 것이 아니라면 NO로 한다.
anonymous_enable=NO
# 로컬 계정 사용자의 접속 허용 여부 (default = NO)
local_enable=YES

# write 명령어 허용 여부 (defualt = NO)
write_enable=YES
# 로컬 계정 사용자용 umask (default = 077)
local_umask=022

# anonymous 사용자가 파일을 업로드 할 수 있는지 여부 (default = NO)
# anon_upload_enable=YES
# anonymous 사용자의 디렉토리 생성 허용 여부 (default = NO)
# anon_mkdir_write_enable=YES

# 파일 전송 로그를 남길 것인지 여부 (default = YES)
xferlog_enable=YES
# xferlog 표준 포맷으로 로그를 남길지 여부 (기본 설정파일은 YES)
# 아래에서 NO로 설정했을 때를 설명함
xferlog_std_format=YES
# 파일 전송 로그 파일명
xferlog_file=/var/log/vsftpd.log

# FTP 서버 접속할 때 로긴 메시지 (default = vsFTPd 버전번호)
# 한글 사용 가능
# ftpd_banner=Welcome to blah FTP service.

# 사용자의 홈디렉토리를 벗어나지 못하도록 제한하기 위한 설정 (default=NO)
# 제한이 필요할 경우 YES로 바꾼 후 제한할 사용자 ID를 chroot_list_file= 에 설정한 파일에
# 지정한다.
# chroot_local_user= 설정과 관련이 있으니 '3. 문제 해결'을 꼭 읽어보라.
#
# chroot_list_enable=YES
# chroot_list_file=/etc/vsftpd.chroot_list

# -------------------------------------------------------------------
# 기본 설정 파일에는 없는 설정값으로 필요한 설정만 추가한다.
# ※ 중요한 설정은 굵은 글씨로 표시
# -------------------------------------------------------------------

# PAM 파일명을 지정 (설치할 때 /etc/pam.d/vsftpd명으로 복사함)
pam_service_name=vsftpd

# wtmp에 로그 남기기 (YES로 해야만 last 명령어로 접속 여부 확인 가능)
session_support=YES

# 사용자가 자신의 home directory를 벗어나지 못하도록 설정
chroot_local_user=YES

# 새로운 디렉토리에 들어갔을 때 뿌려줄 환경 메시지를 저장한 파일명
# message_file=.message

# xferlog 형식으로 log를 남기려면 (위에서 이미 YES로 했음)
# xferlog_std_format=NO
#
#  - xferlog 표준 포맷은 로긴, 디렉토리 생성등의 로그를 남기지 않음
#   그러나 vsftpd 스타일 로그는 이를 포함한 보다 상세한 로그를 남김
#  - vsftpd 스타일 로그 예
#
#  Sun Jul 12 01:38:32 2003 [pid 31200] CONNECT: Client "127.0.0.1"
#  Sun Jul 12 01:38:34 2003 [pid 31199] [truefeel] FAIL LOGIN: Client "127.0.0.1"
#  Sun Jul 12 01:38:38 2003 [pid 31199] [truefeel] OK LOGIN: Client "127.0.0.1"
#  Sun Jul 12 01:38:41 2003 [pid 31201] [truefeel] OK MKDIR: Client "127.0.0.1", "/mp3"
#  Sun Jul 12 01:39:06 2003 [pid 31201] [truefeel] OK UPLOAD: Client "127.0.0.1", "/델리
#  스파이스 5집 - [04]키치죠지의 검은 고양이.mp3", 6855473 bytes, 3857.39Kbyte/sec

# 전송속도 제한 (0은 제한없음, 단위는 초당 bytes)
anon_max_rate=0
local_max_rate=0
trans_chunk_size=0

# 최대 접속 설정 (단 xinetd를 통하지 않고 standalone으로 동작할 때만 사용 가능)
# standalone을 위해서는 listen=YES 추가하고 별도로 vsftpd를 띄워야 함
#
# max_clients=최대 접속자 수, max_per_ip=IP당 접속 수
# max_clients=100
# max_per_ip=3

# Standalone 으로 운영할 때 listen=YES. 포트 변경을 원할 경우 listen_port 설정
# 디폴트 포트는 21번 포트이다.
# listen=YES
# listen_port=21
-------------------------------------------------------------

필요한 설정이 끝났으면 xinetd를 재실행한다.

-------------------------------------------------------------
# /etc/rc.d/init.d/xinetd restart
-------------------------------------------------------------

4. 문제 해결

1) ftpwho 같은 명령은 있나?
  또한 last를 해도 접속된 걸 확인할 수가 없는데 방법이 없나?

 ftpwho 형태의 명령은 없으며 임시적으로 다음 명령어 등으로 확인할 수 있다.

 # ps -ef|grep vsftpd
 # fuser -v ftp/tcp

 vsftpd v1.2.0이상부터 PAM을 통해 wtmp에 로그를 남기므로 last로 접속여부를 확인할 수 있다.

2) 한글 파일명이 전송될 때는 vsftpd.log 에 ???? 로 남는다. 해결책은?

 vsftpd는 출력할 수 없다고 판단하는
 ASCII 코드 31 이하, 128~159, 177 문자를 모두 ? 로 바꿔서 저장을 한다.
 따라서 이 부분을 처리하지 않고 저장하도록 소스를 수정한 후 컴파일하면 해결된다.

3) 사용자가 홈디렉토리를 못 벗어나게 하고 싶는데?

/etc/vsftpd.conf에 다음을 추가하면, 모든 사용자는 자신의 홈디렉토리만 접근할 수 있다.

chroot_local_user=YES

또한 특정 사용자로만 제한을 하고 싶다면 다음과 같이 한다. /etc/vsftpd.chroot_list에는 제한할
사용자 ID를 한줄에 하나씩 나열하면 된다.

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

주의할 것은 chroot_local_user=YES와 chroot_list_enable=YES를 함께 사용할 경우에는
/etc/vsftpd.chroot_list에 포함된 사용자 ID만 제한없이 홈디렉토리를 벗어날 수 있다.
즉, 반대로 작용한다.

standalone으로 FTP서버가 동작중이면 재실행 필요. standalone에 대해서는 6)번에서.

4) root로 접속할 수는 없나?

 가능하면 root 접속은 허용하지 않기를 바란다.
 /etc/ftpusers 파일에서 root를 빼면 접속이 가능하다.

5) ID/비밀번호가 정확히 맞는데 로긴할 때 자꾸 530 Login incorrect. 라고 나온다.

 /etc/ftpusers (또는 vsftpd.ftpusers)에 등록된 사용자인지 확인한다.
 여기에 등록된 사용자는 로긴할 수 없다. 이럴 때 /var/log/messages에 다음과 같은 로그가 남는다.

 Aug 16 22:21:52 truefeel vsftpd: PAM-listfile: Refused user xxxxxxxx for service vsftpd

6) standalone으로 운영하고 싶다.
  (즉, apache나 sendmail처럼 xinetd 통하지 않고 운영을 원한다.)

 /etc/xinetd.d/vsftpd (vsftpd가 아닌 다른 파일명일 수 있음) 에서 disable = yes 로 변경하여
 xinetd로 서비스 하지 않도록 설정한다. xinetd 를 재실행하면 이제 xinetd를 통한 ftp 서비스는 종료된다.

 레드햇의 경우 /etc/rc.d/init.d/xinetd restart

 이제 vsftpd 데몬를 실행한다. (소스로 설치시 기본 경로는 /usr/local/sbin)

 # /usr/local/sbin/vsftpd &

7) 다른 포트(기본 21번)를 사용하고 싶다. (예를 들어 11121번 포트를 원할 때)

 * xinetd를 이용하는 경우

  /etc/service 에 'ftp2  11121/tcp' 한 줄을 추가한다.
  그리고 /etc/xinetd.d/vsftpd (vsftpd가 아닌 ftp와 같은 다른 파일명일 수 있음) 에서
  service ftp 를 service ftp2로 바꾸고, xinetd 를 재실행한다.

 * standalone으로 운영하는 경우

  /etc/vsftpd.conf 에서 listen_port=11121 을 추가하고 vsftpd 서버를 재실행한다.

 바뀐 포트로 운영중인지 확인은 netstat -atnp(리눅스) 또는 netstat -an(그 이외 유닉스)

8) 업로드 파일 크기를 제한하는 방법은 없나요? 이를테면 5MB이상의 파일은 업로드 못한다든지.

현재 1.2.1버전까지 vsftpd 자체에 설정하는 방법은 없습니다.

5. 참고할만한 문서

* vsftpd 1.2.0 설치 문서
 
ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-1.2.0/INSTALL
* vsftpd.conf man page
* vsftpd에서 한글파일로그와 lastlog 로긴확인하기 (좋은진호)
 
http://coffeenix.net/board_view.php?bd_code=4
* vsftpd에서 전송속도 제한 (bandwidth limit) (좋은진호)
 
http://coffeenix.net/board_view.php?bd_code=21
<  커널 컴파일 | SSH 다중 세션 종료 스크립트  >


1. /etc/xinetd.d/telnet 설정

# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no    <- yes를 no로 바꾼다.
}


2. 서비스 재시작

# /etc/init.d/xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]


1. 설치 확인
# rpm -qa | grep tftp

2. 설치
# yum install tftp
# yum install tftp-server

3. /etc/xinetd.d/tftp 설정
# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /tftpboot
        disable                 = no    <- yes를 no로 변경
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

-s /tftpboot 에서 -s 옵션은 다른 디렉토리로의 이동 금지 옵션
                           -c 옵션은 새로운 화일 생성 가능(default는 새로운 화일 생성 금지, 같은 이름의 화일이 있으면 upload 가능)

4. 서비스 재시작
# service xinetd restart

5. 동작 확인
# netstat -al | grep tftp
udp        0      0 *:tftp                      *:*

6. /tftpboot 디렉토리 확인
# cd /tftpboot
tftp 접속을 하면 /tftpboot 디렉토리가 홈디렉토리임


1.Default Gateway 설정 파일

파일 이름 : /etc/sysconfig/network

NETWORKING=yes
: 통신이 되도록 지원할 것인가의 여부(yes or no)

HOSTNAME=proneer.co.kr
: 서버의 호스트네임(Hostname)을 설정

GATEWAYDEV=eth0
: Default Gateway 장치명

GATEWAY=192.168.0.1
: 시스템 전체의 Default Gateway(각 interface에서 따로 gateway를 설정하면 그것이 우선)

FORWARD_IPV4=no
: 시스템이 라우터 역할을 할 것인지 여부, 패킷 포워딩을 수행할 경우는 yes 그렇지 않을 경우는 no 설정


2.Network Interface Card(NIC) 설정 파일

파일 이름 : /etc/sysconfig/network-scripts/ifcfg-ethx
: ifcfg-eth의 x는 0부터 시스템에 설치되어 있는 NIC 숫자 만큼 늘어난다.

DEVICE=eth0
: 네트워크 디바이스의 장치명, 리눅스는 ethx로 네트워크 디바이스 장치명이 정해져 있음

BOOTPROTO=static
: NIC에 IP를 Dynamic으로 설정할 것인지 아니면 Static으로 설정할 것인지 정함(dhcp = 유동 IP 설정으로 DHCP Server를 통하여 IP 설정, static = 고정 IP 설정으로 관리자가 IP를 직접 입력)

IPADDR=192.168.0.2
: eth0에 IP 주소를 설정

BROADCAST=192.168.0.255
: Broadcast 주소를 설정

NETMASK=255.255.255.0
: Netmask 값을 설정

NETWORK=192.168.0.0
: 해당 네트워크의 Network ID 설정

ONBOOT=yes
: 해당 NIC를 시스템이 부팅할 때 활성화할지 여부(yes or no)

USERCTL=no
: 해당 NIC를 root를 제외한 사용자가 On/Off 가능하게 할지 여부(yes or no)

GATEWAY=192.168.0.1
: 해당 NIC의 Default Gateway를 설정한다. /etc/sysconfig/network 파일에서 설정한 gateway 보다 우선한다.


3.DNS 설정 파일

파일 이름 : /etc/resolv.conf

search nameserver.or.kr
: 호스트네임만 지정했을 경우 뒤에 자동으로 chosun.ac.kr를 붙임

nameserver 168.126.63.1
: 네임서버의 IP를 지정, 네임서버의 지정 개수는 제한이 없고 응답이 없을 경우 다음에 지정한 네임서버를 사용


중요 : 변경된 정보를 적용하기 위하여 시스템을 재부팅하거나 아래와 같은 명령을 사용
: /etc/rc.d/init.d/network restart       or     /etc/init.d/network restart


linux IP Setting Methods


Run Level Process
0 시스템의 Shutdown,halt.
1 1인 관리자 모드(Single 모드).
2 멀티유저 로컬 프로세서 데몬.NFS
3 멀티유저 리모트 프로세서 데몬 (일반적인 상태).
4 싱글유저 스테이트 (root만 접속가능) 단 root 화일 시스템만 보임.
5 X 로그인
6 리부팅(reboot).

종료방법
#init 0
#telinit 0
#shutdown -i0 -g0 -y (일반적인종료)
#shutdown -h 종료후 halt 상태로
#shutdown -r 리부팅.
#init s  싱글상태로 전환
#reboot  (리부팅)

NetWork Configuration
#ifconfig -a    -인터페이스 점검.
( ping telnet traceroite nslookup dmesg netstat -nr )

/etc/init.d/network restart  (start,stop)

1. 호스트네임,게이트웨이설정.
/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localhost
GATEWAYDEY=eth0
GATEWAY=192.168.1.1


2. 네트웍 인터페이스 설정.
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none (dhcp)
BROADCAST=192.168.1.255
IPADDR=192.168.1.5
NETMASK=255.255.0.0
omBOOT=yes

3.DNS서버주소
/etc/resolv.conf
search servername.org
nameserver 192.168.1.1
nameserver 192.168.1.5

4.호스트alies
/etc/hosts
127.0.0.1             localhost.host          localhost
192.168.1.5          localhost

5.호스트명선행처리
/etc/host.conf
order     hosts,bind

# /etc/nologin  접속금지 메세지 설정 (존재하면 접속 불가)
접속이 금지됩니다. 담에 다시 접속해 주세요.

#free - 사용중인 메모리양
/etc/issue.net 파일 (telnet login 시에 보여지는 파일)
/etc/motd 파일 (login 후에 환영메세지)

/proc/sys/net/ipv4/icmp_echo_ignore_all 
1            <- (ping 응답 안하게 설정, default 0 )
 
※ 리눅스에서의 네트워크 장치 이름

    랜카드 장착시 -> '/dev/eth0'  ,  '/dev/eth1'  ,  ...


☆ Gateway , Router
※ 게이트웨이 를 별도로 추가시
    # route  add  default  gw  <게이트웨이 주소>  dev  <장치 이름>
    예)  # route  add  default  gw  192.168.184.254  dev  eth0

☆ Net Mask  &  Class
- 넷마스크 : 네트워크의 규모를 등급별로 결정함.
- C 클래스 : 256개의 IP주소 사용가능
                 예)  네트워크 주소 : 192 . 168 . 184 . 0
                       넷마스크 주소 : 255 . 255 . 255 . 0
- B 클래스 : 65536개의 IP주소 사용가능 ( 2^16 )
                 예)  네트워크 주소 : 192 . 168 . 0 . 0
                       넷마스크 주소 : 255 . 255 . 0 . 0
- A 클래스 : 2^24 개의 IP주소 사용가능
                 예)  네트워크 주소 : 192 . 0 . 0 . 0
                       넷마스크 주소 : 255 . 0 . 0 . 0
※ 설치 가능한 컴퓨터 갯수
    네트워크 주소, 브로드 캐스트 주소, 게이트 웨이 주소 3개를 제외한
    갯수의 컴퓨터를 네트워크 내부에 설치할 수 있다. (C클래스의 경우 256-3 = 253대)

☆ DNS 서버 주소
- URL을 해당 컴퓨터의 IP주소로 변환해주는 서버 컴퓨터의 주소
- 설정 파일  :  /etc/resolv.conf
                   ------------------------------------
                    ........
                    Default  Server : *****                       // DNS 제공자
                    nameserver < ***.***.***.*** >         // 해당 DNS 서버 IP
                    ........
                    ------------------------------------

☆ 네트워크 관련 명령어
ⓐ # system-config-network
    - 네트워크 연결방식을 DHCP 클라이언트 또는 고정 IP 주소를 사용할지 결정
    - IP 주소 , 서브넷 마스크 , 게이트웨이 정보
    - DNS 정보
    - 네트워크 카드 드라이버 설정 , 장치 (eth0) 설정
ⓑ # system-config-network-tui
    - Text User Interface  :  네트워크 설정의 텍스트 모드
ⓒ # service  network  restart
    - 네트워크 설정 변경후 변경 내용을 시스템에 적용 (네트워크 서비스 재시작)
ⓓ # ifconfig < 장치 이름 >
    - 해당 장치의 IP 주소 설정 정보를 출력
ⓔ # nslookup
    - DNS 서버작동 테스트
ⓕ # ping
    - 네트워크에 응답 테스트

☆ 네트워크 설정 변경 관련 파일
 /etc/sysconfig/network                                 // 기본 정보
 /etc/sysconfig/network-scripts/ifcfg-eth0       // eth0 에대한 정보 몽창..
/etc/resolv.conf                                            // DNS 서버정보 및 호스트 이름 정보

☆ 네트워크 카드 교체
- 실제로 네트워크 카드에 문제가 발생시 적용시킬수 있다.
1. 네트워크 카드를 제거.
2. 네트워크 카드를 새로 장착.
3. root 로 부팅~
4. # system-config-network
5. "하드웨어" 탭  →  'eth0' 지우기
                       [새로만들기]  →  하드웨어 타입 'Ethernet' 선택
                       →  <네트워크 아답터 설정 창>  →  아답터 'AMD PCnet32' 선택
6. "장치" 탭  →  [새로만들기]  →  '이더넷 연결' 선택  →  'AMD PCnet32' 선택
                       →  <네트워크 셋팅 설정 창>  →  '정적으로 설정된 IP 주소들' 선택
                       →  네트워크 정보 입력
7. "DNS" 탭  →  DNS 주소 확인
8. 완료 (창닫기 or  메뉴 [파일]-[끝내기] 선택)
9. # service  network  restart            // 서비스 재시작
10. # ping  www.google.co.kr          //  응답확인
11. # ifconfig  eth0                          //  네트워크 설정 확인

☆ 네트워크 설정 - Text Mode
# vi  /etc/sysconfig/network         // 확인
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
   다음 사항을 수정한다.
   ----------------------------------------------------
   ..............
   NETMASK = *** . *** . *** . ***              // 넷마스크
   IPADDR = *** . *** . *** . ***                  // IP 주소
   ..............
   GATEWAY = *** . *** . *** . ***             // 게이트 웨이 주소
   ..............
   ----------------------------------------------------
# service  network  restart

☆ 네트워크 설정 - Command Mode
# ifconfig  eth0  <IP 주소>  netmask  <넷마스크>  broadcast  <브로드캐스트 주소>  up
# route  add  -net  <네트워크 주소>  netmask  <넷마스크>  eth0
# route  add  default  gw  <게이트웨이 주소>  dev  eth0
# vi /etc/resolv.conf          // DNS 설정
# service  network  restart

※  인터넷이 잘 안될때 , DNS 서버 고장을 의심해보자

ⓐ DNS 서버 작동 확인하기
    # nslookup
    > server                     // 사용중인 DNS 서버 주소확인,  "Default server :" 이후에 나오는 주소가 DNS주소
    > www.google.co.kr
       ;; connection timed out; no servers could be reached
        위와 같은 에러 메시지가 나온다면 DNS 서버가 고장나거나, DNS 서버의 주소가 잘못된것.

ⓑ 다른 컴퓨터에서 DNS 주소 따오기
     windows 인경우 : cmd 창에서 'nslookup' 명령으로 DNS 주소 획득~
     linux 인 경우 :  위 ⓐ방법으로 확인

ⓒ 가져온 DNS 주소 확인하기
    # nslookup
    > server  <새로운 DNS 주소>
    > www.google.co.kr               // DNS 서버 작동 확인

ⓓ 정상 작동하는 DNS 주소 적용하기
    # vi  /etc/resolv.conf               // 'nameserver' 부분 수정



VS FTP 설정 파일


/etc/vsftp.conf


listen=YES

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

ascii_upload_enable=YES
ascii_download_enable=YES

chroot_local_user=YES

ls_recurse_enable=YES

secure_chroot_dir=/var/run/vsftpd

pam_service_name=vsftpd

rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem

rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key


.bash_profile

##### LANGUAGE SECTION #####
#export LANG="ko_KR.eucKR"
#export LC_ALL="ko_KR.eucKR"

##### PROMPT TYPE EDIT SECTION #####
PS1='^[[44;1;36m [ ${USER}@lab4 ] ^[[44;1;33m${PWD} ^[[0m \n^[[44;1;33m ^[[44;1;36m#  ^[[0m  '

#####  dir COLOR EDIT SECTION  #####
#eval "`/usr/bin/dircolors -b ~/.dir_colors`"

#####  ALIAS SECTION  #####
alias ss='. ~/.bash_profile'
alias vi='/usr/bin/vim -T ansi'
alias ls='ls -CFh --color=always'
alias ll='ls -alh -F --color=always'
alias la='ls -alh -F --color=always'
alias dir='/bin/ls -alhF --color=always | more'
alias f='/usr/bin/finger'
alias ff='f;w'
alias cls='clear'

#####  PROMPT EDIT SECTION  #####
echo
echo "     ^[[44;1;36m    $(date)     ^[[0m"
echo
echo "^[[0m^[[1;32m $(w) ^[[0m"
echo



.vimrc

set magic
set noshowcmd
set fileencoding=korea

set nowrap
set shiftwidth=3
set tabstop=3
set nowritebackup
set showmode
"set hardtabs=3
set nobackup
set nocompatible
set background=dark
set number
set ruler

syntax on

hi Comment          ctermfg=Gray guifg=#80a0ff
hi Constant         ctermfg=Magenta guifg=#ffa0a0
hi Special          ctermfg=Magenta guifg=Orange
hi Identifier       ctermfg=LightGreen guifg=#40ffff
hi Statement        ctermfg=Cyan guifg=#ffff60 gui=bold
hi PreProc          ctermfg=green guifg=#ff80ff
hi Type             ctermfg=Yellow guifg=#60ff60 gui=bold
hi Ignore           ctermfg=Black guifg=bg

au BufNewFile,BufReadPost *.c,*.h,*.pc,*.ec     set cindent shiftwidth=2
au BufNewFile,BufReadPost *.java        set cindent shiftwidth=2
au BufNewFile,BufReadPost *.cpp,*.cc    set cindent shiftwidth=2
au BufNewFile,BufReadPost *.jsp         set cindent shiftwidth=2
au BufNewFile,BufReadPost *.phtml       set cindent shiftwidth=2
au BufNewFile,BufReadPost *.pl          set cindent shiftwidth=2
au BufNewFile,BufReadPost *.html                                set cindent shiftwidth=2
au BufNewFile,BufReadPost *.tcl                                 set cindent shiftwidth=2
au BufNewFile,BufReadPost *.php                                 set cindent shiftwidth=2
au BufNewFile,BufReadPost *.tex                                 set autoindent



.dir_colors

# Configuration file for dircolors, a utility to help you set the
# LS_COLORS environment variable used by GNU ls with the --color option.

# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
# slackware version of dircolors) are recognized but ignored.

# Below, there should be one TERM entry for each termtype that is colorizable
TERM linux
TERM linux-c
TERM mach-color
TERM console
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM dtterm
TERM xterm
TERM xterm-color
TERM xterm-debian
TERM rxvt
TERM screen
TERM screen-w
TERM vt100

# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
NORMAL 00   # global default, although everything should be something.
FILE 00  # normal file
DIR 08;36   # directory
LINK 01;36  # symbolic link.  (If you set this to 'target' instead of a
            # numerical value, the color is as for the file pointed to.)
FIFO 40;33  # pipe
SOCK 01;35  # socket
DOOR 01;35  # door
BLK 40;33;01   # block device driver
CHR 40;33;01   # character device driver
ORPHAN 40;31;01 # symlink to nonexistent file

# This is for files with execute permission:
EXEC 01;32

#program-source file
.cpp  01;31
.h    01;31
.c    08;33
.java 01;33
.out  08;32
.html 01;35
.htm   01;35
.cgi   01;35
.shtml 01;35

.bash_profile   01;31
.bashrc        01;31
.vim           01;31
.svim       01;31
.vimrc         01;31
.vimrc         02;31
# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')

# If you use DOS-style suffixes, you may want to uncomment the following:
#.cmd 01;32 # executables (bright green)
#.exe 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32

.tar 01;31 # archives or compressed (bright red)
.tgz 01;31
.arj 01;31
.taz 01;31
.lzh 01;31
.zip 01;31
.z   01;31
.Z   01;31
.gz  01;31
.bz2 01;31
.deb 01;31
.rpm 01;31
.jar 01;31

# image formats
.jpg 01;35
.jpeg 01;35
.png 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
.mpg 01;35
.mpeg 01;35
.avi 01;35
.fli 01;35
.gl 01;35
.dl 01;35
.xcf 01;35
.xwd 01;35

# audio formats
.ogg 01;35
.mp3 01;35
.OGG 01;35
.MP3 01;35



'업무 > Linux' 카테고리의 다른 글

vsftpd 설정하기  (0) 2008.08.22
Fedora Core 6에서 고정 IP 잡기  (2) 2008.07.10
Linux IP 설정 파일들  (0) 2008.07.08
Linux에서 path 잡는다고 삽질했습니다.  (0) 2008.05.19
27일자 임베디드 리눅스 교육 자료  (0) 2008.03.27

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,
> [root@localhost ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.1.218   localhost

192.168.1.218   localhost
[root@localhost ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=localhost.localdomain

[root@localhost ~]# cat /etc/resolv.conf
nameserver 192.168.1.1

[root@localhost ~]# cat /etc/host.conf
order hosts,bind

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Marvell Technology Group Ltd. 88E8053 PCI-E Gigabit Ethernet Controller
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:13:D4:54:FF:FD
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
IPADDR=192.168.1.218
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes



WRITTEN BY
가별이
내가 천사의 말 한다 해도

,
요새 셋탑박스에 포팅되는 Linux를 한 번 손대보겠다고 이리저리 만져보고 있습니다. 이것 저것 다 깔고 나서 경로를 잡아주고 실행을 하려고 하니 실행이 안되더군요.

분명히 .bash_profile에 PATH를 추가해줬는데 안되는겁니다. (이건 옛날 도스 시절의 Autoexec.bat 파일이랑 같은거죠.) 그래서 명령어를 찾다보니 echo $PATH로 경로를 확인할 수 있더군요. 문제는 제가 추가한 경로가 반영이 안되어있더라구요. 엄청 고민했습니다 찾아봤는데도 안나오는거예요.

하지만 나중에서야 알고보니 bash shell이 로딩이 안되어있더라구요. 이런 기본적인 삽집을!! 그래서 bash라고 쳐주니 간단하게 해결되었습니다.

하지만 아직도 의문인게 /etc/passwd에는 root shell이 bash더라구요. 근데 왜 다른 shell로 올라갔을가요? 이건 나중에 풀어봐야겠어요.

하지만 오늘 결국 오류가 나서 Fedora core 5를 밀어버리고 6으로 새로 깔고 있답니다. 업데이트 중인데 너무 느리네요. 에혀.. 다 깔고 나면 또 다시 인스톨해봐야겠습니다.

지금은 IP를 고정으로 잡아줘야 해서 그거 찾아보고 있는 중이랍니다.

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,

tar -xvf filename

'업무 > Linux' 카테고리의 다른 글

Linux IP 설정 파일들  (0) 2008.07.08
Linux에서 path 잡는다고 삽질했습니다.  (0) 2008.05.19
27일자 임베디드 리눅스 교육 자료  (0) 2008.03.27
25일자 임베디드 Linux Source 예제  (0) 2008.03.26
VI 에디터 사용법  (2) 2008.03.19

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,



VI 에디터 사용법

이 문서는 프리(free)입니다. 자유 소프트웨어 재단(FSF)에 의해 제출된 GNU GPL(일반 공개 라이선스) 제2판 또는 그 이후 버전이 정하는 바에 따라 자유롭게 재배포하고 수정할 수 있습니다.
이 문서는 유용하게 쓰이기를 바라는 마음으로 배포합니다. 그러나 아무런 보증도 하지 않습니다. 심지어 상업성이나 특정 목적에 적합하다는 보증도 하지 않습니다. 자세한 사항은 GNU GPL을 참조하십시오.

1. vi란?

리눅스나 유닉스를 처음 접하는 사람에게 vi는 매우 골치아픈 존재이다. 도스나 윈도우에서 문서 편집기를 써 본 사람에게는 vi는 매우 불편한 편집기로 생각될 것이다. 그러나 내가 아는 한 vi만큼 가볍고 편하게 쓸 수 있는 편집기는 지구상에는 없다! `가볍고'라는 단어를 붙인 이유는 이맥스(emacs)라는 편집기를 쓰는 사람이 항의할 것이 걱정되기 때문이다. 이맥스는 호랑이 담배피던 시절부터 가장 똑똑한 에디터로 군림해 왔다. 그러나 프로그램 크기만도 수십메가에 달하고 설치되어 있지 않은 경우도 많다. 하지만 대부분의 유닉스 계열 시스템이라면 vi는 십중팔구 설치되어 있을 것이다. 따라서 한번 익혀두면 여러모로 편리하게 쓸 수 있다.

vi라는 이름은 `VIsual display editor'를 의미한다. vi는 버클리의 어느 천재가 만들었다고 한다. vi를 만들던 시절에는 ed와 같은 라인 에디터가 일반적이었다. 그 옛날 옛적 도스의 `edlin' 이라는 라인 에디터를 써 본 사람이라면 라인 에디터가 얼마나 불편한지 알 것이다. 유닉스처럼 텍스트 에디터와 포매터가 분리된 환경에서는 텍스트 에디터의 비중이 크기 때문에 기능 면에서도 많은 요구가 있게 마련이다. 때문에 텍스트 에디터가 워드 프로세서의 기능의 상당 부분을 가지게 되었다. 유닉스에 여러가지 종류가 있듯이 vi도 여러가지 클론이 만들어졌다. 요즘 대부분의 배포판에는 vim이라는 vi의 클론이 포함되어 있다. vim은 완벽하게 한글을 지원하고 원래의 vi의 기능을 충실하게 갖고 있을 뿐만 아니라 여러가지 좀더 편리한 툴들을 제공한다.

2. vi 입문

2-1. 실행과 종료, 파일 저장

우선 vi를 실행해 보자. 쉘 프롬프트에서 vi<CR>를 입력하면 다음과 같은 화면이 보일 것이다. <CR>< C R >을 차례대로 타이프하라는 뜻이 아니라 엔터를 치라는 뜻이다. 만약 이미 존재하는 어떤 파일을 편집하고 싶다면 `vi [file]<CR>'을 입력한다.

~
~
~
~                         VIM = Vi IMproved
~
~                           version 5.6.70
~                      by Bram Moolenaar et al.
~
~                    Vim is freely distributable
~           type  :help uganda<Enter>     if you like vim
~
~           type  :q<Enter>               to exit
~           type  :help<Enter>  or  <F1>  for on-line help
~           type  :help version5<Enter>   for version info
~
~
~

[영어][완성][세벌식]

`~'는 빈 줄, 즉 아무것도 없는 줄이라는 뜻이다. 친절하게도 vim은 실행하자마자 가장 중요한 명령을 알려준다. 바로 `:q<CR>'이다. 한번 실행해 보자. 쉘 프롬프트로 돌아갈 것이다. 이미 `quit'의 약자라는걸 짐작하고 있을 것이다. vi를 종료하는 명령 못지 않게 중요한 명령이 있다. 바로 파일을 저장하는 명령이다. 파일을 저장하기 위해서는 명령 모드에서 `:w [file]<CR>'을 타이프하면 된다. 만약 이미 파일 이름이 지정되어 있다면 그냥 간단히 `:w'만 타이프해도 된다. w는 `write'의 첫 글자이다. 또, 파일을 저장한 후 vi를 종료하려면 명령 모드에서 `:wq<CR>' 혹은 `ZZ'를 차례로 타이프하면 된다.

2-2. 글 입력

이제 뭔가를 써 넣을 차례다. 그 전에 우선 한 가지를 알아둘 것이 있다. vi가 다른 `평범한' 편집기와 비교할 때 가장 특이한 점은 프로그램의 상태가 `명령 모드'와 `입력 모드'로 구분된다는 점이다. 보통의 편집기는 키보드에서 입력되는 문자가 그대로 문서에 포함될 것이다. 즉, 기본적으로 입력 모드에 있다. 이에 반해 vi는 기본적으로 명령 모드에 있다. 이 상태에서 키보드에서 입력하는 문자 하나하나는 vi에 대한 명령어가 된다. 입력 모드로 들어가는 문자를 입력하면 비로소 그때부터 입력 모드가 되는 것이다. 입력 모드에서 명령 모드로 복귀하려면 `<ESC>'키를 누른다. 입력 모드로 들어가는 명령을 요약하면 다음 표와 같다.

a 커서 위치의 다음 칸부터부터 끼워넣기(append)
A 커서가 있는 줄의 끝에서부터 끼워넣기
i 커서 위치부터 끼워넣기(insert)
I 커서가 있는 줄의 맨 앞에서부터 끼워넣기
o 커서 바로 아래에 줄을 만들고 끼워넣기(open line)
O 커서 바로 위에 줄을 만들고 끼워넣기

다음과 같이 적어 보자.

iI am a member of KULS!<CR>Are you a member of KULS?<CR>나는 018이다.

화면에 다음과 같이 입력될 것이다.

I am a member of KULS!
Are you a member of KULS?
나는 018이다.
~
~

입력을 마쳤으면 `<ESC>'를 눌러 다시 명령 모드로 돌아오자. 만약 현재 상태가 입력 모드인지 명령 모드인지 잘 모른다면 무조건 `<ESC>'키를 눌러 일단 명령모드로 돌아온 후 다시 시작하도록 한다.

2-3. 커서 이동

이제 커서를 이동시켜 보자. 커서 이동에 사용하는 키는 다음과 같다.

h 한칸 왼쪽으로 이동 l 한칸 오른쪽으로 이동
j 한줄 아래로 이동 k 한줄 위로 이동
w 다음 단어의 첫 글자로 이동 W 다음 단어의 첫 글자로 이동
b 이전 단어의 첫 글자로 이동 B 이전 단어의 첫 글자로 이동
e 단어의 마지막 글자로 이동 E 단어의 마지막 글자로 이동
^ 그 줄의 첫 글자로 이동 $ 그 줄의 마지막 글자로 이동
0 그 줄의 처음으로 이동 <CR> 다음 줄의 첫 글자로 이동
+ 다음 줄의 첫 글자로 이동 - 윗줄의 첫 글자로 이동
( 이전 문장의 첫 글자로 이동 ) 다음 문장의 첫 글자로 이동
{ 이전 문단으로 이동 } 다음 문단으로 이동

단어 단위 이동 명령에서 대문자 명령은 소문자 명령과 약간 차이가 있다. 대문자 명령은 무조건 띄어쓰기 전까지를 한 단어로 취급한다. 다시 말해 I'm a member of "KULS"에서 w, b, eI / ` / m / a / member / of / " / KULS / " 를 각각 한 단어로 취급하는 데 반해 W, B, EI'm / a / member / of / "KULS" 를 한 단어로 취급한다. 또, vi는 빈 줄이 나오기 전까지를 한 문단으로 취급한다. 즉, {를 누르면 이전 빈 줄로, }를 누르면 다음 빈 줄로 이동한다.

2-4. 글 수정

작성되어 있는 글을 수정하는 명령은 보통 c와 커서 이동 명령이 결합된 형태이다. 정리하면 다음과 같다.

r 커서 위치의 한 글자 교체
R 커서 위치부터 <ESC>를 누를때까지 다른 글자로 교체
s, cl 커서 위치의 글자를 한개를 여러 글자로 교체
ch 커서 바로 앞의 글자를 한개를 여러 글자로 교체
cw 커서 위치의 한 단어를 교체
c0 커서 위치부터 줄의 처음까지 교체
C, c$ 커서 위치부터 줄의 끝까지 교체
cc 커서가 있는 줄을 교체
cj 커서가 있는 줄과 그 다음 줄을 교체
ck 커서가 있는 줄과 그 앞줄을 교체

이제 실습을 해보자. 다음과 같이 타이프 해 보자.

jjjr1kwwwwcwKorea University Linux Study<ESC>

아래와같이 바뀌었을 것이다. 세 글자 왼쪽으로 이동한 후(jjj) 커서 위치의 글자를 1로 교체하라(r1)는 뜻이다. r 명령의 경우 한 글자만 교체하는 명령이므로 교체 후 자동으로 명령모드로 전환된다. 그 다음은 한줄 위로 이동한 후(k) 네 단어 오른쪽으로 이동하고(wwww) 커서 위치의 단어를 Korea University Linux Study로 교체하고(cw) 명령모드로 전환하라(<ESC>)는 뜻이다.

I am a member of KULS!
Are you a member of Korea University Linux Study?
나는 011이다.
~
~

다시 다음과 같이 타이프해 보자.

O고려대학교 리눅스 동아리 KULS! Since 1999.<ESC>jkkksthe<ESC>

이제 아래와 같이 바뀌었을 것이다. 먼저 커서가 있는 줄의 위쪽에 한 줄을 삽입하고(O) (고려대학교 리눅스 동아리 KULS! Since 1999.)를 적은 다음 아래줄로 가서 오른쪽으로 세 글자 이동한 후(jkkk) 커서 위치의 한 글자를(s) the로 교체하라고 명령한 것이다.

I am a member of KULS!
고려대학교 리눅스 동아리 KULS! Since 1999.
Are you the member of Korea University Linux Study?
나는 011이다.
~
~

2-5. 글 삭제

글을 삭제하는 명령도 수정하는 명령과 거의 비슷하다. 글을 수정하는 명령이 c와 커서 이동 명령이 결합된 형태인것처럼 글을 삭제하는 명령은 d와 커서 이동 명령이 결합된 형태이다. 정리하면 다음과 같다.

x, dl 커서 위치의 글자 삭제
X, dh 커서 바로 앞의 글자 삭제
dw 한 단어를 삭제
d0 커서 위치부터 줄의 처음까지 삭제
D, d$ 커서 위치부터 줄의 끝까지 삭제
dd 커서가 있는 줄을 삭제
dj 커서가 있는 줄과 그 다음 줄을 삭제
dk 커서가 있는 줄과 그 앞줄을 삭제

이제 글을 삭제해보자. 다음과 같이 타이프한다.

j0wd0wxxxxwwXXXjwwDjdd

다음 줄의 처음으로 이동해(j0) 한 단어 오른쪽으로 이동한 후(w) 커서 위치에서부터 줄의 처음까지 지우고(d0) 다시 한 단어 이동한 뒤(w) 커서 위치의 네 글자를 지우고(xxxx) 다시 두 단어 이동한 뒤(ww) 커서 바로 앞의 글자 세개를 지우고(XXX) 다음 줄로 내려가 두 단어 오른쪽으로 이동한 후 거기에서부터 줄의 끝까지 지우고(jwwD) 다음 줄을 모두 지우라(jdd)는 뜻이다. 이제 아래와 같이 바뀌었을 것이다.

I am a member of KULS!
고려대학교 리눅스 동아리 KULS! Since 1999.
you member Korea University 
~
~

2-6. 복사 & 붙이기

글을 복사하는 명령을 이미 두 가지를 배웠다. 위에서 글 교체와 글 삭제 명령으로 지워진 글은 버퍼에 저장된다. 버퍼에 저장된 글을 끼워넣는 명령은 두 가지가 있다. p 를 누르면 현재 커서 위치의 바로 다음에 끼워넣고, P를 누르면 현재 커서 위치의 바로 앞에 끼워넣는다.

현재 작성되어 있는 글에 영향을 미치지 않고 글을 복사하는 방법은 cd 대신 y를 사용한다는 점을 제외하면 위에서 살펴본 교체나 삭제 방법과 동일하다. y는 잡아당기다 라는 뜻의 영어 단어 yank의 첫 글자이다. 정리하면 다음과 같다.

yw 커서 위치부터 단어의 끝까지 복사
y0 커서 위치부터 줄의 처음까지 복사
y$ 커서 위치부터 줄의 끝까지 복사
yy 커서가 있는 줄을 복사
yj 커서가 있는 줄과 그 다음 줄을 복사
yk 커서가 있는 줄과 그 앞줄을 복사
p 커서의 다음 위치에 붙여넣기
P 커서가 있는 위치에 붙여넣기

다음과 같이 입력해보자.

kkPjyyjpjdw$pdw$p0dw$p

먼저 두 줄 위로 올라가 커서가 앞쪽(위쪽)에 조금 전에 삭제한 내용을 끼워넣고(kkP) 다음 줄을 복사해서(jyy) 한 줄 아래로 이동한 후 커서 뒤쪽(아래쪽)에 끼워넣은 후(jp) 한 줄 아래로 내려가 한 단어를 삭제한 후 그 단어를 그 줄의 맨 끝에 붙여넣고(jdw$p) 다시 맨 앞의 한 단어를 삭제한 후 맨 뒤에 붙여넣으라(0dw$p)는 뜻이다. 이제 다음과 같이 바뀌었을 것이다.

나는 011이다.
I am a member of KULS!
고려대학교 리눅스 동아리 KULS! Since 1999.
I am a member of KULS!
Korea University you member 
~

2-7. 기타

다음은 위에는 해당되지 않지만 많이 사용되는 명령들이다.

u 작업 취소(undo)
U 그 줄에 행해진 작업 모두 취소
Ctrl+r 작업 재실행(redo)
. 조금 전에 했던 명령을 반복
J 현재 줄과 아래 줄을 연결
~ 대문자를 소문자로, 소문자를 대문자로 바꿈
% 괄호의 반대쪽 짝으로 이동
Ctrl+l 현재 화면을 지우고 다시 그림
Ctrl+g 파일에 관한 정보를 표시

다음과 같이 입력해 보자.

kkk0bbbxxxuuujdw.UkkJ

먼저 세 줄 위로 이동해 그 줄의 맨 앞으로 이동한 후 세 단어 오른쪽으로 이동하고(kkk0bbb) 글자 세개를 지웠다가 이를 취소한 후(xxxuuu) 한줄 아래로 내려가 한 단어를 삭제하고(jdw) 다시 한번 한 단어를 삭제하고(.) 그 줄에서 행해진 작업을 모두 취소한 뒤(U) 두 줄 올라가 그 줄과 그 다음 줄을 연결하라(kkJ)는 명령이다. 이제 다음과 같이 바뀌었다.

나는 011이다. I am a member of KULS!
고려대리눅스 동아리 KULS! Since 1999.
I am a member of KULS!
Korea University you member 
~

Ctrl+l 명령은 화면을 다시 나타내는 명령이다. 문서 작성중에 talk 요청이 오거나 혹은 다른 메시지에 의해 화면이 지저분해질 경우 사용하면 편리하다.

지금까지 배운 대부분의 명령 앞에는 숫자 인수를 줄 수 있다. 다음과 같이 타이프해 보자.

3j0w2dw2k2yy3P

세 줄 아래로 내려간 후 첫 번째 칸으로 이동했다가 한 단어 오른쪽으로 이동하고(3j0w) 두 단어를 지운 후(2dw) 두줄 위로 올라가서(2k) 두 줄을 복사해서(2yy) 세번 붙여넣기 하라(3P)는 뜻이다. 이제 다음과 같이 바뀌었을 것이다.

나는 011이다. I am a member of KULS!
고려대리눅스 동아리 KULS! Since 1999.
I am a member of KULS!
고려대리눅스 동아리 KULS! Since 1999.
I am a member of KULS!
고려대리눅스 동아리 KULS! Since 1999.
I am a member of KULS!
고려대리눅스 동아리 KULS! Since 1999.
I am a member of KULS!
Korea member 
~

이제 기본적인 내용은 다 익혔다. 지금까지 배운 내용만으로도 간단한 문서를 작성하고 편집하는 데에는 문제가 없을 것이다. 이제 vi를 빠져나가자.

:q<CR>

엇, 그런데 vi가 말을 듣지 않는다. 화면 맨 아래를 보면 다음과 같이 나와 있을 것이다.

~
~
No write since last change (use ! to override)

음. 파일을 저장하지 않았기 때문에 그냥은 나갈 수 없다는 뜻이다. 강제로 빠져나가려면 !를 사용해야 한다.

:q!<CR>

이제 별 탈 없이 vi를 빠져나올 수 있을 것이다.

3. vi 중급 사용자로

일단 vi를 실행한 후 /usr/doc/HOWTO/Installation-HOWTO 라는 파일을 한번 열어보자. 애써 실행한 vi를 빠져나온 다음 다음과 같이

lhs0@libretto$ vi /usr/doc/HOWTO/Installation-HOWTO

vi를 다시 실행해줘도 되겠지만, 장차 vi의 고수가 될 사람이 이런 구차한 방법을 쓸 수는 없다. 명령 모드에서 다음과 같이 입력하자.

:e /usr/doc/HOWTO/Installation-HOWTO<CR>

bash에서처럼 파일 이름을 전부 다 타이프하지 않고 일부만 타이프한 후 <TAB> 키를 누르면 자동으로 완성된다. 다음과 같은 화면이 나올 것이다. 꼭 이 파일이 아니라도 상관없다. 만약 이 파일이 없다면 다른 아무 파일이나 큼지막한 파일을 열어보자.

The Linux Installation HOWTO
by Eric S. Raymond
v4.15, 20 November 1998

This document describes how to obtain and install Linux software. It
is the first document which a new Linux user should read to get
started.
______________________________________________________________________

Table of Contents

...

"/usr/doc/HOWTO/Installation-HOWTO" [readonly] 1518 lines, 59961 characters
[영어][완성][세벌식]

전체 1518줄이다. j키를 눌러 한 줄씩 내려가며 한번 세보자. 농담이다. 설마 정말 이렇게 하는 사람이 있다면 필자는 아주 슬프다.(-;) 화면 맨 아래에 보면 1518 lines 라고 나와 있다. 만약 나오지 않는다면 Ctrl+g를 눌러보자.

3-1. 화면 이동

앞 장에서 이미 커서 이동 명령을 배웠다. 그러나 커다란 문서에서 j, k 키만 가지고 돌아다니는 것은 너무 시간이 오래 걸린다. 커다란 문서를 편집할 때 화면 이동에 쓰이는 키는 다음과 같다.

H 커서를 화면의 맨 위로 z<CR> 현재 줄을 화면의 맨 위로
M 커서를 화면의 중앙으로 z. 현재 줄을 화면의 중앙으로
L 커서를 화면의 맨 아래로 z- 현재 줄을 화면의 맨 아래로
[n]H 커서를 위에서 [n]번째 줄로 [n]L 커서를 아래에서 [n]번째 줄로
Ctrl+u 반 화면 위로 스크롤 Ctrl+b 한 화면 위로 스크롤
Ctrl+d 반 화면 아래로 스크롤 Ctrl+f 한 화면 아래로 스크롤
gg, 1G 문서의 맨 처음 줄로 G 문서의 맨 마지막 줄로
[n]G [n]번째 줄로 이동    

이제 또 실습을 해 볼 차례다. 먼저 G를 눌러보자. 화면의 맨 마지막 줄로 커서가 이동할 것이다. 이번에는 gg를 입력해 보자. 다시 맨 처음 화면으로 돌아올 것이다. 극과 극으로만 움직이니 별로 재미가 없다. 100G를 한번 입력해 보자. 100번째 줄로 커서가 이동할 것이다. 정말 100번째 줄인지 궁금하면 k키를 한번씩 누르며 몇 번 눌러야 첫 번째 줄 까지 가는지 한번 세보자. 정말 따라하는 사람이 있다면 정말 이 글을 더 이상 쓰기가 싫어질 것 같다.

:set number<CR> 또는 :set nu<CR>

를 입력해 보자. 화면 왼쪽에 줄 번호가 표시될 것이다.

:set nonumber<CR> 또는 :set nonu<CR>

를 입력하면 다시 사라질 것이다.

이제 Ctrl+f를 눌러 한 페이지씩 아래로 내려가 보자. 다시 Ctrl+b를 눌러 원래 위치로 돌아와 보자. 이번에는 H를 눌러 보자. 커서가 화면의 맨 첫 번째 줄로 이동할 것이다. M, L도 한번씩 눌러보자. 이번에는 z<CR>을 눌러보자. H를 눌렀을 때와는 약간 다를 것이다. H를 누르면 화면은 정지된 채 커서만 이동하는 데 반해 z<CR>을 누르면 커서의 위치가 문서에 고정된 채 문서가 스크롤되어 커서가 있는 줄이 첫 번째 줄에 위치하게 된다. z., z-도 한번씩 눌러보자.

3-2. 마킹

이제 커다란 문서에서도 마음대로 커서를 움직일 수 있게 되었다. 그런데 만약 어떤 위치에서 작업하다가 잠깐 다른 위치로 가서 뭔가 복사해서 원래의 위치에 붙여넣을 경우를 생각해 보자. 줄 번호를 기억해 두었다가 [n]G 명령으로 그 줄로 가도 되겠지만 똑똑한 컴퓨터를 놔두고 머리를 혹사시킬(?) 필요는 없다. vi는 26개의 마킹을 제공한다. 즉, 어떤 위치에 마크를 해 둔 후 다른 위치로 이동했다가 다시 돌아갈 때 그 마크를 이용할 수 있다. 마킹에 관계된 명령들을 정리하면 다음과 같다.

ma 현재 위치를 `a'로 마크    
`a 마크된 `a'로 이동 'a 마크된 `a'가 있는 줄의 처음으로 이동
`` 직전의 커서 위치로 이동 '' 직전에 커서가 위치하던 줄의 처음으로

3-3. 여러개의 버퍼 사용

앞에서 버퍼를 사용하는 방법에 대해서 이미 배웠다. 그런데 앞에서 배운 내용으로는 마지막으로 버퍼에 저장된 내용밖에는 사용할 수 없다. vi는 이전 9개까지 버퍼에 저장되었던 내용을 기억한다. 먼저 삭제, 복사, 교체한 글은 1번 버퍼에 저장된다. 그 상태에서 또 다른 글을 삭제, 복사, 교체하면 그 내용이 1번 버퍼에 저장되고 1번 버퍼에 내용은 2번 버퍼로 옮겨진다. 그 상태에서 다시 글을 삭제하거나 복사하거나 교체하면 그 내용이 다시 1번 버퍼에 옮겨지고 1번 버퍼에 있던 글은 2번 버퍼에, 2번 버퍼에 있던 글은 3번 버퍼로 옮겨진다. 이런식으로 총 9개의 버퍼에 내용이 저장된다. [n]번째 버퍼에 있는 내용을 붙여넣기 위해서는 다음과 같이 입력하면 된다.

"[n]p 혹은 "[n]P

즉, 붙여넣기 전에 "[n]을 붙여주면 된다. 만약 어떤 버퍼에 저장된 내용을 붙여넣어야 할지 잘 모르겠으면 다음과 같이 해보면 자동적으로 버퍼의 번호를 증가시킬 수 있다.

"1pu.u.u.u.

위에서 이야기한 9개의 버퍼 외에도 vi에서는 a부터 z까지 이름이 붙은 26개의 버퍼를 더 사용할 수 있다. 만약 현재 줄부터 3줄을 버퍼 `a'에 복사 싶다면 "a3yy를 입력한다. 현재 커서의 위치에서 줄의 끝까지 지우면서 그 내용을 버퍼 `b'에 저장하고 싶다면 "bD를 입력하면 된다. 버퍼에 있는 내용을 붙여넣는 방법은 앞에서 설명한 9개의 버퍼와 같다. 만약 버퍼 `a'에 있는 내용을 붙여넣고 싶다면 "ap를 입력하면 된다.

3-3. 패턴 검색 및 교체

패턴을 검색하는 방법은 크게 두 가지가 있다. 먼저 그 줄에서 일치하는 글자를 찾는 방법이다. 만약 현재 줄에서 `a'라는 문자를 찾고 싶다면 fa를 입력한다. 다음 `a'를 검색하려면 ;를 입력하고 다시 이전의 `a'를 검색하려면 ,를 입력한다. 사실 위에서 배운 한 줄 안에서의 검색은 별로 쓸 일이 없을 것 같다. 대부분의 경우 그냥 눈으로 보고 h, l 키나 w, b 키로 찾아가는 것이 속편하다는 사람이 많을 것 같다.

보다 많이 쓰이는 검색 방법은 문서 전체에서 특정 패턴을 찾는 방법이다. 문서 전체에서 특정 패턴을 찾는 방법을 정리하면 다음과 같다.

/[pattern]<CR> 현재 위치에서부터 아래 방향으로 패턴 검색
?[pattern]<CR> 현재 위치에서부터 위쪽 방향으로 패턴 검색
n 검색하던 방향으로 계속 패턴 검색
N 검색하던 반대 방향으로 계속 패턴 검색

만약 `linux'라는 단어를 검색하고 싶다면 다음과 같이 입력한다.

/linux<CR>

계속하여 일치하는 패턴을 검색하고 싶다면 n을 입력한다. 문서의 맨 마지막 패턴에서 다시 n을 누르면 다시 문서의 처음부터 검색을 시작할 것이다. 이 기능을 끄고 싶다면 다음과 같이 입력한다.

:set nowrapscan<CR> 또는 :set nows<CR>

이제 문서의 끝에 도달하면 다시 처음으로 돌아가지 않을 것이다. 다시 켜고 싶다면 다음과 같이 입력한다.

:set wrapscan<CR> 또는 :set ws<CR>

검색만 하니 별로 재미가 없다. 이제 특정 패턴을 다른 패턴으로 바꾸어 보자. 어떤 패턴을 다른 패턴으로 바꾸는 방법을 정리하면 다음과 같다.

:s/old/new<CR> 현재 줄의 처음 old를 new로 교체
:s/old/new/g<CR> 현재 줄의 모든 old를 new로 교체
:1,20s/old/new/g<CR> 1부터 20번째 줄까지 모든 old를 new로 교체
:-2,+4s/old/new/g<CR> 커서 2줄 위부터 4줄 아래까지 old를 new로 교체
:%s/old/new/g<CR> 문서 전체에서 old를 new로 교체
:%s/old/new/gc<CR> 문서 전체에서 old를 new로 확인하며 교체
:g/pattern/s/old/new/g<CR> pattern이 있는 모든 줄의 old를 new로 교체
:g/pattern/s//new/g<CR> :%s/old/new/g<CR>과 동일

3-4. vi에서 UNIX 명령 실행

다음과 같이 입력해보자.

:!bash<CR>

앗, 이건...친숙한 쉘 프롬프트이다. 만약 vi를 사용하다가 잠깐 쉘 프롬프트로 빠져나와야 할 경우 사용한다. 다시 vi로 돌아가고 싶으면 exit<CR>를 입력한다. :q<CR>로 vi를 빠져나온것과는 달리 현재 커서의 위치나 버퍼의 내용이 그대로 보존되므로 잠깐 동안 쉘 프롬프트로 빠져나왔다가 금방 다시 vi로 돌아가야 할 경우 편리하게 사용할 수 있다. 그런데 주의할 점이 하나 있다. 이렇게 vi를 빠져나온 후 다시 vi를 실행해서는 안된다. 별 문제야 없겠지만 같은 파일을 다시 연다면 문제가 생길 수 있다.

만약 한 개의 명령어만 실행할 경우 좀더 편리한 방법이 있다.

:![command]<CR>

필자는 현재 latex과 vi로 이 문서를 작성하고 있는데 문서를 미리보기 할 때마다 vi를 빠져나가서 봐야 한다면 무척 불편할 것이다. 다행히 다음 명령어로 vi를 빠져나가지 않고 미리보기를 할 수 있다.

:!latex %; xdvi %<.dvi<CR>

`latex' 이라는 명령으로 현재 편집중인 파일인 vi-seminar.tex 파일을 컴파일한 다음 생성된 vi-seminar.dvi 파일을 `xdvi'라는 프로그램으로 열어보라는 명령이다. 매번 이렇게 타이프 할 필요는 없다. :을 누른 후 위쪽 화살표 키 혹은 Ctrl+p 키를 누르면 이전에 사용했던 명령이 나올 것이다. 이전에 사용했던 명령을 찾아 단순히 엔터 키만 쳐 주면 된다.

3-5. 끝줄 모드의 사용

이미 끝줄 모드에서 사용하는 명령어를 몇 가지 배웠다. 명령 모드에서 `:'를 입력하면 아래와 같이 화면 맨 아래에서 입력하는 글자들이 보일 것이다.

~
~
~
:wq
[영어][완성][세벌식]

이와 같은 모드를 `끝줄 모드' 혹은 `ex 모드'로 따로 구분해서 부르기도 한다. 끝줄 모드에서 많이 사용하는 명령어를 정리하면 다음과 같다. 특정 패턴을 다른 패턴으로 교체하는 방법은 이미 위에서 정리하였으므로 다시 하지 않겠다.

:q<CR> vi를 종료함
:w<CR> 편집중인 문서를 저장
:w [file]<CR> 편집중인 문서를 [file]로 저장
:w >> [file]<CR> 편집중인 문서를 [file]에 덧붙여서 저장
:e [file]<CR> [file]을 불러옴
:e#<CR> 이전에 편집하던 파일을 불러옴
:e%<CR> 현재 파일을 다시 불러옴, 즉 저장하지 않은 작업 취소
:r [file]<CR> [file]을 커서위치에 끼워넣기
:set [option]<CR> [option]을 켜기
:set [nooption]<CR> [option]을 끄기
:![command]<CR> [command] 실행
:r ![command]<CR> [command] 실행 결과를 끼워넣기

예를 들어 현재 위치에 날짜와 시간을 삽입하고 싶으면

:r !date<CR>

를 입력한다. 만약 phone 이라는 파일을 정렬하여 삽입하고 싶으면

:r !sort phone<CR>

를 입력하면 된다. 앞에서 이미 `set'명령에 사용할 수 있는 옵션을 몇 가지 배웠다. `number'와 `wrapscan'이 생각나지 않는다면 앞장으로 되돌아가 확인하기 바란다. 다른 유용한 옵션들은 다음 장에서 설명하겠다.

4. vi의 고수로

지금까지 배운 내용만 사용하더라도 이제 vi를 다른 범상한 편집기와는 비교도 할 수 없을 만큼 편리하게 사용할 수 있다. 이 정도만으로도 친구에게 자랑할 수 있을 것이다. 그러나 이 정도만으로는 아직 `나는 vi의 고수다!' 라고 말하기는 좀 부끄러운 감이 있다. 모든걸 정리하는 마음으로 앞에서 열어 두었던 큼지막한 파일을 닫고 새 파일을 열자. 만약 vi를 종료했다가 다시 실행하는 사람이 있다면 정말 필자는 삶이 허무해진다! 다음과 같이 타이프한다.

:e newfile<CR>

4-1. 상용구 사용

아래아 한글에 `상용구'라는 기능이 있다. 이 기능을 사용하는 사람이 얼마나 될지는 잘 모르겠지만, 아무튼 vi에도 이런 기능이 있다. 다음과 같이 타이프해 보자.

:ab kuls Korea University Linux Study<CR>

이제 입력 모드로 전환해 `I'm a member of kuls.'를 입력하자. `kuls'를 타잎하는 순간 `Korea University Linux Study'로 바뀔 것이다. 등록된 상용구를 해제하는 방법은 다음과 같다.

:unab kuls<CR>

등록된 상용구를 보여주는 명령은 다음과 같다.

:ab<CR>

만약 여러 줄을 상용구로 지정하고 싶다면 다음과 같이 한다. ^M을 타이프할때는 먼저 Ctrl+v를 누른 후 이어서 Ctrl+m을 누른다.

:ab kuls2 Korea University^MLinux Study<CR>

4-2. 매크로 사용

vi의 특징중 한 가지는 있을법한 기능은 다 있다는 것이다. 아래아 한글에서 `매크로'를 이용하는 사람이 있을지 모르겠다. vi에서도 매크로를 이용할 수 있다. 다음과 같이 타이프 해 보자. `#2'는 <F2>키를 의미한다. 그냥 `<F2>' 라고 쓰면 되는 경우도 있고 안 되는 경우도 있다.

:map #2 dwelp<CR>

이제 다음 문장의 the에서 <F2>키를 눌러보자.

You can the type letter.

아래와 같이 바뀔 것이다.

You can type the letter.

매크로에서는 <CR>, <ESC>등 모든 키 입력을 포함시킬 수 있다. 매크로에서 <CR>키를 입력하려면 Ctrl+vCtrl+m을 연속으로 타이프한다. <ESC>키를 입력하려면 Ctrl+v를 누른 후 Ctrl+[키를 누른다.

vi에서는 명령 모드에서 사용하는 매크로와 입력 모드에서 사용하는 매크로를 따로 지정할 수 있다. 입력 모드에서 사용하는 매크로는 다음과 같이 지정한다.

:map! x sequence<CR>

위의 예에서는 xsequence로 정의한다. 매크로를 해제할때는 다음 명령을 이용한다.

:unmap! x<CR>

매번 이렇게 매크로를 지정해 주는 것은 귀찮은 일이다. vi를 실행할 때마다 매크로가 실행되어 있게 하려면 홈 디렉토리의 .exrc 파일에 넣어두면 된다. 다음은 LaTeX을 자주 사용하는 필자의 .exrc파일의 일부이다.


" LaTeX을 위한 매크로

" 를 누르면 Visual selection으로 선택된 부분만 컴파일하여 xdvi로 보여줌
map  ^[:1,?^\\begin{document}$?w! _region_.tex^M;;R1
map ;;R1 :'<,'>w >> _region_.tex^M;;R2
map ;;R2 :/^\\end{document}$/w >> _region_.tex^M;;R3
map ;;R3 :!latex _region_.tex; xdvi -expert _region_.dvi; rm _region_.???^M^M

" 을 누르면 현재 편집중인 문서를 컴파일하여 xdvi로 보여줌
map  :w^M:!latex %; xdvi -expert %<.dvi^M^M

" 을 누르면 컴파일된 문서를 ps로 출력하여 gv로 미리보기
map  :!dvips -o %<.ps %<.dvi; gv %<.ps^M^M

" 를 누르면 변환된 포스트스크립트 문서를 pdf로 변환
map  :!ps2pdf %<.ps %<.pdf&^M^M

" 레이텍 문서 전처리부를 자동으로 만들어주는 매크로
map ;tex i\documentclass[a4paper]{article}^[;;T1
map ;;T1 o\usepackage{hangul,a4,indentfirst}^M\setlength{\parindent}{1em}^[;;T2
map ;;T2 o\addtolength{\hoffset}{-0.5cm}^M\addtolength{\textwidth}{1cm}^[;;T3
map ;;T3 o\kscntformat{section}{}{}^M\linespread{1.3}^M^[;;T4
map ;;T4 o\begin{document}^M^M\end{document}^[ki

" 글꼴에 관계된 매크로
map ;rm i\textrm{^[Ea}^[B
map ;tt i\texttt{^[Ea}^[B
map ;sf i\textsf{^[Ea}^[B
map ;bf i\textbf{^[Ea}^[B
map! ;rm \textrm{
map! ;tt \texttt{
map! ;sf \textsf{
map! ;bf \textbf{

" 환경(Environment)에 관계된 매크로
map! ;itemize \begin{itemize}^M\end{itemize}^[O \item
map! ;enumerate \begin{enumerate}^M\end{enumerate}^[O \item
map! ;description \begin{description}^M\end{description}^[O \item[
map! ;equation \begin{equation}^M\end{equation}^[O \label{eq:}^[i
map! ;tabular \begin{tabular}[center]{}^M \hline^M\hline^M^H\end{tabular}^[3k$i
map! ;figure \begin{figure}[!hbp]^M\end{figure}^[O
map! ;table \begin{table}[!hbp]^M\end{table}^[O
map! ;verbatim \linespread{1}\begin{verbatim}^M\end{verbatim}\linespread{1.3}^[O

" 특수문자 입력을 간편하게 하기 위한 상용구
ab ;\ $\backslash$
ab ;~ \textasciitilde

4-3. vi 설정

vi의 설정 파일은 /etc/vimrc 파일과 홈 디렉토리의 .vimrc 파일이다. 만약 GUI 버전의 vi를 사용한다면 /etc/gvimrc 파일과 .gvimrc파일로 설정할 수 있다. 앞에서 이미 vi를 설정하는 명령을 배웠고 몇 가지 옵션들도 이미 살펴보았다. 아래에서 다른 몇 가지 옵션들을 필자의 .vimrc 파일을 예로 들어 설명하겠다.


set autoindent      " 자동으로 들여쓰기를 한다.
set cindent         " C 프로그래밍을 할때 자동으로 들여쓰기를 한다.
set smartindent     " 좀더 똑똑한 들여쓰기를 위한 옵션이다.
set textwidth=79    " 만약 79번째 글자를 넘어가면 \
set wrap            " 자동으로 <CR>를 삽입하여 다음 줄로 넘어간다.
set nowrapscan      " 검색할 때 문서의 끝에서 다시 처음으로 돌아가지 않는다.
set nobackup        " 백업 파일을 만들지 않는다.
set visualbell      " 키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍이게 한다.
set ruler           " 화면 우측 하단에 현재 커서의 위치(줄,칸)를 보여준다.
set tabstop=4       " Tab을 눌렀을 때 8칸 대신 4칸 이동하도록 한다.
set shiftwidth=4    " 자동 들여쓰기를 할때 4칸 들여쓰도록 한다.

" 아래는 한글을 제대로 처리하기 위해 필요하다.
if $LANG[0] == `k' && $LANG[1] == `o'
  set fileencoding=korea
endif

"터미널이 xterm-debian 혹은 xterm-xfree86일 경우 컬러를 사용한다.
if &term =~ "xterm-debian" || &term =~ "xterm-xfree86"
  set t_Co=16
  set t_Sf=^[[3%dm
  set t_Sb=^[[4%dm
  set t_kb=^H
  fixdel
endif

"문법 강조 기능을 사용한다.
if has("syntax")
  syntax on           " Default to no syntax highlightning 
endif

4-4. vim의 특별한 기능

vi의 클론인 vim에는 원래의 vi에는 없지만 편리하게 사용할 수 있는 많은 기능들이 있다. 문법 강조 기능도 원래의 vi에는 없는 기능이다. vim의 기능 중 `Visual Selection' 이라는 기능이 있다. 명령 모드에서 v를 누른 후 커서를 움직여 보자. 아래아 한글의 `블럭'처럼 역상으로 움직인 범위에 있는 글들이 선택될 것이다. 이 상태에서 y, c, d 키를 눌러 선택된 범위의 글들을 복사, 교체 또는 삭제할 수 있다.

프로그래밍에 편리하게 사용할 수 있는 기능으로 탭을 끼워넣거나 취소하는 기능이 있다. 만약 커서가 있는 줄에서부터 5줄에 탭을 끼워넣으려면 다음과 같이 타이프한다.

5>>

이를 취소하려면 다시 다음을 타이프한다. 물론 그냥 u를 입력해도 된다. 그러나 여기서는 어떻게 동작하는지 보자는 것이므로 `5<<'를 입력한다.

5<<

Visual Selection 기능과 결합해서 사용하면 좀더 편리하게 사용할 수 있다. v를 눌러 들여쓰기할 범위를 선택한 다음 >를 타이프하면 선택된 범위가 들여쓰기 될 것이다.

4-5. 정규식(Regular Expression)

vi의 검색 및 교체 기능에서 `정규식(Regular Expression)'이라는 특별한 표현을 사용할 수 있는데 이를 사용하면 보다 효과적인 검색/교체를 할 수 있다. 정규식은 vi 뿐만 아니라 다른 명령어에서도 많이 쓰이므로 알아두면 편리하다. 그러나 정규식에 대한 내용만으로도 1시간 강의는 충분히 할 수 있다. 여기서는 간단한 사용법만을 이야기하고 넘어가겠다.

우선 정규식에서 많이 쓰이는 기호는 다음과 같다.

^ 줄의 처음을 나타낸다.
$ 줄의 끝을 나타낸다.
. 아무 글자나 한 글자를 나타낸다.
[...] [] 사이에 있는 글자 중 하나
* * 앞의 내용이 0번 이상 반복됨
\{min,max\} min 이상 max 이하의 횟수만큼 반복됨

예를 들어 줄의 맨 처음에 나오는 `linux'만 검색하고 싶다면 다음과 같이 입력한다.

/^linux<CR>

만약 3~5자리로 이루어진 모든 숫자를 검색하고 싶다면 다음과 같이 입력한다.

/[0123456789]\{3,5\}<CR> 혹은 /[0-9]\{3,5\}<CR>

만약 `ab'로 시작하는 소문자로 되어 있는 모든 단어를 삭제하려면 다음과 같이 입력한다.

:%s/ab[a-z]*//g<CR>

5. 맺음말

vi의 고수가 되기 위해서 위의 내용을 무조건 외우려고 하지 말라. j 키가 무슨 역할을 하느냐고 필자에게 물어본다 해도 곧바로 대답할 수 없을 것이다. 머리로 외우려고 하지 말고 감으로 익혀야 한다. 한꺼번에 모든것을 익히려 하지 말고 일단 어떤 어떤 기능이 있다는 것 정도만 알아두라. 그리고 직접 문서를 편집하면서 그때그때 사용 방법을 찾아보자. 처음에는 좀 귀찮겠지만, 그러는 사이 실력이 늘 것이다. 열심히 연습하면 얼마 지나지 않아 윈도우용 vi를 찾아다니게 될 것이다. 그러면 성공이다! vi의 고수가 되자!

WRITTEN BY
가별이
내가 천사의 말 한다 해도

,