Multi cluster의 node 들이 과열이나 예상치 못한 이상으로 인해, 접속이 안될 경우, scheduling된 job들은 server에 계속 남아 client로 job을 계속 던진다. 이 경우, server를 재시작해도, job들은 초기화 되지 않는다. 이 문제를 해결하기 위해 아래와 같이 server에서 job들을 reset 해주어야 한다.
제 목 : vsftpd 설치와 운영 (한글로그 패치 포함) 작성자 : 좋은진호(truefeel, http://coffeenix.net/ ) 작성일 : 2003.10.01(수)
이 글은 7월에 썼던 'vsftpd에서 한글파일로그와 lastlog 로긴확인하기'를 기초로 작성하였다.
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와 함께 사용할 때) - ...
1. vsftpd 설치 ※ 설치는 Redhat 기준. 솔라리스의 PAM에 대한 것은 README.solaris 파일 참조한다.
------------------------------------------------------------- # 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/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 -------------------------------------------------------------
2. vsftpd.conf 의 주요 설정
------------------------------------------------------------- # anonymous 사용자의 접속 허용 여부 (default = YES) # 공개된 형태의 FTP 서버로 운영할 것이 아니라면 NO로 한다. anonymous_enable=NO # 로컬 계정 사용자의 접속 허용 여부 (default = NO) local_enable=YES
# 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.
# ------------------------------------------------------------------- # 기본 설정 파일에는 없는 설정값으로 필요한 설정만 추가한다. # ※ 중요한 설정은 굵은 글씨로 표시 # -------------------------------------------------------------------
# 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 -------------------------------------------------------------
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(그 이외 유닉스)
9. 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기 ps -aux | sort +4n 또는 ps -aux | sort +5n
10. FTP로 들어온 사용자 확인하기 ftpwho,ftpcount
11. 원하지 않는 사용자 죽이기 skill -KILL sunny 위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는
skill -KILL -v pts/14 이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.
12. less 결과를 vi로 보기 less상태에서 v를 누르면 바로 vi로 감
13. vi에서 블럭 설정하기 alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다. 또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다. 블럭을 설정 하신 뒤,
삭제를 하려면 x 복사를 하려면 y 붙여넣기는 p
14. man 페이지 프린트하기 man -t vi 0.0.0.15 ping 무시하기 echo 1 0.0.0.16 LILO 다시 살리기 boot : vmlinuz root=/dev/hda6
17. 특정 사용자 ftp 접근 막기 /etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.
18. X 윈도우에서 TV보기 리눅스에서 TV보기 위해서는 드라이버 파일과 TV를 보는 프로그램이 필요합니다. 이 글에서는 미지 리눅스 OS에 탑재된 bttv 칩셋을 사용하는 TV 카드를 기준으로 설명합니다. 만일 커널을 새로 컴파일 하실 분은 반드시 Character devices -
alias char-major-81 bttv # 필립스 튜너의 경우 pre-install bttv modprobe -k tuner # 알프스 튜너의 경우 pre-install bttv modprobe -k tuner type=9
이제 kwintv나 xawtv 등의 TV 시청 프로그램으로 TV를 볼 수 있습니다. 만약 TV 장치를 찾지 못하는 오류가 있다면 bttv driver 디렉토리에 포함된 MAKEDEV 를 실행하십시오.
19. ls라는 파일이 포함된 rpm패키지 찾기 일단 ls의 절대경로를 알아야 한다. which lswhich로 알아낸 ls의 절대경로로 rpm질의를 한다.
rpm -qf /bin/ls [root@piruks /etc]# which ls /bin/ls [root@piruks /etc]# rpm -qf /bin/ls fileutils-4.0i-2mz
20. 현재 rpm패키지의 의존패키지 rpm -qR 패키지명
21. 현재 디렉토리크기 du -h --max-depth=1 .
22. 바로 이전 디렉토리로 가기 cd -
23. 프로세스명으로 프로세스 죽이기 killall 프로세스명 kill -9 `pidof 프로세스명
24. 하드웨어 시계맞추기 배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다. 간단히 어느정도 정확한 시간을 설정하는 방법이다.
25. 원격에서 리모트서버의 X application실행시 X윈도 app를 실행할때 다음과 같은 에러가 나면 조치
[kang@dev /home/kang] xclock Xlib: connection to "211.222.186.170:0.0" refused by server Xlib: Client is not authorized to connect to Server Error: Can't open display: 211.222.186.170:0.0 export DISPLAY=211.222.186.170:0 xhost +211.222.186.170
26. 링크 파일 ln -sf 링크할디렉토리 링크로 만들어질 디렉토리 참고로 링크를 걸기만 한다고 접근가능한것은 아니고,링크가 걸린 디렉토리의 퍼미션도 허용으로 바꿔야 한다. 링크로 만들어질 디렉토리는 저절로 생성되고 퍼미션 777로 잡혔음.
ln -sf /www/dir_1/r_photo /www/dir_2/r_photo
27. ^M 문자 없애기 a = 1^M def vartest(a):^M a = a + 1^M return a^M a = vartest(a)^M print a^M Unix 류 기계에서는 그냥 ^J 하나만을 개행문자로 사용하는데 PC에서는 MJ 이렇게 두 제어문자가 연속으로 사용되어야 개행문자로 받아들이죠. (그래서 PC쪽에서 만들어진 txt문서를 유닉스 기계로 불러와 vi 등을 실행하면 줄 끝마다 보기싫은 ^M이 붙습니다. 뭐 vi에서 요거 지우는건 간단하지만요.)
PC에서 Unix에서 작성한 텍스트 문서를 보통 ftp로 받아오거나 하면 워드패드 등에서 봤을 때 전혀 개행이 되어있지 않지요. 하지만 MS Word 등 좀더 강력한 편집기에선 대개 잘 처리해서 잘 보여줍니다.
위 는 간단한 Python 소스입니다. 위의 경우 처럼 ^M문자가 있을때, dos2unix라는 유틸리티를 많이 사용하기도 하죠. 하지만 vi에서 간단하게 모두 삭제할수도 있습니다. dos2unix가 없거나 빠져나가서 지우는게 귀찮을때 좋겠죠.
명 령은 :%s/(ctrl+v)M//g 입니다. (ctrl+v)M 이거는 ctrl과 v를 눌러준후, ctrl키를 떼지 말고 바로 m을 눌러주시믄 됩니다. 위는 정규표현식을 이용한것이고, 형식은 %s/이것을/요걸로/g 입니다 그럼 문서안의 모든 "이것을" "요걸로" 바꾸게 되죠. 단, M의 경우 ctrl+M의 뜻인데 단순히 문자로 M을 바꾸라도 해도 인식을 못하기 때문에, 위처럼 (ctrl+v)M 으로 해주셔야 합니다.
28. 비어있는 행을 찾기 #grep -n '^$' filename 정 규표현 의미 ^ 행의 처음 $ 행의 끝 . 임의의 한 문자 [...] ... 안의 임의의 한 문자. a-z,0-9 같은 범위도 사용 [^..] .. 안에 없는 임의의 한 문자. 범위 사용가능 r* 0회 이상 r 반복 r+ 1회 이상 r 반복 r? 0 혹은 1회의 r r{n,m} n회 이상 m회 이하 r 반복 r1|r2 r1 혹은 r2 (egrep 만) (r) r 의 정규표현(egrep 만)
29. =====> 맨아래..
30. 각자가 사용하는 컴퓨터의 정보를 알고 싶을때 [root ...]#more /proc/cpuinfo 위와 같이 치면 사용자의 컴퓨터 정보를 볼수 있으며,
[root ...]#more /proc/meminfo 라고 치면 사용자의 메모리 정보를 볼수 있습니다.
31. 전체 메일 먼 저 보낼 내용을 텍스트로 파일로 만들어야 합니다.어디에서든지 가능하지요! [root@aromi /root]# vi nea 안녕하세요! 저희 서버에서는 웹서버를 오늘부터 시작합니다. 사용자 여러분의 많은 관심과 이용을 부탁드립니다.
:wq [root@aromi /root]#
만약, 한글을 사용하지 못하면 윈도우95에서 먼저 쓴다음에 ftp를 이용해서 올리면 됩니다. [root@aromi /root]# mail -s "[공지]" `cat /etc/passwd|gawk ?F :'{print$1}'`
[공지]-
32. 디렉토리만 빠르게 검색 ls -al | grep "^d"
33. 호스트 네임 바꾸기 /etc/HOSTNAME file은 부팅시 /etc/sysconfig/network file 의 HOSTNAME 부분을 참조하여 저장합니다. 호스트 네임을 바꾸고자 한다면 /etc/sysconfig/network file 의 HOSTNAME 부분을 바꿔주면 됩니다.
[root@linux /root]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME="linux" GATEWAY="" GATEWAYDEV="" FORWARD_IPV4="yes" 바꾸신후 시스템을 재부팅 하신거나, #/etc/rc.d/init.d/network restart 명령을 내리시면 됩니다.
34. 틀린명령어 틀린글자만 바꿔서 실행 # ./configure --prefax=/usr/local/apache 앗, 틀렸습니다. prefax가 아니라 prefix인데... 고쳐야지요...간단하게 화살표키로 왔다갔다 하면서 지워지고 바꿔주면 되겠지만 다른 방법이 있습니다. # ^fax^fix^ 라고 하면... -
35. 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어 [root@aromi /root]# uname -a
36. 열려있는 포트 알아내기 netstat -anp | grep LISTEN
37. 텔넷 모든 접속자에게 메세지 보내기 wall 내용... Ctrl-D
38. lsof는 열려있는 파일을 나타내 주는 옵션 여기에 보안 점검을 위하여, -i 옵션을 사용하면, 현재 열려 있는 포트와 링크되어 있는 서비스 또는 프로그램이 모두 나타나죠. 자신이 열어 놓지 않은 포트가 열려있다던지하면 한번쯤 의심해 봐도 되겠죠?
39. 사용자가 어디에서 무엇을 하는지 알아내기 w라는 명령어를 사용하시면 된답니다. 이 때, w [-s] 를 붙여주시면 -s 옵션이 긴 정보 대신에 필요한 짧은 정보만 알려 준답니다.
40. 텔넷 화면 수정 로그인화면: /etc/issue.net 로그인후화면: /etc/motd
41. 하위 디렉토리 한꺼번에 만들기 mkdir -p music/koreanmusic/ost
42. 특정디렉토리의 모든 파일 안의 특정 문자열 치환 for i in $*; do sed "s//opt/arm//opt/arm-linux/g" < $i > $i.new mv -f $i.new $i done
(chihwan.sh를 포함하지 않는 디렉토리면) find ./ -type f -exec 'chihwan.sh' {} ; s
43. killall 명령 시뮬레이션 (프로세스명으로 죽이기) ps aux | grep 프로세스명 | grep -v grep | awk '{ print $w }' | xargs kill -9 모든 프로세스 나열 지정한 프로세스만 뽑아냄 grep 명령이 포함된 라인 제거 awk로 두번째 필드만 뽑아냄 xargs에 의해 걸러진 아이디로 죽임
45. vi 검색, 치환 구호스트 서비스 오늘 날짜에서 분류코드가 110100인 파일 찾기 :%s/./U&/g 모든문자-
46. 파일내의 중복되는 행을 제거 : uniq 입 력 파일에서 연속되는 행을 비교하여, 두 번째 이상의 동일한 행들을 제거하고 나머지는 출력파일로 출력 연속되어 표시되지 않으면 동일한 행이 존재할 수 있음. sort 명령을 사용하여 정렬한 후 사용하는 것이 타당 사용법uniq [-cdu] [+|숫자] [입력파일 [출력파일]] -c : 각 행이 연속적으로 나타난 횟수를 행의 시작부분에 표시 -d : 연속적으로 반복되는 행만 출력 -u : 연속적으로 반복되지 않는 행만 출력 +숫자 : 행의 처음 '숫자' 만큼의 문자는 무시 -숫자 : 행의 처음 '숫자' 만큼의 필드는 무시
47. 파일의 결합 여러 개의 텍스트 파일을 하나의 파일로 순차적으로 묶는데 사용 cat [파일명1] [파일명2] ...
% cat
행단위 결합 : paste 여러 파일에 대해여 행간 결합을 수행하거나 하나의 파일에 대해 연속되는 행들을 결합 둘이상의 파일에 대해서 테이블상의 하나의 열과 같이 취급하여 동일한 행번호 끼리 결합
paste [파일명1] [파일명2].. paste -d리스트 [파일명1] [파일명2] ... paste -s [-d리스트] [파일명] d : 행간 결합시 행간 구분문자들의 리스트 s : 한파일의 연속되는 행을 결합
% cat
두 파일을 동일한 필드 값에 따라 행 단위 결합 : join
관 계형 데이터 베이스에서의 join 연산과 동일 키로 사용할 필드에 대해 정렬된 두 파일의 각 행에 대해 동일한 키 값을 갖는 행들을 결합 입력으로 사용될 두 파일은 키 값에 대해 오름 차순으로 정렬되어 있어야 함 출력 결과는 기본적으로 키 값이 먼저 표시되고, 첫번째 파일에서 키를 제외한 나머지 필드, 두번테 파일에서 키를 제외한 나머지 필드가 표시 필드 구분은 공백, 탭, 개행문자가 기본, 연속적으로 나타날 경우 하나로 취급
% cat
48. 파일의 암호화 : crypt 파일을 암호화 하여 키를 알지 못하는 사람은 내용을 볼 수 없도록 함 표준 입출력 사용
% cat < crypt.data1 Enter key:hello test test 안녕하십니까? %
51. 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기 ls *.* | awk '{print "mv",$1, $1 }' |
sed "s/ ([a-zA-Z0-9]*).([a-zA-Z0-9]*)$/1._2/g" 현재디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾼다. 더 간단하게
ls *.* | sed "s/([a-zA-Z0-9]*).([a-zA-Z0-9]*)/mv 1.2 1._2/g" --------------------------------------------------------------------------------
52. 어제 날짜 구하기 $ date -v-1d "+%Y-%m-%d" [컴퓨터분류]
53. 원하지 않는 사용자 죽이기 [root@dream /root]# skill -KILL sunny 위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는
[root@dream /root]# skill -KILL -v pts/14 이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.
54. UNIX상에서 한글출력이 깨져 나올경우 유 닉스상에서 한글을 stdout출력할 경우 가끔 출력되는 문자들이 몽땅 깨져서 나오는 경우가 있다. 이때부터는 프로그램이 종료된 이후에도 쉘 프람프트를 비롯, 쉘에서 입력하는 모든 커맨드가 깨져서 나온다. 이는 ascii code 로 ^n 에 해당하는 문자가 출력될 때 나오는 현상으로 그 이후로는 MSB가 모두 켜지기 때문이다. 문자가 깨져나오는 이후부터 ascii code 로 ^o 에 해당하는 문자를 출력하면 반대로 된다. 쉘 커맨드 상에서라면, # echo ^v^o 라고 해야겠지만 커맨드가 깨져나오므로 shell이 해석을 못한다. 따라서, command line에서 ^v^o를 치고 enter 하면 된다
55. 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기
29. 기타 명령어 떼 alias(명령어 간소화하기) apropos(관련된 명령어 찾기) arch(컴퓨터 종류 알기) arp(같은 서브넷의 IP 보여주기) at(작업 시간 정하기) atd(계획성 있는 작업 실행하기) awk(특정 패턴 문자 처리하기) a2p(펄 파일로 바꾸기) badblocks(배드 블럭 검사하기) bc(계산기) biff(메일 수신 소리로 확인하기) bg(후면작업; 배경화면 설정) bind(키나 함수 순서 결합하기) break(루프 빠져나가기) cal(달력보기) builtin(내부 명령어 알아보기) case(조건 처리하기) cat(화면상에서 파일 보기) cd(디렉토리 변경하기) cfdisk(디스크 설정하기) chattr(파일 속성 변경하기) chfn(사용자 정보 변경하기) chgrp(파일, 디렉토리가 속했던 그룹 바꾸기) chmod(파일 권한 바꾸기) chown(파일 주인 바꾸기) chsh(지정된 셸 바꾸기) cksum(CRC값을 점검한다) clear(화면 청소하기) clock(CMOS 시각을 조정하기) cmp(파일 비교하기) colcrt(문자 변환 필터) colrm(열 삭제하기) column(가로 정렬하기) comm(파일 비교 출력하기) command(명령어 알아보기) continue(루프 계속돌기) cp(파일 복사하기) cpio(복사본 만들기) crontab(cron을 관리한다) csplit(파일에 서식, 규칙 정하기) cut(필요한 필드만 출력하기) date(날짜 보기) dd(블럭장치 읽고 쓰기) debugfs(ext2 파일 시스템 디버깅하기) declare(변수 선언하기) df(파일 시스템의 사용량 보기) dirs(디렉토리 목록 표시하기) dmesg(부팅 메시지 보기) dnsdomainname(DNS 이름 출력) domainname(NIS 이름 출력&설정) du(디렉토리와 파일의 용량 파악하기) dumpe2fs(파일 시스템 정보 보기) echo(표준 출력하기) eject(장치 해제하기) elm(메일 관련) enable(내부 명령어 지정) env(환경변수 출력하기) eval(인수 읽기) exec(셸 명령어 실행하기) exit(종료하기) expand(탭을 공백으로 변환하기) export(변수 지정하기) e2fsck(파일 시스템 복구하기) fc(지정된 편집기 받기) fdformat(플로피 디스크 포맷하기) fdisk(파티션 나누기) fg(지정된 작업을 전면 프로세스로 시작하기) file(파일 종류 보기) find(파일 찾기) finger(사용자 정보 알기) fold(정형화하기) fmt(정형화하기) for(반복 실행하기) free(메모리 사용량 알아보기) fsck(파일 시스템 검사하기) fstab(파일 시스템에 대한 고정적인 정보 저장하기) ftp(파일 전송 프로그램) fuser(프로세스 ID 출력) getkeycodes(매핑 테이블 출력하기) grep(특정 문자(열) 검색하기) gzexe(실행 파일 압축하기) gzip(압축하기) halt(시스템 종료하기) hash(기억해 두기; index 역할) head(파일의 앞부분 출력하기) help(도움말 보여주기) host(호스트 정보 보기) history(사용 명령어 목록보기) hostname(서버 이름 알기) id(계정 정보 알기) if(조건문 실행하기) ifconfig(랜카드에 주소 할당하기) imolamod(모듈 설치하기) inetd(인터넷 서비스의 최상위 데몬) init(실행 단계 정하기) ispell(철자법 검사하기) jobs(수행중인 프로세스 알기) kbd_mode(키보드 모드 출력하기) kill(프로세스 죽이기) klogd(커널 로그 데몬) ldd(공유 라이브러리의 의존성 알기) less(페이지 단위로 출력하기) let(정규식 표현하기) lilo(부팅하기) ln(링크하기) locate(패턴에 맞는 파일 찾기) login(로그인하기) logger(시스템 로그 기록하기) logname(사용자 로그인명 보여주기) logout(로그인 셸 종료하기) look(특정 단어 검색하기) losetup(중복 장치 확인하기) lpd(프린트 데몬) lpq(현재 프린트 작업 상태 출력하기) lpr(출력하기) lprm(대기열에 있는 문서 삭제하기) ls(디렉토리 내용보기) lsattr(파일 시스템의 속성 보여주기) lsdev(하드웨어 장치 출력하기) lsmod(모듈 정보 출력하기) mail(메일 관련) make(컴파일하기) man(매뉴얼 보기) mattrib mbadblocks mcd mcopy mdel mdeltree mdir mesg(메시지를 받을 수 있는지 확인하기) mformat minfo mkdir (디렉토리 만들기) mke2fs(파일 시스템 생성하기) mkfs(파일 시스템 만들기) mknod(특수 파일 만들기) mkswap(스왑 영역 지정하기) mlabel mmd mmount mmove mpartition mount(장치 연결하기) more(화면 단위로 출력하기) mrd mren mtoolstest mtype mutt(메일 관련) mv(파일 옮기기) mzip netstat(현재 네트웍 상황 보기) nice(프로세스 우선 순위 변경하기) od(8진수로 파일 보기) passwd(암호 입력하기) pidof(실행중인 프로그램의 프로세스 ID 찾기) pine(메일 관련) ping(네트웍 확인하기) popd(pushd 취소) ps(프로세스 纘?알기) pstree(프로세스 상관관계 알기) pwd(절대경로 보여주기) quota(디스크 한계량 알기) rarp(rarp 테이블 관리하기) rcp(원격 호스트에 파일 복사하기) rdev(루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기) rdate(네트웍으로 시간 설정하기) reboot(재부팅하기) rmmod(모듈 지우기) readonly(읽기 전용으로 표시하기) renice(프로세스 우선 순위 바꾸기) reset(터미널 초기화하기) restore(다시 저장하기) rlogin(바로 접속하기) rm(파일 지우기) rmdir (디렉토리 지우기) route(라우팅 테이블 추가/삭제하기) rpm(프로그램 추가/삭제) rpm2cpio(rpm을 cpio로 변환하기) rsh(원격으로 명령어 실행하기) rup(호스트 상태 출력하기) rusers(호스트에 로그인한 사용자 출력하기) rwall(호스트 사용자에게 메시지 뿌리기) script(기록하기) set(변수값 설정하기) setup(시스템 관련 설정하기) showmount(호스트의 마운트 정보 보여주기) shutdown(전원 끄기) sleep(잠시 쉬기) source(스크립트 번역하기) split(파일 나누기) ssh(암호화된 원격 로그인하기) stty(터미널라인 설정 보여주기) su(계정 바꾸기) suspend(셸 중단하기) swapoff (스왑 해제하기) swapon(스왑 활성화하기) sync(버퍼 재설정하기) syslogd(로그인 과정 설정하기) tac(거꾸로 보기) tail(문서 끝부분 출력하기) talk(이야기하기) tar(파일 묶기) tcpdchk(tcp wrapper 설정하기) tcpmatch(네트웍 요청에 대해 예측하기) tee(표준 입력으로부터 표준 출력 만들기) telnet(원격접속하기) test(테스트하기) times(셸에서의 사용자와 시스템 시간 출력하기) top(cpu 프로세스 상황 보여주기) tr(문자열 바꿔주기) true(종료 코드 리턴하기) type(유형 보기) ul(밑줄 처리해서 보여주기) ulimit(제한하기) umask(매스크 모드 설정하기) umount(장치 해제하기) unalias(별명 제거하기) uname(시스템 정보 보기) unexpand(공백 문자를 탭으로 변환하기) uniq(중복된 문장 찾기) useradd(사용자 계정 만들기) userdel(계정 삭제하기) usermod(사용자 계정정보 수정하기) unset(설정 변수 해제) uptime(시스템 부하 평균 보여주기) users(로그인된 사용자 보여주기) w(시스템에 접속한 사용자 상황 알아보기) wait(프로세스 기다리기) wall(모든 사용자에게 메시지 보내기) wc(문자, 단어, 라인수 세기) whatis(명령어의 간단한 설명보기) while(루프 명령어) who(사용자 알기) write(콘솔 상에서 간단한 메시지 보내기) xcopy(반복적으로 복사하기) XFree86 ypchfn(NIS에서 사용하는 chfn 명령어) ypchsh(NIS에서 사용하는 chsh 명령어) yppasswd(NIS에서 사용하는 passwd 명령어) zcat(압축 파일 보기) zcmp(압축 파일 비교하기) zforce(강제로 gz 만들기) zgrep(압축 상태에서 grep 실행하기) zmore(압축 상태에서 more 실행하기) znew(.Z 파일을 .gz로 다시 압축하기)
세상에서 제일 뛰어난 C 컴파일러 중 하나인 gcc 는 리눅스나 기타 자유 운영체제 에 있어 커다란 보배가 아닐 수 없습니다. 우리가 알고 있는 유닉스가 C 언어로 거의 다 만들어졌듯이 리눅스의 모국어는 바로 gcc 입니다.
사실 많은 분들이 리눅스 해커(hacker), 구루(guru)의 경지가 되고 싶어합니다. 그렇게 되길 원하신다면 리눅스의 모국어인 gcc 를 익히십시요. gcc 를 알면 리눅스를 아는 것이나 다름 없습니다. 사실 C 와 유닉스가 따로 떨어진 것이 아니라 어떻 게 보면 일심동체라고 할 수도 있듯이 gcc 와 리눅스는 일심동체라고 봐도 무방합니다.
C 언어! 이는 유닉스와 심지어 마이크로소프트 제품에 이르기까지( 어떤 식으로 변 질되었든 간에 ) 컴퓨터 세상의 ``만국 공통어''입니다. 여태까지 이러한 언어의 통일을 이뤄낸 것은 C 언어 밖에 없습니다. 컴퓨터 언어의 에스페란토를 지향하는 많은 언어들( 자바, 티클/티케이 )이 나오고 있으나 이는 두고 볼 일입니다. 그리 고 그 언어를 구사한다 할 지라도 C 언어는 역시나 ``기초 교양 언어''입니다.
여러분은 리눅스에서 gcc 를 통하여 그 동안 도스/윈도 환경에서 배운 엉터리 C 언 어를 잊으셔야 합니다. 감히 말하건데 그것은 C 언어가 아닙니다. C 언어는 만국 공통어야 함에도 불구하고 몇몇 회사들, 도스/윈도와 같은 환경에서 변질되어 각 환경마다 ``새로운 문법''을 배워야 하는 어처구니없는 사태가 벌어졌습니다. 터보 C 와 MS-C 를 배우면서 혼란도 많았고 그 뒤에 나온 녀석들은 완전히 다른 놈들이나 다름 없습니다.
지금 리눅스에서 여러분은 C 언어의 ``정통 소림권법''을 익히실 수 있습니다. 기초가 없이 비법만 전수받아 보았자 다른 곳에 가면 수많은 비법을 지닌 무림고수 들에게 여지없이 깨지기 마련입니다. 하지만 아무리 괴로와도 처음에 물 길어오는 것, 마당 쓰는 일부터 시작하면 철통같은 신체를 단련하기 때문에 온갖 꽁수 비법 으로는 여러분을 헤칠 수 없습니다. 또한 정통 권법을 연마한 사람은 기본기가 갖춰져 있으므로 대련 중에도 상대의 비법을 금방 간파하고 심지어 상대의 비법마저 자신의 것으로 하기도 합니다. ^^
--------------------------------------- gcc 에 대한 이야기 하나 ---------------------------------------
gcc 는 GNU 프로젝트에 의해 만들어진 작품의 하나로서 그 명성은 하늘을 찌를 듯 합니다. GNU 프로젝트의 산물 중 가장 멋진 것을 꼽으라면 저는 주저하지 않고 C 컴파일러의 최고봉인 gcc 를 지목할 것입니다.
실제로 gcc 의 명성은 뛰어나며 수많은 상용 회사들이 스폰서를 해주고 있다는 것을 아시는지요? 예를 들어 넥스트사( 지금은 사라짐 )의 새로운 C 언어인 ``오브젝티브 C''는 gcc 를 가져다 만든 것이며 FSF 측에 다시 기증되었습니다.
gcc 는 아주 강력합니다! 이미 상용 유닉스에 달려오는 AT&T 스타일, BSD 스타일의 C 언어 문법은 물론 ANSI C 를 기본으로 하여 모든 문법을 소화해낼 수 있으며 특유의 문법도 가지고 있습니다. 아주 구식 컴파일러, 아주 구식 문법도 소화해낼 수 있습니다. 이미 많은 사람들이 상용 유닉스에도 gcc 를 설치하여 사용하는 경우가 많지요. ( 물론 금전적인 문제가 많이 작용 ^^ )
gcc 는 매우 단순합니다. 어떤 의미로 이런 말을 하는가 하면, 터보 C/볼랜드 C 통합환경이나 윈도 환경의 비주얼한 환경을 제공하지 않는다는 것입니다. -.- 그들이 상당히 오토매틱한 성격을 갖는 반면, gcc 는 오로지 수동 스틱방식입니다. 각각의 장단점이 있지만 여러분이 일단 gcc 를 만나시려면 각오는 하고 계셔야 합 니다. 도스/윈도에서 보던 것을 원하지 마십시요. gcc 는 껍데기에 신경쓸 겨를조차 없습니다. gcc 는 오로지 명령행 방식만을 제공 합니다. 그리고 그 자체로 파워풀합니다. 개발 방향은 계속 ``뛰어난 능력''이지 겉모양 화장을 아닐 것입니다. ( 만약 겉모양을 원하신다면 그것은 여러분의 몫입니다. xwpe 같은 것이 그 좋은 예라고 할 수 있습니다 )
gcc 는 어떻게 보면 C 언어에 대한 개념이 서지 않는 사람에게는 무리인 C 컴파일 러인 듯 합니다. 기초 지식없이 사용한다는 것은 불가능에 가깝습니다. 하지만 C 언어를 확실하게 기초부터 배워서 어디서든 쓰러지지 않는 무림고수가 되기 위해서는 gcc 를 권합니다. 자잘한 무공을 하는 깡패가 되느냐? 아니면 정신을 지닌 무림고수가 되느냐?는 여러분의 선택에 달렸습니다.
gcc 가 어렵기만 한가? 하면 그렇지는 않습니다. gcc 는 상당한 매력을 지니고 있습니다. 그 매력으로 인해 한 번 빠지면 다른 컴파일러가 상당히 우습게 보이기까지 합니다. ( 그렇다고 다른 컴파일러를 비웃지는 마세요 ^^ 그거 쓰는 사람들이 자존심 상해서 엄청 화를 낼 테니까요. 개인적으로 gcc 에 대적할 수 있을 정도 되는 컴파일러는 와콤 C 컴파일러 정도? )
gcc 를 배우시려면 정신 무장(?)이 중요하다고 생각해서 이렇게 장황하게 읊었습니 다. 심플하게 배우면서 여러분의 리눅스, C 컴파일러에 대한 두려움을 하나씩 없애 고 C 언어 위에 군림하시기 바랍니다.
자, 이제는 잡담없이 시작합니다.
---------------------------------------
gcc 에 대한 기본 이해
---------------------------------------
명령행 상태에서 다음과 같이 입력해봅시다. 여러분이 사용하고 있는 gcc 버전은 알아두고 시작하셔야겠죠?
[yong@redyong yong]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs gcc version 2.7.2.1
[yong@redyong yong]$
( 위 공백은 보기 좋으라고 고의로 띄웠습니다. )
gcc -v 이라고 입력하니까 ``Reading specs from..'' 이라고 말하면서 그 결과값을 ``gcc version 2.7.2.1''이라고 말해주고 있습니다. ``Reading specs from...'' 자, 어디서 gcc 에 대한 정보를 읽어오는지 봅시다.
/usr/lib/gcc-lib/i386-linux/2.7.2.1/specs
gcc 를 여러분이 소스를 가져다 손수 설치해보신 적은 없을 것입니다. 보통은 바이너리 패키지로 된 것을 가져다 설치하지요. 나중에 정말 휴일에 너무 심심하다 싶으면 gcc 의 소스를 가져와서 컴파일해보십시요. 참, 재미있는 경험이 될 것입니다.
이미 여러분이 갖고 있는 gcc 를 가지고 새로운 gcc 를 컴파일하여 사용합니다. C 컴파일러를 가지고 새 버전의 C 컴파일러를 컴파일하여 사용한다! 이런 재미있는 경험을 또 어디서 해보겠습니까?
gcc 패키지가 어떤 것으로 구성되어 있는지... gcc 가 제대로 설치되어 있는지 알아보면 좋겠죠?
다음과 같습니다.
/lib/cpp --------> /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp ( 링크임 ) /usr/bin/cc --------> gcc ( 링크임 ) /usr/bin/gcc C 컴파일러 ``front-end'' /usr/bin/protoize /usr/bin/unprotoize /usr/info/cpp.info-*.gz GNU info 시스템을 이용하는 도움말 화일들 /usr/info/gcc.info-*.gz " /usr/lib/gcc-lib
마지막 /usr/lib/gcc-lib 디렉토리에 아래에 gcc 에 관한 모든 내용이 설치됩니다.
보통 다음과 같은 디렉토리 구조를 가집니다.
/usr/lib/gcc-lib/<플랫폼>/< gcc 버전 >
보통 우리는 리눅스를 i386 ( 인텔 환경 )에서 사용하고 있으므로 다음과 같이 나타날 것입니다.
/usr/lib/gcc-lib/i386-linux/2.7.2.1
( i386-linux, i486-linux, i586-linux 는 각기 다를 수 있습니다. 하지만 상관없는 내용입니다. 미친 척 하고 다른 이름을 부여할 수도 있습니다. )
cc1이 진짜 C 컴파일러 본체입니다. gcc 는 단지 적절하게 C 인가, C++ 인가 아니면 오브젝티브 C 인가를 검사하고 컴파일 작업만이 아니라 ``링크''라는 작업까지 하여튼 C 언어로 프로그램 소스를 만든 다음, 프로그램 바이너리가 만들어지기 까지 모든 과정을 관장해주는 ``조정자'' 역할을 할 뿐입니다. C 컴파일러는 cc1, C++ 컴파일러는 cc1plus, 오브젝티브 C 컴파일러는 cc1obj 입니다. 여러분이 C++/오브젝티브 C 컴파일러를 설치하셨다면 cc1plus, cc1obj 라는 실행화일도 찾아보실 수 있을 겁니다. cpp 는 "프리 프로세서"입니다. #include 등의 문장을 본격적인 cc1 컴파일에 들어가기에 앞서 먼저(pre) 처리(process)해주는 녀석입니다.
참고로 g++ 즉 C++ 컴파일러( 정확히는 C++ 컴파일러 프론트 엔드 )에 대한 패키지는 다음과 같습니다.
/usr/bin/c++ -----------> g++ 에 대한 링크에 불과함 /usr/bin/g++ /usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1plus ( 진짜 C++ 컴파일러 )
int main ( void ) { (void) printf ( "Hello, Linux Girls! =)\n" ); return 0; } ------------Cut here--------------------
참고로 제일 간단한 소스는 다음과 같은 것입니다. ^^
------------Cut here-------------------- main () {} ------------Cut here--------------------
컴파일을 해보겠습니다! $ 는 프롬프트이지 입력하는 것이 아닌 것 아시죠?
$ gcc hello.c $
무소식이 희소식이라... gcc <C소스 화일명> 이렇게 실행하고 나서 아무런 메시지도 나오지 않고 다음 줄에 프롬프트만 달랑 떨어지면 그것이 바로 컴파일 성공입니다.
여러분은 무심코 다음과 같이 결과 프로그램을 실행시키려 할 것입니다.
$ hello bash: hello: command not found $
예. 땡입니다. ^^
여러분은 다음과 같이 실행시켜야 합니다.
$ ./a.out
맨 앞의 도트 문자(.)는 현재 디렉토리를 의미합니다. 그 다음 디렉토리 구분 문자슬래쉬(/)를 쓰고 유닉스 C 에서 ``약속한'' C 컴파일러의 출력 결과 바이너리 화일인 a.out 을 써줍니다.
이러한 습관은 아주 중요합니다. 여러분이 현재 디렉토리에 어떤 실행 화일을 만들고 나서 테스트하려고 한다면 꼭 ./<실행 화일명> 이라고 적어줍니다.
유닉스는 기본적으로 PATH 라는 환경변수에 있는 디렉토리에서만 실행화일을 찾을 뿐입니다. 만약 PATH 라는 환경변수에 현재 디렉토리를 의미하는 도트 문자(.)가 들어있지 않으면 현재 디렉토리의 실행화일은 절대 실행되지 않습니다. 게다가 현재 디렉토리를 PATH 환경 변수에 넣어준다 할 지라도 도스처럼 현재 디렉토리를 먼저 찾는다든지 하는 일은 없습니다. 오로지 PATH 에 지정한 순서대로 수행합니다.
실행 바이너리명이 계속 a.out 으로 나오면 좀 곤란하죠. 뭐 물론 mv 명령으로 a.out 의 이름을 바꾸면 되지만서도...
=============== -o 옵션 ===============
-o 옵션( 소문자 o 임! )은 출력(output) 화일명을 정하는 옵션입니다. 위에서 우리는 hello.c 라는 소스를 가지고 일반적으로 hello 라는 이름의 실행화일을 만들고 싶어할 것입니다.
$ gcc -o hello hello.c ^^^^^^^^ ( ^ 문자로 밑줄을 친 것은 강조하기 위해서일 뿐임 )
또는 다음과 같이 순서를 바꿔도 무방합니다.
$ gcc hello.c -o hello ^^^^^^^^
워낙 유닉스 쪽은 명령행 방식이 전통적이고 주된 방식이라 명령행에서 하는 일은 뛰어납니다.
당연히 실행을 하려면 ./hello 라고 하셔야 합니다. 결과는 다음처럼 나오겠지요?
$ ./hello Hello, Linux Girls! =) $
<주의>
제일 안좋은 습관 중 하나가 바로 테스트용으로 만든 소스라고 다음처럼 하는 것입니다.
$ gcc -o test test.c $ test $
문제를 알아내기 위하여 위에서 작성한 hello.c 를 컴파일/링크해봅시다.
$ gcc -o test hello.c $ test $
원하는 문자열이 출력되지 않았습니다. -.-
$ ./test Hello, Linux Girls! =) $
=============== -c 옵션 ===============
어떤 이유에서든 오로지 컴파일(compile) 작업만 하고 싶은 경우가 있습니다. 그럴 때는 다음과 같이 합니다.
$ gcc -c hello.c $
그 결과 만들어지는 화일은 전통적으로 hello.c 에서 .c 부분을 떼어내고 .o 를 붙인 화일입니다. 오브젝트 화일, 목적 화일이라고 하지요.
hello.o 라는 화일이 만들어집니다.
여러분은 C 언어로 조금이라도 복잡한 프로그램을 만들기 시작하면 여러 개의 소스로 나누어서 전체 프로그램을 짜게 됩니다. 그럴 때는 각 소스가 전체 기능에 기여하는 특정 기능의 함수들을 가지게 되고 오로지 한 녀석만 main 함수를 가집니다.
만약 어떤 프로그램이 foo.c, bar.c 이렇게 두 개의 소스로 이루어져 있다고 합시다. 이럴 때는 다음과 같이 하는 것이 가능합니다.
위에서 보면 "아니! C 컴파일러에 .c 즉 소스 화일이 아닌 오브젝트 화일도 막 써주나?"라는 생각을 하시게 될 겁니다. 그렇습니다! 왜냐? gcc 는 정확히 말해서 C 컴파일러가 아닙니다. gcc 라는 실행화일 자체는 "C 컴파일러를 돌리는 녀석"입니다. 더욱 더 정확히 말해봅시다.
첫번째 예는 헤더 화일이 현재 소스 하위 디렉토리(..)에 있다는 뜻이며 두번째는 현재 디렉토리의 include라는 디렉토리에 들어있다는 뜻입니다.
-I 옵션은 얼마든지 여러번 쓸 수 있으며 주어진 순서대로 헤더 화일을 검색합니 다.
<주의>
디렉토리명은 -I 라는 문자 바로 다음에 붙여서 씁니다. 즉 -I <디렉토리> 라는 식이 아니라 -I<디렉토리> 입니다.
또한 유닉스에 있어 표준 헤더 화일 디렉토리는 /usr/include 라는 사실을 기억하시기 바랍니다. 또한 리눅스에 있어서는 커널 소스가 아주 중요한데 리눅스 고유의 기능을 쓰는 리눅스용 프로그램의 경우에는 /usr/include/linux, /usr/include/asm, /usr/include/scsi (최신 커널의 경우) 라는 디렉토리가 꼭 있 어야 하며 각각은 커널 소스의 헤더 디렉토리에 대한 링크입니다. 따라서 커널 소스를 꼭 설치해두셔야 합니다.
이러한 라이브러리는 우리가 컴파일 과정을 거쳐서 만든 .o 화일을 한 곳에 통들어 관리하는 것에 불과합니다. 따라서 archive 를 의미하는 .a 라고 이름을 짓게 된 것이죠. 라이브러리는 ``도서관''으로 서 그냥 .o 를 무작위로 집어넣은 것은 아니고 당연히 도서관에는 소장하고 있는 책에 대한 목록(index)을 가지듯 포함되어 있는 .o 에 대한 인덱스(index)를 가지고 있습니다.
라이브러리는 다음과 같이 구성되어 있다고 할 수 있는 것입니다.
라이브러리 = 목차(index) + ( a.o + b.o + c.o + ... )
libc.a 를 가지고 한 번 놀아볼까요? 라이브러리 아카이브를 관리하는 ar 이라는 GNU 유틸리티를 써보겠습니다.
$ cd /usr/lib $ ar t libc.a assert-perr.o assert.o setenv.o ftime.o psignal.o mkstemp.o sigint.o realpath.o cvt.o gcvt.o ctype-extn.o ctype.o <등등... 계속>
main 함수에서 say_hello 라는 함수를 사용하게 됩니다. 이 정도야 그냥 이렇게 해버리고 말죠 ^^
$ gcc -o say_linux hello.c myfunc.c
하지만 라이브러리를 만들어보고 시험해보려고 하는 것이므로 일부러 어렵게 한번 해보기로 하겠습니다.
$ gcc -c myfunc.c $ ar r libmylib.a myfunc.o $ ar s libmylib.a $ ar t libmylib.a myfunc.o $ gcc -o say_linux hello.c -lmylib ^^^^^^^^ ld: cannot open -lmylib: No such file or directory
흠... 처음부터 만만치 않죠? ^^ 실패하긴 했지만 몇 가지를 일단 알아봅시다.
------------- -l 옵션 -------------
링크(link)할 라이브러리를 명시해주는 옵션이 바로 -l ( 소문자 L ) 옵션입니다. -I 옵션과 마찬가지로 바짝 붙여서 씁니다. 절대 떼면 안됩니다.
우리는 libmylib.a 라는 라이브러리를 만들어두었습니다. 그것을 사용하기 위해서는 -lmylib 라고 적어줍니다. 라이브러리 화일명에서 어떤 글자들을 떼내고 쓰는지 주목하십시요.
libmylib.a ^^^^^ 앞의 lib 를 떼내고 맨 뒤에 붙는 .a 를 떼냅니다.
링크(link)라는 것이 어떤 것이 모르신다면 당장 C 프로그래밍 책을 다시 읽어보시 기 바랍니다. 이 글에서 설명할 범위는 아닌 듯 합니다. ------------- -L 옵션 -------------
ld 는 유닉스에서 사용되는 링커(Linker)입니다. C 프로그램 컴파일의 맨 마지막 단계를 맡게 되지요.
위에서 우리는 다음과 같은 에러 메세지를 만났습니다.
ld: cannot open -lmylib: No such file or directory
자, 이제 배워야 할 옵션은 ``라이브러리의 위치를 정해주는'' -L ( 대문자 L ) 옵션입니다. 사용형식은 -L<디렉토리명> 입니다.
리눅스에서 어떤 라이브러리를 찾을 때는 /lib, /usr/lib, /usr/local/lib 와 같은 정해진 장소에서만 찾게 되어 있습니다. 그것은 규칙이지요. 중요한 사실은 아무리 여러분 라이브러리를 현재 작업 디렉토리에 놓아두어도 ld 는 그것을 찾지 않는다는 사실입니다. ld 더러 라이브러리가 있는 장소를 알려주려 면 다음과 같이 -L 옵션을 붙이십시요.
$ gcc -o say_linux hello.c -lmylib -L. ^^^ -L. 은 현재 디렉토리에서 라이브러리를 찾으라는 말입니다. -L 옵션은 여러번 줄 수 있습니다.
성공적으로 컴파일되었을 겁니다.
$ ./say_linux Hello, Linux guys!
지금까지 여러분은 gcc 옵션 중 두번째로 중요한 -I, -l, -L 옵션에 대하여 배우셨 습니다. 그리고 또한 라이브러리 만들기에 대하여 맛보기를 하였습니다. 다음 시간에 뵙기로 합시다.
다음은 make 강좌를 시작합니다. 그 이후 다시 gcc 관련 사용법을 더욱 자세히 알 아보도록 하겠습니다.
Makefile 강의
1. 머리말 =========
소스 한두 개로 이루어진 C/C++ 언어 교양과목 과제물을 제출하는 것이 아니라면 약간만 프로젝트가 커져도 소스는 감당할 수 없을 정도로 불어나게 되고 그것을 일일이 gcc 명령행 방식으로 처리한다는 것은 상당히 곤역스러운 일입니다.
그래서 하나의 프로젝트를 효율적으로 관리하고 일관성있게 관리하기 위하여 Makefile 이라는 형식을 사용하고 make 라는 유틸리티를 사용합니다.
여러분이 리눅스에서 소스 형태로 되어 있는 것을 가져와서 컴파일하게 되면 보통 마지막에는 make 라는 명령, 또는 make <어쩌구> 이런 식으로 치게 됩니다.
make 라는 유틸리티는 보통 현재 디렉토리에 Makefile 또는 makefile 이라는 일정한 규칙을 준수하여 만든 화일의 내용을 읽어서 목표 화일(target)을 만들어냅니다. Makefile의 이름을 다르게 명시하고 싶을 때는 다음과 같이 합니다.
$ make -f Makefile.linux
보통 멀티플랫폼용 소스들은 Makefile.solaris, Makefile.freebsd, Makefile.hp 이런 식으로 Makefile 을 여러 개 만들어두는 경향이 있지요. 또는 적절하게 만들어두어 다음과 같이 make <플랫폼> 라는 식으로 하면 컴파일 되도록 하기도 합니다.
$ make linux
이런 일은 보통의 관례일 뿐이죠. 더 예를 들어보자면 이런 식입니다. 우리가 커널 컴파일 작업할 때를 보십시요.
$ make config /* 설정 작업을 한다 */ $ make dep /* 화일 의존성을 검사한다 */ $ make clean /* 만든 화일들을 지우고 깨긋한 상태로 만든다 */ $ make zImage /* zImage(압축커널)를 만든다 */ $ make zlilo /* 커널을 만들고 LILO를 설정한다 */ $ make bzImage /* bzImage(비대압축커널)를 만든다 */ $ make modules /* 커널 모듈을 만든다 */ $ make modules_install /* 커널 모듈을 인스톨한다 */
복잡한 것같아도 우리는 항상 make, make, make ... 일관성있게 make 라고만 쳐주면 됩니다 ^^ 분량이 작은 소스들의 경우에는 일반적으로 다음만 해도 되는 경우가 많죠.
$ make 또는 make all $ make install
영어권에 사는 사람들에게는 더욱 친밀하게 느껴질 겁니다. 그렇겠죠? ``만들라!''라는 동사를 사용하고 있는 것이고 그 다음에는 그들의 정상적인 어순에 따라 목적어가 나오죠.
$ make install.man
또한 관례상 ``맨페이지'' 같은 것은 별도로 인스톨하도록 배려하는 경우가 많습니다. 프로그램에 대해 잘 아는 사람이라면 맨페이지를 자질구레하게 설치하고 싶지 않을 때도 많으니까요.
다른 사람에게 공개하는 소스라면 더욱 make 를 사용해야 합니다. 그들 뿐 아니라 여러분 자신도 make 라고만 치면 원하는 결과가 나올 수 있도록 하는 것이 좋습니다. 많은 소스를 작성하다 보면 여러분 스스로도 까먹기 쉽상입니다.
일단 make를 사용하는 일반적인 관례를 익히는 것이 중요하다고 봅니다. 리눅스 배포판 패키지만 설치하지 마시고 적극적으로 소스를 가져다 컴파일해보십시요. 실력이든 꽁수든 늘기 시작하면 여러분은 더욱 행복해지실 수 있습니다. =)
2. 본문 =========
일관성있게 make라고만 치면 모든 일이 술술 풀려나가도록 하는 마술은 Makefile 이라는 것을 어떻게 여러분이 잘 만들어두는가에 따라 결정됩니다. 바로 이 Makefile 을 어떻게 만드는지에 대하여 오늘 알아봅니다.
상황 1)
$ gcc -o foo foo.c bar.c
여기서 foo 라는 실행화일은 foo.c, bar.c 라는 2 개의 소스로부터 만들어지고 있습니다. 여러분이 지금 계속 코딩을 하고 있는 중이라면 이 정도 쯤이야 가상콘솔 또는 X 터미널을 여러 개 열어두고 편집하면서 쉘의 히스토리 기능을 사용하면 그만이지만 하루 이틀 계속 해간다고 하면 곤역스러운 일이 아닐 수 없습니다.
자, 실전으로 들어가버리겠습니다. vi Makefile 해서 만들어봅시다. ( 편집기는 여러분 마음 )
---------------------------------------------------------------------------- 목표: 목표를 만드는데 필요한 구성요소들... 목표를 달성하기 위한 명령 1 목표를 달성하기 위한 명령 2 ... ---------------------------------------------------------------------------- Makefile은 조금만 실수해도 일을 망치게 됩니다.
맨 첫번째 목표인 foo 를 살펴보죠. 맨 첫 칸에 foo: 라고 입력하고 나서 foo가 만들어지기 위해서 필요한 구성요소를 적어줍니다. foo가 만들어지기 위해서는 컴파일된 foo.o, bar.o 가 필요합니다. 각 요소를 구분하는데 있어 콤마(,) 같은 건 사용하지 않고 공백으로 합니다.
중요! 중요! 그 다음 줄로 넘어가서는 <탭>키를 누릅니다. 꼭 한 번 이상은 눌러야 합니다. 절대 스페이스키나 다른 키는 사용해선 안됩니다. 목표 화일을 만들어 내기 위한 명령에 해당하는 줄들은 모두 <탭>키로 시작해야 합니다. Makefile 만들기에서 제일 중요한 내용입니다. <탭>키를 사용해야 한다는 사실, 바로 이것이 중요한 사실입니다. foo를 만들기 위한 명령은 바로 gcc -o foo foo.o bar.o 입니다.
다시 한 번 해석하면 이렇습니다. foo 를 만들기 위해서는 foo.o와 bar.o가 우선 필요하다.( foo: foo.o bar.o ) 일단 foo.o, bar.o 가 만들어져 있다면 우리는 gcc -o foo foo.o bar.o 를 실행하여 foo 를 만든다.
-----------------------------foo.c 의 내용---------------------------------- extern void bar ( void );
int main ( void ) { bar (); return 0; } ----------------------------------------------------------------------------
-----------------------------bar.c 의 내용---------------------------------- #include <stdio.h>
void bar ( void ) { printf ( "Good bye, my love.\n" ); } ----------------------------------------------------------------------------
Makefile을 위처럼 만들어두고 그냥 해보죠.
$ make 또는 make foo gcc -c foo.c gcc -c bar.c gcc -o foo foo.o bar.o
명령이 실행되는 순서를 잘 보십시요. 여기서 감이 와야 합니다. ^^
$ ./foo Good bye, my love.
다시 한 번 실행해볼까요?
$ make make: `foo' is up to date.
똑똑한 make는 foo를 다시 만들 필요가 없다고 생각하고 더 이상 처리하지 않습니다.
이번에는 foo.c 를 약간만 고쳐봅시다. return 0; 라는 문장을 exit (0); 라는 문장으로 바꾸어보죠. 그리고 다시 한 번 다음과 같이 합니다.
$ make gcc -c foo.c gcc -o foo foo.o bar.o
자, 우리가 원하던 결과입니다. 당연히 foo.c 만 변화되었으므로 foo.o 를 만들고 foo.o가 갱신되었으므로 foo도 다시 만듭니다. 하지만 bar.c는 아무 변화를 겪지 않았으므로 이미 만들어둔 bar.o 는 그대로 둡니다 소스크기가 늘면 늘수록 이처럼 똑똑한 처리가 필요하지요.
$ rm -f foo $ make gcc -o foo foo.o bar.o
이것도 우리가 원하던 결과입니다. foo 실행화일만 살짝 지웠더니 make는 알아서 이미 있는 foo.o, bar.o 를 가지고 foo 를 만들어냅니다. :)
make clean이라는 작업 또한 중요한 작업입니다. 확실히 청소를 보장해주어야 하거든요.
make, make clean 이런 것이 되면 상당히 멋진 Makefile 이라고 볼 수 있죠? 이번 clean 에서 보여드리고자 하는 부분은 이런 것입니다.
우리의 머리 속에 clean 이라는 목표는 단지 화일들을 지우는 일입니다. clean: 옆에 아무런 연관 화일들이 없지요? 그리고 오로지 rm -f foo foo.o bar.o 라는 명령만 있을 뿐입니다. clean 이라는 목표를 수행하기 위해 필요한 것은 없습니다. 그러므로 적지 않았으며 타당한 make 문법입니다.
이런 식으로 해두면 어떤 장점이 있는지 알아봅시다. 보통 make all 하면 foo1, foo2, foo3가 모두 만들어집니다. 그런데 어떤 경우에는 foo1만 또는 foo2만을 만들고 싶을 때도 있을 겁니다. 괜히 필요없는 foo3 같은 것을 컴파일하느라 시간을 보내기 싫으므로 우리는 단지 다음과 같이만 할 겁니다.
$ make foo1 $ make foo2
물론 일반적으로 다 만들고 싶을 때는 make all 이라고만 하면 됩니다. make all 이건 아주 일반적인 관례이지요.
=========================== Makefile 기초 마지막 강의 ===========================
이어지는 이야기입니다. ( 이 내용은 RUNNING LINUX 라는 유명한 리눅스 책에서 발췌한 것이고 약간의 설명을 덧붙였을 뿐이다. 오렐리 출판사에서 나온 아주 유명한 책이며 Matt Welsh, Lar Kaufman 씨가 집필한 책입니다. 저는 이 책을 누더기가 될 때가지 보고야 말겠습니다 ^^ )
여기서 .c.o 의 의미를 생각해보겠습니다. ".c 를 입력화일로 받고 .o 화일을 만든다"
gcc -c ${CFLAGS} $<
이 문자을 보면 일단 눈에 띄는 것은 ${CFLAGS}라는 표현과 $< 라는 암호와도 같은 표현입니다. 여기서는 일단 $< 라는 기호의 의미를 알아보겠습니다. 유닉스에서 쉘을 잘 구사하시는 분들은 눈치채셨을 겁니다. 작다 표시(<)는 리다이렉션에서 입력을 의미하는 것을 아십니까? 그렇다면 $< 는 바로 .c.o 라는 표현에서 .c 즉 C 소스 화일을 의미합니다.
예를 들어 foo.c 가 있다면 자동으로
gcc -c ${CFLAGS} foo.c
가 수행되며 gcc 에 -c 옵션이 붙었으므로 foo.o 화일이 만들어질 것입니다.
-------------------- GNU make 확장 기능 --------------------
.c.o 라는 전통적인 표현 말고 GNU 버전( 우리가 리눅스에서 사용하는 것은 바로 이것입니다 )의 make 에서 사용하는 방법을 알아봅시다.
위에서 예로 든 것을 GNU 버전의 make 에서 지원하는 확장문법을 사용하면 다음과 같습니다.
그냥 설명 전에 잘 살펴보시기 바랍니다. 우리가 위에서 알아보았던 표준적인 .c.o 라는 꼬리말 규칙(Suffix rule)보다 훨씬 논리적이라는 것을 발견하셨습니까? 우리가 바로 전 강의에서 main.o : main.c 이런 식으로 표현한 것과 같은 맥락이지요? 이것을 우리는 패턴 규칙(Pattern rule)이라고 부릅니다.
콜론(:) 오른쪽이 입력 화일이고 왼쪽이 목표 화일입니다. 화일명 대신 퍼센트(%) 문자를 사용한 것만 유의하면 됩니다. 여기서 foo.c 라는 입력화일이 있다면 % 기호는 foo 만을 나타냅니다.
gcc -c -o $@ ${CFLAGS} $<
라는 표현을 해석해봅시다. ( 후~ 마치 고대 문자판을 해석하는 기분이 안드십니까? ^^ )
$< 는 입력화일을 의미하고 $@ 은 출력화일을 의미합니다. .c.o와 같은 꼬리말 규칙과 별 다를 바 없다고 생각하실 지 모르나 -o $@ 를 통하여 .o 라는 이름 말고 전혀 다른 일도 해낼 수 있습니다.
자, make CFLAGS="-O" 이런 명령을 한 번 봅시다. ${CFLAGS}에서 {} 표현은 유닉스 쉘에서 변수값을 알아낼 때 쓰는 표현입니다.
CFLAGS 값을 여러분이 Makefile에 고정적으로 집어넣지 않고 그냥 make 만 실행하는 사람에게 선택권을 주기 위해서 사용하거나 자기 스스로 어떤 옵션이 제일 잘 맞는지 알아보기 위해서 사용합니다.
다른 옵션으로 컴파일하는 것마다 일일이 다른 Makefile을 만들지 말고 가변적인 부분을 변수화하는 것이 좋습니다.
3) 마지막 주의 사항 =============================================================================
---------------------------------------------------------------------------- target: cd obj HOST_DIR=/home/e mv *.o $HOST_DIR ----------------------------------------------------------------------------
하나의 목표에 대하여 여러 명령을 쓰면 예기치 않은 일이 벌어집니다. 기술적으로 말하자면 각 명령은 각자의 서브쉘에서 실행되므로 전혀 연관이 없습니다. -.- cd obj 도 하나의 쉘에서 HOST_DIR=/home/e도 하나의 쉘에서 나머지도 마찬가지입니다. 각기 다른 쉘에서 작업한 것처럼 되므로 cd obj 했다 하더라도 다음번 명령의 위치는 obj 디렉토리가 아니라 그대로 변함이 없이 현재 디렉토리입니다. 세번째 명령에서 HOST_DIR 변수를 찾으려 하지만 두번째 명령이 종료한 후 HOST_ DIR 변수는 사라집니다.
앞 강좌인 proftp에서도 언급을 하였지만 바로 vsftp를 보시는분을 위하여 약간의 중복내용이 있겠습니다.
FTP는 "File Transfer Protocol" 의 약자로써 쉽게 말해 서버에(=홈페이지) 에 자료를 올리기위한 규정같은 것이라고 보시면 됩니다. 다른 자료들을 보면 구구절절 내용이 많은데 내용적인 측면을 공부하시려면 좀더 자료를 찾아 보시고 여기서는 간략하게 Linux 에서 ftp를 설치하고 사용하는데 필요한 계념및 정보들을 알려드리는게 맞는것 같습니다.
일반사람들이 자신의 계정이나 혹은 무계정으로 ftp에 접속하여 홈페이지자료를 올린다거나 음악,영화,프로그램의 저장목적으로 많이 사용하며 기타 저장매체가 없어도 인터넷만 된다면 아주 효율적으로 자료를 확보할수있기 때문에 ftp를 씁니다. 관리자 입장에서는 백업과 서버이전작업시 꼭 필요한 서비스이겠지요... ^^
먼저 ftp는 port 21 을 사용합니다. 보통전송모드에는 아스키모드(일반모드) 와 패시브모드(보안이강화된 모드) 가 있습니다. 우리가 설치할(컴파일로) vsftp 의 설정파일은 서버단에서 /etc/vsftpd.conf 입니다. =>/usr/local/아래에 설치를 하는데 설치후 vsftpd.conf를 /etc 아래로 복사하여 설정합니다. 참고 하시길 바랍니다. 설정파일인 vsftpd.conf 에서 ftp에 관련된 모든 내용을 셋팅할수있습니다. 그리고 proftp보다 좀더 보안적으로 성격이 강하며 성능면에서도 더 좋다고 느꼈습니다. 이 내용은 이 강좌 마지막부분에서 낫낫히 알려 드리겠습니다.
그럼 이제 사뿐히 설치해 볼까요... (컴파일로 설치합니다. rpm은 누구나 한번에 설치다 하니 추후에...)
자 위의 결과처림 아직 21번포트를 LISTEN하고 있는 ftp 서비스는 보이질 않는고 sendmail 및 ssh등의 서비스만이 있음을 알수있다. 그리고 pstree라는 명령어로 ftp프로세서가 있는지도 확인해 봅니다. 혹시나 설치가 되어있더라도 중복설치 가능하니 걱정말고 다음 관정으로 넘어간다.주의할점은 어떤것이든지 덮어씌워 설치를 할때는 그 서비스는 내려놓고 하는것이 정석입니다. ^^
vsftp 를 다운받아 설치하기 항상 말하는것이지만 컴파일설치시 보통 /usr/local/에서 주로 합니다. 그러나 이것은 절대적인것은 아니며 만약 rpm으로 설치를 하시면 경로는 대부분 /etc/아래에 설정파일같은것들이 다 들어가게 됩니다. 참고하시구요. 다음과같이 다운로드하고 설치합니다.
=> 위의메세지가 보이면 설치가 정상적으로 된것입다. 나무색의 글씨처럼 /etc/xinetd.d/vsftpd 에서 우리는 수퍼데몬에서 vsftp를 실행하는 파일이 저기있구나라고 유추할수있고 실제로 이파일의 정보를 참고하여 프로세스를 띄워주게 됩니다.
자 vi /etc/xinetd.d/vsftpd 해봅니다. # default: on # description: # The vsftpd FTP server serves FTP connections. It uses # normal, unencrypted usernames and passwords for authentication. # vsftpd is designed to be secure. service ftp { disable = no (disable 즉 불가능이 no 니까 서비스를 가능한상태로 두겠다라는 의미) socket_type = stream wait = no user = root server = /usr/local/sbin/vsftpd # server_args = # log_on_success += DURATION USERID # log_on_failure += USERID nice = 10 }
위의 내용에서 disable = no로 되어있어야 합니다. server = /usr/local/sbin/vsftpd 부분은 실제 수퍼데몬이 참조하는 실행파일입니다.
약간다르지요. 그냥 데몬을 띄우는거랑은 조금 차이를 느끼실겁니다. 자 확인을 하셨으면 이제 데몬을 띄워봅니다. 이렇게 하세요..
자 netsysv로 선택했던 직접 vi /etc/xinetd.d/vsftpd 를 체크하던지 둘중에서 편안한 방법을 사용하신다음 아래와같이 슈퍼데몬을 재가동하면 포트도 열린것을 확인할수있고 pstree 하시면 프로세서가 딱 띄워져 있는것을 확인하실수 있을 것입니다.
[root@lecture ~]# /etc/rc.d/init.d/xinetd restart xinetd 를정지함: [ 확인 ] xinetd(을)를 시작함: [ 확인 ]
vsftp데몬이라하여도 슈퍼데몬이 이를 관리하여 띄워주므로 표시는 xinetd라고 표시되나 포트번호를 보면 21번이라고 ftp가 추가되었음을 알수가 있습니다.
여기까지가 vsftp의 설치과정및 실행방법입니다.
설치만한다고 해서 바로 사용할수있는 것은 아닙니다. 이시죠? ^^
가장 기본적인 vsftpd.conf를 설정해주셔야지 비로서 외부에서 접속할수있겠지요.
protfp보다 더욱 체계적으로 보안셋팅을 할수있는 vsftpd.conf 를 해부해 봅시다.
3. vsftpd.conf 완전 분석하기
ftp의 계념과 설치방법에 대해 알아보았습니다. 별 어려움 없이 넘어오셨을 것입니다. 마지막으로 설치후 기본적인 셋팅과 보안적인 셋팅등 입맛에 맛게 ftp를 설정하는데 /etc/vsftpd.conf 설정파일이 그것이며 기본셋팅및 다른 어떤 셋팅 항목들이 있는지 직접 설정파일을 열어 항목들과 설명만 정리하였습니다. 빨간색 부분은 최소 기본적으로 해주셔야 할 것들이고 나머지는 상황에 따라 하시면 됩니다. 특히 vsftp와는 다르게 접근계정을 파일에 명시하고 접속을 허락하고 거부하는 정책을 유심히 보시길 바라면 다른 사항은 비슷합니다.
# ascii 모드 파일을 취급(업,다운로드)할거냐? #ascii_upload_enable=YES #ascii_download_enable=YES
# ftp서버접속시 보여줄 멘트 #ftpd_banner=Welcome to blah FTP service.
# 이자식은 좀 웃깁니다. # 단순히 yes , no 계념이 아니고 # 먼저 yes를 하면 다름 나오는 파일에 명시된 # 계정들을 chroot(홈디렉토리 위로갈수있는) 하겠다라는 # 뜻이되고 no를 하면 아래파일에 적힌 계정들만 # chroot 못하게 하겠다라는 뜻 #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