'업무 > 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 설정하기 (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 |
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)을 바꾸지 않는 한 자유롭게 배포 가능합니다
유닉스 / 리눅스 개발자를 위한 "유닉스 리눅스 프로그래밍 필수 유틸리티" (0) | 2010.10.28 |
---|---|
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 |
유닉스 / 리눅스 개발자를 위한 "유닉스 리눅스 프로그래밍 필수 유틸리티" (0) | 2010.10.28 |
---|---|
vsftpd 설정하기 (0) | 2008.08.22 |
Linux 설정 두번째 (0) | 2008.07.10 |
Linux IP 설정 파일들 (0) | 2008.07.08 |
Linux에서 path 잡는다고 삽질했습니다. (0) | 2008.05.19 |
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) ] |
작성자 : 좋은진호(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 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 |
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.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
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 |
Fedora Core 6에서 고정 IP 잡기 (2) | 2008.07.10 |
---|---|
Linux 설정 두번째 (0) | 2008.07.10 |
Linux에서 path 잡는다고 삽질했습니다. (0) | 2008.05.19 |
27일자 임베디드 리눅스 교육 자료 (0) | 2008.03.27 |
26일자 임베디드 리눅스 수업 내용(예습용) (0) | 2008.03.26 |
Linux 설정 두번째 (0) | 2008.07.10 |
---|---|
Linux IP 설정 파일들 (0) | 2008.07.08 |
27일자 임베디드 리눅스 교육 자료 (0) | 2008.03.27 |
26일자 임베디드 리눅스 수업 내용(예습용) (0) | 2008.03.26 |
25일자 임베디드 Linux Source 예제 (0) | 2008.03.26 |
Linux IP 설정 파일들 (0) | 2008.07.08 |
---|---|
Linux에서 path 잡는다고 삽질했습니다. (0) | 2008.05.19 |
26일자 임베디드 리눅스 수업 내용(예습용) (0) | 2008.03.26 |
25일자 임베디드 Linux Source 예제 (0) | 2008.03.26 |
VI 에디터 사용법 (2) | 2008.03.19 |
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 |
Linux IP 설정 파일들 (0) | 2008.07.08 |
---|---|
Linux에서 path 잡는다고 삽질했습니다. (0) | 2008.05.19 |
27일자 임베디드 리눅스 교육 자료 (0) | 2008.03.27 |
26일자 임베디드 리눅스 수업 내용(예습용) (0) | 2008.03.26 |
VI 에디터 사용법 (2) | 2008.03.19 |
vi라는 이름은 `VIsual display editor'를 의미한다. vi는 버클리의 어느 천재가 만들었다고 한다. vi를 만들던 시절에는 ed와 같은 라인 에디터가 일반적이었다. 그 옛날 옛적 도스의 `edlin' 이라는 라인 에디터를 써 본 사람이라면 라인 에디터가 얼마나 불편한지 알 것이다. 유닉스처럼 텍스트 에디터와 포매터가 분리된 환경에서는 텍스트 에디터의 비중이 크기 때문에 기능 면에서도 많은 요구가 있게 마련이다. 때문에 텍스트 에디터가 워드 프로세서의 기능의 상당 부분을 가지게 되었다. 유닉스에 여러가지 종류가 있듯이 vi도 여러가지 클론이 만들어졌다. 요즘 대부분의 배포판에는 vim이라는 vi의 클론이 포함되어 있다. vim은 완벽하게 한글을 지원하고 원래의 vi의 기능을 충실하게 갖고 있을 뿐만 아니라 여러가지 좀더 편리한 툴들을 제공한다.
~ ~ ~ ~ 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'를 차례로 타이프하면 된다.
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>'키를 눌러 일단 명령모드로 돌아온 후 다시 시작하도록 한다.
h | 한칸 왼쪽으로 이동 | l | 한칸 오른쪽으로 이동 |
j | 한줄 아래로 이동 | k | 한줄 위로 이동 |
w | 다음 단어의 첫 글자로 이동 | W | 다음 단어의 첫 글자로 이동 |
b | 이전 단어의 첫 글자로 이동 | B | 이전 단어의 첫 글자로 이동 |
e | 단어의 마지막 글자로 이동 | E | 단어의 마지막 글자로 이동 |
^ | 그 줄의 첫 글자로 이동 | $ | 그 줄의 마지막 글자로 이동 |
0 | 그 줄의 처음으로 이동 | <CR> | 다음 줄의 첫 글자로 이동 |
+ | 다음 줄의 첫 글자로 이동 | - | 윗줄의 첫 글자로 이동 |
( | 이전 문장의 첫 글자로 이동 | ) | 다음 문장의 첫 글자로 이동 |
{ | 이전 문단으로 이동 | } | 다음 문단으로 이동 |
단어 단위 이동 명령에서 대문자 명령은 소문자 명령과 약간 차이가 있다. 대문자 명령은 무조건 띄어쓰기 전까지를 한 단어로 취급한다. 다시 말해 I'm a member of "KULS"에서 w, b, e가 I / ` / m / a / member / of / " / KULS / " 를 각각 한 단어로 취급하는 데 반해 W, B, E는 I'm / a / member / of / "KULS" 를 한 단어로 취급한다. 또, vi는 빈 줄이 나오기 전까지를 한 문단으로 취급한다. 즉, {를 누르면 이전 빈 줄로, }를 누르면 다음 빈 줄로 이동한다.
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이다. ~ ~
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 ~ ~
현재 작성되어 있는 글에 영향을 미치지 않고 글을 복사하는 방법은 c나 d 대신 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 ~
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를 빠져나올 수 있을 것이다.
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를 눌러보자.
앞 장에서 이미 커서 이동 명령을 배웠다. 그러나 커다란 문서에서 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-도 한번씩 눌러보자.
ma | 현재 위치를 `a'로 마크 | ||
`a | 마크된 `a'로 이동 | 'a | 마크된 `a'가 있는 줄의 처음으로 이동 |
`` | 직전의 커서 위치로 이동 | '' | 직전에 커서가 위치하던 줄의 처음으로 |
"[n]p 혹은 "[n]P
즉, 붙여넣기 전에 "[n]을 붙여주면 된다. 만약 어떤 버퍼에 저장된 내용을 붙여넣어야 할지 잘 모르겠으면 다음과 같이 해보면 자동적으로 버퍼의 번호를 증가시킬 수 있다.
"1pu.u.u.u.
위에서 이야기한 9개의 버퍼 외에도 vi에서는 a부터 z까지 이름이 붙은 26개의 버퍼를 더 사용할 수 있다. 만약 현재 줄부터 3줄을 버퍼 `a'에 복사 싶다면 "a3yy를 입력한다. 현재 커서의 위치에서 줄의 끝까지 지우면서 그 내용을 버퍼 `b'에 저장하고 싶다면 "bD를 입력하면 된다. 버퍼에 있는 내용을 붙여넣는 방법은 앞에서 설명한 9개의 버퍼와 같다. 만약 버퍼 `a'에 있는 내용을 붙여넣고 싶다면 "ap를 입력하면 된다.
보다 많이 쓰이는 검색 방법은 문서 전체에서 특정 패턴을 찾는 방법이다. 문서 전체에서 특정 패턴을 찾는 방법을 정리하면 다음과 같다.
/[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>과 동일 |
:!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 키를 누르면 이전에 사용했던 명령이 나올 것이다. 이전에 사용했던 명령을 찾아 단순히 엔터 키만 쳐 주면 된다.
~ ~ ~ :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'이 생각나지 않는다면 앞장으로 되돌아가 확인하기 바란다. 다른 유용한 옵션들은 다음 장에서 설명하겠다.
:e newfile<CR>
: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>
:map #2 dwelp<CR>
이제 다음 문장의 the에서 <F2>키를 눌러보자.
You can the type letter.
아래와 같이 바뀔 것이다.
You can type the letter.
매크로에서는 <CR>, <ESC>등 모든 키 입력을 포함시킬 수 있다. 매크로에서 <CR>키를 입력하려면 Ctrl+v와 Ctrl+m을 연속으로 타이프한다. <ESC>키를 입력하려면 Ctrl+v를 누른 후 Ctrl+[키를 누른다.
vi에서는 명령 모드에서 사용하는 매크로와 입력 모드에서 사용하는 매크로를 따로 지정할 수 있다. 입력 모드에서 사용하는 매크로는 다음과 같이 지정한다.
:map! x sequence<CR>
위의 예에서는 x를 sequence로 정의한다. 매크로를 해제할때는 다음 명령을 이용한다.
: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
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
프로그래밍에 편리하게 사용할 수 있는 기능으로 탭을 끼워넣거나 취소하는 기능이 있다. 만약 커서가 있는 줄에서부터 5줄에 탭을 끼워넣으려면 다음과 같이 타이프한다.
5>>
이를 취소하려면 다시 다음을 타이프한다. 물론 그냥 u를 입력해도 된다. 그러나 여기서는 어떻게 동작하는지 보자는 것이므로 `5<<'를 입력한다.
5<<
Visual Selection 기능과 결합해서 사용하면 좀더 편리하게 사용할 수 있다. v를 눌러 들여쓰기할 범위를 선택한 다음 >를 타이프하면 선택된 범위가 들여쓰기 될 것이다.
우선 정규식에서 많이 쓰이는 기호는 다음과 같다.
^ | 줄의 처음을 나타낸다. |
$ | 줄의 끝을 나타낸다. |
. | 아무 글자나 한 글자를 나타낸다. |
[...] | [과 ] 사이에 있는 글자 중 하나 |
* | * 앞의 내용이 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>
Linux IP 설정 파일들 (0) | 2008.07.08 |
---|---|
Linux에서 path 잡는다고 삽질했습니다. (0) | 2008.05.19 |
27일자 임베디드 리눅스 교육 자료 (0) | 2008.03.27 |
26일자 임베디드 리눅스 수업 내용(예습용) (0) | 2008.03.26 |
25일자 임베디드 Linux Source 예제 (0) | 2008.03.26 |