RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'Linux/SHELL'에 해당되는 글 13
2007/07/04  * 문서  
2006/10/08  find ~ 유용한 팁 ~  
2006/09/29  쉘 명령들  
2006/09/08  grep 계열 명령어  
2006/09/08  쉘스크립트  
2006/09/08  정규표현식이란  
Linux/SHELL  2007/07/04 21:21

* 문서
1. 패스워드 관리장부
2. 서버자원관리부
3. 백업관리장부
4. 서버작업이력부
5. 서버점검이력부

* 절대로 서버를 믿어서는 안된다. 여러분 자신을 믿으셔야 합니다.

* 리눅스 배포판
http://www.redhat.com/
http://www.debian.org/
http://www.slackware.com/
http://www.linux-mandrake.com/
http://www.wowlinux.com/
http://www.alzzalinux.com/
http://www.suse.com/
http://www.haansoftlinux.com/
http://www.hancom.com/
http://www.sulinux.net/


* 한글 사용
# cat /etc/sysconfig/i18n
LANG="ko_KR.eucKR"
SUPPORTED="en_US.UTF-8:en_US:en:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="8859-15"

* 네트워크 통신테스트 단계
1. gateway까지 통신에 이상이 없는가?
2. 외부망까지의 통신에 이상이 없는가?
3. DNS까지의 통신에 이상이 없는가?
4. 도메인을 통한 외부망까지의 통신에 이상이 없는가?

* 게이트웨어 설정
route add default gw 게이트웨이_IP주소 dev 네트워크_인터페이스_장치명
예) # route add default gw 192.168.0.1 dev eth0
예) # ifconfig eth0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 up
    # route add -net 192.168.1.0 netmask 255.255.255.0 eth0
    # route add default gw 192.168.1.254 dev eth0

* route 명령을 통한 routing 규칙
# route
Kernel IP routing table
Destination Gateway  Genmask  Flags Metric Ref Use Iface
192.168.0.0 *  255.255.255.0 U 0 0 0 eth0
169.254.0.0 *  255.255.0.0 U 0 0 0 eth0
127.0.0.0 *  255.0.0.0 U 0 0 0 lo
default  192.168.1.254 0.0.0.0  UG 0 0 0 eth0
1. 위의 첫번째행부터 다음행으로 차례대로 한 행씩 읽어 들여서 처리할 퍀시을 보낼 수 있는가를 확인합니다.
2. default라는 것이 이 서버의 기본 게이트웨이 설정해을 의미하며 그 행의 Gateway 항목값이 기본게이트웨이의 IP주소입니다. default는 0.0.0.0을 의미합니다.
3. 보낼 데이터의 목적지 IP주소와 Genmask값(SubnetMask)과의 AND연산을 해서 그 결과가 해당행의 Destination항목과 동일할 겨웅에 해당 행의 Iface에 있는 인터페이스로 해당 패킷을 전송하게 됩니다.
4. Iface항목의 값이 lo인 행(Destination값이 127.0.0.0인 행)은 이 서버의 루프백(loopback) 데이터를 처리하기 위한 설정입니다. 즉, 자기 자신에게로 데이터를 보낼 때에 처리를 담당하는 인터페이스입니다.

* 기본게이트웨이 정보:
# cat /etc/sysconfig/network
NETWORKING=yes   # 통신이 되도록 지원할 것인가의 여부
HOSTNAME=ns.superuser.co.kr # 서버의 호스트네임(hostname)
GATEWAY=192.168.1.254  # 시스템 전체에 대한 Global한 기본게이트웨이
GATEWAYDEV=   # 기본게이트웨이 장치명
FORWARD_IPV4=no   # 리눅스 서버가 라우터역할을 할 것인가의 여부. 즉, 패킷포워딩을 수행학자 할 경우에는 yes로 설정하고 패킷포워딩을 하지 않을 경우에는 no로 설정한다. 일반적이 서버역할을 수행할 경우에는 거의 대부분 no로 설정한다.

* IP관련 네트워크 정보:
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0   # 네트워크 디바이스 장치명
BOOTPROTO=static  # 이 네트워크 디바이스에 유동IP를 동적(dynamic)으로 할당하고자 할 경우에는 dhcp를 주소 정적(static)한 고정IP를 할당하고자 할 경우에는 static이라는 값을 준다.
IPADDR=192.168.1.101  # 이 서버의 IP주소
BROADCAST=192.168.1.255  # 브로드캐스트 주소
NETMASK=255.255.255.0  # 넷마스크값
NETWORK=192.168.1.0  # 네트워크주소
ONBOOT=yes   # 해당 네트워크 인터페이스(eth0)를 서버 부팅시에 활성화하여 사용할 것인가를 결정한다.
#USERCTL=no
#GATEWAY   # 해당 네트워크 인터페이스(eth0)의 기본 게이트웨이를 설정. /etc/sysconfig/network 에 있는 GATEWAY보다 우선순위가 높다.

* 네임서버관련 정보:
# cat /etc/resolv.conf
search superuser.co.kr
nameserver 168.126.63.1
nameserver 164.124.101.2


* ifconfig 명령어
1. eth0 인터페이스 down/up
# ifconfig eth0 down
# ifconfig eth0 up
2. 네트워크 설정
- 설정할 network device : eth0
- 호스트 IP Address     : 192.168.0.100
- Netmask               : 255.255.255.0
- Broadcast IP          : 192.168.0.255
- Network IP            : 192.168.0.0
# ifconfig eth0 192.168.0.100 netmask 192.168.0.0 broadcast 192.168.0.255 up

* 네트워크 주소 설정파일
- /etc/sysconfig/network
- /etc/sysconfig/network-scripts/ifcfg-eth0
- /etc/rc.d/init.d/network start|restart|stop

* 리부팅
# reboot
# shutdown -r now
# init 6

* IP앨리어싱
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:1
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:2
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:3
# 각 파일 편집
# cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0   # -> 이 부분 수정 (원래 eth0)
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.211  # -> 이 부분 수정 (원래 192.168.0.210)
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
TYPE=Ethernet
# cat /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1   # -> 이 부분 수정 (원래 eth0)
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.212  # -> 이 부분 수정 (원래 192.168.0.210)
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
TYPE=Ethernet
# /etc/rc.d/init.d/network restart

* hostname 변경
- 영구적으로 변경
# vi /etc/sysconfig/network -> HOSTNAME 수정 (재부팅 필요)
- 일시적으로 변경
# hostname hostname.you_want.com -> 지금 즉시 수정

* netstat
- a 옵션 : --all과 같으며 listen되는 소ㅔㅅ정보와 listen되지 않는 소켓정보 모두를 보여줌.
- n 옵션 : --numeric과 같으며 10진수의 수치정보로 결과를 출력해줌.
- r 옵션 : --route과 같으며 설정된 라우팅정보를 출력해줌
- p 옵션 : --program과 같으며 실행되고 있는 각 프로그램과 PID정보를 출력함.
- i 옵션 : --interface=iface과 같으며 모든 네트워ㅡ인터페이스정보를 출력함. 또는 특정 네트워크인터페이스를 지정할 수도 있음.
- c 옵션 : --continuous과 같으며 netstat결과를 연속적으로 출력함.
- l 옵션 : --listening과 같으며 현재 listen되고 있는 소켓정보를 출력
- s 옵션 : --statistics과 같으며 각 프로토콜에 대한 통계정보를 출력
- t 옵션 : --tcp와 같으며 tcp 정보를 출력
- u 옵션 : --udp와 같으며 udp 정보를 출력

* netstat 연결상태
- LISTEN : 연결이 가능하도록 관련데몬이 떠있으며 연결이 가능함을 나타냄.
- SYN-SENT : 연결을 요청한 상태
- SYN_RECEIVED : 연결요구에 의한 응답을 준 후에 확인메시지를 기다리고 있는 상태.
- ESTABLISHED : 앞의 3단계 연결과정이 모두 종료된 후에 연결이 완료된 상태
- FIN-WAIT1, CLOSE-WAIT, FIN-WAIT2 : 연결종료를 위해 종료 요청을 받은 후의 종료 과정임.
- CLOSING : 전송된 메시지가 유실된 상태를 나타냄.
- TIME-WAIT : 연결종료 후에 한동안 유지하고 있는 상태.
- CLOSED : 연결이 완전히 종료됨.

* 국내도메인 사용기관 정보 조회
리눅스 쉘         : whois -h whois.krnic.net 대상도메인(or IP Address)
                    ex) whois -h whois.krnic.net 202.86.12.129
웹에서의 조회 URL : http://whois.nic.or.kr/

* 국제도메인 사용기관 정보 조회
리눅스 쉘         : whois -h whois.internic.net 대상도메인(or IP Address)
                    ex) whois -h whois.internic.net cnn.com
웹에서의 조회 URL : http://www.networksolutions.com/en_US/whois/index.jhtml

* ethtool (이더넷카드의 설정의 상황출력과 변경을 하는 명령어)
- 이더넷 설정확인 : ethtool eth0
- 이더넷 설정변경 : ethtool -s eth0 [speed 10|100|1000] [duplex half|full] [autoneg on|off]
# ethtool eth1
# ethtool -s eth1 speed 100 duplex full autoneg off

* mii-tool (Media Independent Interface Tool)
# mii-tool
eth0: no autonegotiation, 10baseT-HD, link ok
eth1: 100 Mbit, full duplex, no link
# mii-tool eth0
eth0: no autonegotiation, 10baseT-HD, link ok
# mii-tool eth1
eth1: 100 Mbit, full duplex, no link
# mii-tool -v eth0
eth0: no autonegotiation, 10baseT-HD, link ok
  product info: Intel 82555 rev 4
  basic mode: autonegotiation enabled
  basic status: autonegotiation complete, link ok
  capabilities: 100baseTx-FD 100baseTx-HD 10baseTx-FD 10baseTx-HD
  advertising: 100baseTx-FD 100baseTx-HD 10baseTx-FD 10baseTx-HD flow-control
  link partner: 10baseT-HD
# mii-tool -R -> 네트워크 인터페이스의 기본설정내용대로 재설정
# mii-tool -r -> 네트워크 인터페이스의 autonegotiation설정을 재시작

* modprobe를 이용한 랜카드 모드 설정확인 및 변경하기
# lsmod
Module  Size Used by
eepro100 18144 1
# cat /etc/modules.conf
alias eth0 eepro100
alias scsi_hostadapter aic7xxx
# modprobe 랜카드모듈명 speed_duplex=설정번호
- speed_duplex=0 : auto detection 모드로 설정
- speed_duplex=1 : 10M, half duplex로 설정
- speed_duplex=2 : 10M, full duplex로 설정
- speed_duplex=3 : 100M, half duplex로 설정
- speed_duplex=4 : 100M, full duplex로 설정
ex) modprobe eepro100 speed_duplex=1

* tcpdump
# tcpdump -i eth0  -> 특정 ethernt(eth0) 으로 송수신 되는 데이터 패킷 덤프하여 확인
# tcpdump -i eth0 -w TCPDUMP -> 특정 ethernet으로 송수신 되는 패킷들 파일에 저장 및 확인
# tcpdump -r TCPDUMP  -> TCPDUMP에 저장된 패킷헤드들을 확인
# tcpdump -i eth0 -c 10  -> 특정 ethernet에서 지정한 개수만큼의 네트워크 패킷 덤프하여 확인
# tcpdump -w tcpdump.log -s 1500 tcp port 22 and host 192.168.0.1
    -> 서버의 특정포트로 송수신되는 모든 데이터패킷 전체를 확인
    -> 이 명령의 의미는 현재 로컬서버와  192.168.0.00서버사이의 통신데이터패킷 중 tcp 22번포트의 모든 패킷을 1500길이로 캡쳐하여 tcpdump.log파일에 저장
  -w tcpdump.log 결과를 tcpdump.log파일에 저장
  -s 1500  캡쳐할 패킷의 길이로서 1500은 패킷의 전체길이를 의미하므로 모든 패킷을 캡쳐하게 된다.
  tcp port 22  캡쳐할 대상 프로토콜과 포트를 지정한 것으로 TCP 포트 22번으로 송수신되는 데이터를 캡쳐하다.
  host 192.168.0.100 192.168.0.100서버와 송수신되는 데이터를 대상으로 캡쳐한다.
# tcpdum -Xqnr tcpdump.log -> 캡쳐한 tcpdump.log파일의 내용을 ASCII모드로 확인


*** 리눅스 서버관리 유틸리티 ***

* 시스템 설정과 셋업 유틸리티
# setup
시스템설정과 셋업 파일들을 한데 모은 유틸리티.

* 리눅스 인증설정 유틸리티(NIS와 Shadow패스워드를 설정하는 텍스트 모드 도구)
# authconfig
# systemp-config-authentication
# pwconv -> shadow 패스워드 사용
# pwunconv -> shadow 패스워드 사용
MD5 Passwords 를 사용해서 문자수를 최대 256byte까지 사용할 수 있다.

* 시스템 날짜와 시간을 수정하는 그래픽 인터페이스
# redhat-config-date
# system-config-date
#system-config-time

* httpd 웹 서버에 대한 그래픽 설정 도구
# redhat-cofig-httpd
# system-config-http

* 키보드를 수정하는데 사용되는 그래픽 인터페이스
# redhat-config-keyboard
# system-config-keyboard

* 언어를 수정하는데 사용되는 그래픽 인터페이스
# redhat-config-language
# system-config-language

* 마우스 설정 그래픽 인터페이스
redhat-config-mouse
system-config-mouse

* Red Hat Linux 네트워크 설정 도구에 사용되는 그래픽 사용자 인터페이스. (참고: )
# netconfig
# redhat-config-network
# system-config-network

* NFS 서버 설정 도구
# redhat-config-nfs
# system-config-nfs

* Red Hat Linux에 사용되는 패키지 관리자
# redhat-config-packages
# system-config-packages

* 프린타 설정 백엔드/프론트엔드 조합
# printconf
# redhat-config-printer
# system-config-printer

* 루트 암호를 수정하는데 사용되는 그래픽 인터페이스
# redhat-config-rootpassword
# system-config-rootpasswd

* Samba 서버 설정 도구
# redhat-config-samba
# system-config-samba

* 시스템 보안 수준을 수정하는데 사용되는 그래픽 인터페이스 (lokkit 유틸리티와 같은 기능)
# redhat-config-securitylevel
# system-config-securitylevel

* redhat-config-services는  initscript와 xinetd 설정 유틸리티
# chkconfig
# ntsysv
# redhat-config-services
# system-config-services
이 유틸리티에서 설정가능한 서비스들
- amanda : 서버클라이언트 환경의 네트워크 백업시스템
- amd  : 자동마우트서비스(automatically mount file system)
- anacron : 주기적인 작업을 설정할 수 있는 서비스
- apmd  : 전원관리 데몬. 즉 전원감시 데몬
- arpwath : 네트워크인터페이스 하드웨어주소(MAC주소)와 IP주소를 쌍으로 모니터링하는 툴로서 보안도구로도 사용됨.
- atd  : 지정된 시간에 특정 작업을 실행할 수 있는 프로그램.
- bootparamd : 디스크가 없는 서버의 부팅정보제공을 하는 데몬
- chargen : character generate 서비스(보안에 취약함)
- chargen-udp : character generate 서비스(udp)
- comsat : 메일도착알림이나 사용자 알림사항등이 있을 때 알려주는 biff server
- crond  : 주기적인 작업실행을 할 수 있는 cron데몬
- daytime : daytime 서비스
- daytime-udp : daytime udp 서비스
- dhcpd  : ADSL과 MODEM사용자들에게 IP를 할당해주는 DHCP서버데몬
- finger : 로컬이나 원격서버의 계정사용자 정보 확인하는 finger서비스.
- gated  : 라우팅 데몬
- gpm  : 문자의 복사나 붙일 수 있는 가상콘솔을 위한 마우스서버
- gssftp : GSS FTP 서버데몬 프로그램
- identd : TCP/IP IDENT 프로토콜 서버 프로그램.
- imapd  : POP과 함께 메일수신데몬으로 사용되는 IMAP데몬
- imaps  : SSL을 지원하는 IMAP데몬
- innd  : 인터넷 NEWS 데몬
- ipchains : IP firewall 관리데몬 프로그램
- ipop3  : 서버에서 클라이언트로 메일을 보내주는 POP서버
- iptables : IP 패킷필터링 관리 프로그램.
- kadmin : kerberos V5 데이터베이스 관리 프로그램
- keytable : 키보드설정 데몬 프로그램
- kprop  : 마스터 KDB와 복제를 동기화시키는 서버유티리티
- kudzu  : 하드웨어 장치설정 프로그램
- ldap  : 디렉토리서비스 엑세스를 위한 클라이언트-서버 프로토콜 데몬
- linuxconf : 리눅스설정 유틸리티인 linuxconfi데몬 프로그램.
- lpd  : 프린터서버 데몬 프로그램.
- mysqld : Mysql데이터베이스 데몬 프로그램.
- named  : DNS데몬 프로그램
- nessusd : 보안프로그램인 nessus 데몬프로그램.
- netfs  : 네트워크 파일시스템을 지원하기 위한 데몬프로그램.
- network : 네트워크 설정 제어 프로그램
- nfs  : network file system 데몬 프로그램.
- nfslock : NFS지원을 위한 데몬 프로그램.
- nscd  : Name Service Cache 데몬 프로그램.
- ntalk  : 네트워크상에서 talk로 대화를 할 수 있는 데몬프로그램.
- ntpd  : Network Time Protocol(NTP) 데몬 프로그램.
- pop3s  : SSL을 지원하는 POP3S 데몬 프로그램
- portmap : rpc를 TCP/IP포트로 변환하는 rpc portmapper
- proftpd : ftp데몬의 일종인 proftp데몬 프로그램.
- rarpd  : RARP(Reverse Address Resolution Protocol)데몬 프로그램.
- routed : 라우팅데몬 프로그램
- rstatd : rpc rstatd 데몬 프로그램(kernel statistics server)
- rsync  : 디스크동기화나 네트워크백업을 위한 rsync 데몬 프로그램
- rusersd : rpc rusers 데몬 프로그램
- rwalld : 로그인한 사용자에게 메시지를 보내는 rpc rwalld 데몬
- rwhod  : 서버에 로그링ㄴ한 사용자 확인(rpc rwhod 데몬 프로그램)
- sendmail : sendmail 데몬 프로그램
- smb  ; 삼바(samba)데몬 프로그램
- snmpd  : 네트워크관리 프로토콜인 snmpd 데몬 프로그램.
- sshd  : Secure Shell(SSH) 데몬 프로그램
- swat  : 삼바(samba) 웹관리툴 데몬 프로그램
- syslog : 로그시스템 데몬 프로그램
- telnet : 텔넷(telnet)데몬 프로그램
- webmin : 웹에서 시스템관리를 할 수 있는 webmin 데몬 프로그램.
- xfs  : X윈도우를 위한 폰트(font)서버 데몬
- xinetd : 인터넷수퍼데몬 xinetd 데몬 프로그램.
- ypbind : NIS 바인딩 데몬 프로그램
- yppaswdd : NIS서버/클라이언트간 패스워드갱신 데몬
- ypserv : NIS 서버데몬 프로그램.

* 사운드카드를 감지하고 설정하는 그래픽 인터페이스
# redhat-config-soundcard
# system-config-soundcard

* 사용자와 집단들을 관리하느데 사용되는 그래픽 인터페이스
# redhat-config-users
# system-config-users

* 시스템 모니터 셋팅 프로그램
# sytem-config-display


* 서버관리자의 역할
1. 현재 운영중인 서버의 하드웨어와 운영체제에서 가질 수 있는 최대의 성능을 낼 수 있도록 "시스템을 최적화" 해야합니다.
2. 주기적이고 반복적인 작업들은 쉘프로그램이나 C, Perl 등의 언어를 사용하여 "반복업무의 업무자동화"를 해야합니다.
3. 서버 운영체제와 사용자의 데이터보호를 위하여 "확실한 보안대비"를 구축하고 있어야 합니다.
4. "체계적이고 주기적인 백업정책"을 적용하고 있어야 합니다.
5. 서버 장애발생시에 가장 빠르게 복구가 가능하도록 "빠른 복구정책"을 마련하고 있어야 합니다.

* 리눅스 서버의 종료 및 재시작
- shutdown을 이용한 시스템 종료 및 재시작
# /sbin/shutdown [-t sec] [-rkhncfF] time [warning-messages]
  -k : 실제로 종료하지 않고 모든 사용자에게 경고 메시지만을 보냅니다.
  -r : 시스템 종료후에 재부팅을 합니다.(reboot)
  -h : 시스템을 종료하며 재부팅을 하지 않습니다.(halt)
  -f : 재부팅할 때 파일시스템체ㅡ를 (fsck: file system check)를 하지 않습니다.
  -c : 이전에 내렸던 shutdown명령을 취소합니다.
  time : 몇분 후에 시스템을 종료할 것인가를 지정합니다.
  warning-messages : 사용자에게 보내질 종료 메시지.
# shutdown -h 5 "system rebooting..." -> "system rebooting..." 메시를 뿌리면서 현재부터 5분 후에 시스템을 종료
# shutdown -c -> shutdown 종료명령 취소
# shutdown -r +5 "system rebooting..." -> 5분 후에 시스템을 재시작
# shutdown -r now -> 시스템을 즉시 재부팅
# shutdown -h now -> 시스템을 즉시 종료
- reboot(= shutdown -r now)으로 서버 재시작하기
- poweroff로 서버 종료하기
- halt(= shutdown -h now)로 서버 종료하기
- init을 원하는 실행레벨로 서버 종료 및 재시작
레벨0 : 시스템종료(init 0, 그리고 halt와 shutdown -h now와 동일함)
레벨1 : 싱글모드(관리모드), ㅗㄴ솔로서만 접근가능하며 수퍼유저(root)만이 사용할 수 있다. 시스템관리나 root패스워드를 벼경하고자할 때에 사용함(init 1)
레벨2 : NFS를 지원하지않는 멀티유저 실행모드(init 2)
레벨3 : NFS를 지원하는 멀티유저 실행모드(init 3)
레벨4 : 사용하지않는 실행레벨(사용자가 지정하여 사용할 수 있음)
레벨5 : X윈도우 환경으로 실행된 멀티유저 시행모드(init 5)
레벨6 : 서버 재부팅되는 실행모드(init 6, reboot, shutdown -r now)

* CDROM 마운트
# mount -t iso9660 /dev/hdc /media/cdrom
# mount -t iso9660 /dev/cdrom /mnt/cdrom
# umount /media/cdrom

* 리눅스 복구(부팅)디스켓 제작하기
1. mkbootdis
# mkbootdisk --device /dev/fd0 2.6.9-.667smp
2. dd
# fdformat /dev/fd0H1440
# dd if=/boot/vmlinuz-2.6.9-1.667 of=/dev/fd0
# rdev /dev/fd0 /dev/hda1

* 리눅스 디렉토리 구조
/ : 최상의 디렉토리인 루트디렉토리
/bin : 중요하고 꼭 필요한 명령어가 있는 디렉토리
/boot : 커널(vmlinux등) 시스템 부팅에 관련된 파일을 저장하고 있는 디렉토리.
/dev : 시스템 디바이스(device)파일을 저장하고 있는 디렉토리.
/etc : 패스워드파일등 시스템의 전체 환경설정파일을 저장하고 있는 디렉토리.
/home : 사용자의 ㅎㅁ디렉토리, 대부분 ID와 동일한 이름의 디렉토리를 가짐.
/lib : 프로그램(C, C++등)에 필요한 각종 라이브러리를 저장
/media : 플로피, CD-ROM등 마운트를 위한 디렉토리.(/mnt in redhat9)
/proc : 실행중인 프로세스나 현재 시스템정보를 파일형태로 저장하고 있는 가상디렉토리.
/root : root의 홈디렉토리.
/sbin : 시스템 관리자용 명령어를 저장하고 있는 디렉토리.
/tmp : 일시적인 저장을 위한 디렉토리.
/usr : 각종 어플리케이션등이 설치되어 있는 디렉토리.
/var : 시스템운용 중에 생성되었다가 삭제되는 데이터를 일시적 저장을 위한 디렉토리.
/usr/bin : 일반사용자들이 사용가능한 명령어 파일들이 존재하는 디렉토리.
/usr/X11R6 : X 윈도우 시스템의 루트 디렉토리.
/usr/include : C 프로그램에 필요한 헤드파일(*.h) 디렉토리.
/usr/lib : /lib에 들어가지 않은 라이브러리 디렉토리.
/usr/man : 명령어들의 도움말을 주는 매뉴얼(manual)페이지 디렉토리.
/usr/sbin : /bin에 제외된 명령어와 네트워크관련 명령어가 들어있는 디렉토리.
/usr/src : 프로그램 소스(주로 커널소스)가 저장되는 디렉토리.
/usr/local : MYSQL, Apache등과 같은 어플리케이션들이 설치되는 장소.
/var/log : 각종 로그파일(messages 파일등)이 저장되는 디렉토리.
/var/spool/mail : 각 계정사용자들의 메일파일이 저장되는 디렉토리
/var/spool/lpd : 프린트를 하기 위한 임시 디렉토리(스풀링 디렉토리).
/var/spool/mqueue : 발송을 위한 메일 일시저장 디렉토리
/var/spool/cron : 각 사용자들의 cron 설정파일들이 저장된 디렉토리
/var/spool/at : atd 즉, 예약작업에 간한 파일들이 저장되는 디렉토리
/var/ftp : FTP서비스를 위한 다운로드될 파일들 즉, FTP홈디렉토리
/var/www : RPM으로 설치된 아파치의 홈페이지 파일들이 저장되는 디렉토리 즉, 아파치 홈페이지 디렉토리
/var/named : BIND 즉, DNS에서 사용하는 zone파일들이 저장되는 디렉토리
/etc/mail : sendmail.cf나 access파일등의 sendmail의 설정파일들이 존재하는 디렉토리
/etc/ssh : SSH서비스, 즉 sshd데몬에서 사용하는 각종 설정파일들이 존재하는 디렉토리
/etc/squid : squid 프락시서버의 설정파일들이 저장된 디렉토리
/etc/samba : 삼바관련 설정파일들이 저장된 디렉토리
/etc/skel : 계정사용자 생성시의 초기화파일들이 저장된 디렉토리(useradd에서 사용함)
/etc/rd.d : 부팅레벨별 부팅스크립트파일들이 존재하는 디렉토리
/etc/pam.d : PAM설정 정보파일들이 저장된 디렉토리
/etc/httpd : RPM으로 설치된 아파치 설정파일(httpd.conf등)들이 저장된 디렉토리

* 리눅스 부팅과정
1. 전원스위치 ON
2. BIOS프로그램 실행
3. ROM-BIOS의 POST(자체진단기능) 수행
4. ROM-BIOS가 부트로더(GRUB)를 불러들임
5. ROM-BIOS의 실행종료와 GRUB의 실행시작
   검색된 부팅매체의 0번 섹터(대부분 MBR 이라고 부름)에서 Boot Program을 읽어들여 메모리로 적재(로드, load)합니다.
6. GRUB의 실행초기 단계
   GRUB의 메뉴, 입력대기상태
7. GRUB에 의한 부팅메뉴 선택
   여기서 선택한 부팅메뉴로 GRUB은 부팅을 계속해 나갑니다.
   GRUB 설정 파일(/boot/grub/grub.conf, /boot/grub/menu.lst)
8. GRUB이 커널이미지를 메모리로 적재와 swapper 호출
   GRUB은 입력된 커널이미지를 메모리로 불러들입니다.(적재, load) 메모리로 load된 커널은 swapper를 호출합니다.
9. swapper의 장치 드라이브 초기화
   GRUB에 의해 swapper라는 pid 0번인 프로세스가 실행이 되며 swapper는 각 장치 드라이브들을 초기화 합니다.
10. swapper의 init프로세스 실행
    swapper라는 프로세스튼 다시 pid 1인 init프로세스(/sbin/init)를 실행하게 됩니다. 즉, swapper가 init프로세스를 실행시키고 본연의 swapper로서의 기능을 수행하기 시작합니다.
11. init프로세스의 /etc/inittab파일 호출
    init프로세스는 /etc/inittab파일을 읽어들입니다. 특, init프로세스는 제일먼저 /etc/inittab 파일을 읽어서 init프로세스가 무엇을 해야할 것이가를 결정하게 됩니다.
    /etc/inittab파일내의 각 행의 포맷
    name: level-number:options:process -options
    세번째 항목인 options 에 올 수 있는 것들
    - respawn  : 프로세스가 종료될때마다 재실행됩니다.
    - wait  : 지정된 프로세스가 실행되면 init은 프로세스가 종료될 때까지 기다린 후에 다음 작업으로 넘가도록 하는 옵션입니다.
    - once  : 해당 프로세스를 한번만 실행되도록 하는 옵션입니다.
    - boot  : 시스템이 부팅되는 동안 해당 프로세스가 실행되며, init은 실행레벨필드를 무시합니다.
    - bootwait  : 시스템이 부팅되는 동안 해당 프로세스가 실행되며, init은 프로세스가 종료될 때까지 기다립니다.
    - off  : 아무런 동작도 발생하지 않도록 하는 옵션입니다.
    - ondemand  : 실행레벨이 1, 2, 3인 경우에만 ㅇ용합니다. init은 이 세개의 실행레벨과 함께 호울될 때만 프로세스가 작동합니다. 잘 사용되지 않는 옵션입니다.
    - initdefault : 시스템이 부팅되면서 어떤 실행레벨로 부팅을 할 것인가를 결정하게 하는 옵션입니다. 즉, 시스템의 실행레벨을 결정하는 옵션입니다.
    - sysinit  : 시스템이 부티오디는 동안 한번만 프로세스가 실행하는 옵션이니다. sysinit은 boot나 bootwait보다 우선권을 가집니다.
    - powerwait  : init은 SIGPWR신호를 받는 경우에만 프로세스가 가동됩니다.
    - powerfail  : powerwait과 같지만, init은 프로세스가 돤력도ㅚㄹ 때까지 기다리지 않습니다.
    - powerokwait : init가 SIGPWR신호를 받고 /etc/powerstatus라는 텍스트 파일에 OK라는 문자열이 있을 때 프로세스가 실행됩니다.
    - ctrlaltdel : 이 옵션은 init프로세스가 SIGINT신호를 받았을 때에 싱행되록 합니다.
    - kbrequest  : 이 옵션은 init프로세스가 키보드관리자로부터 keyboardsignal을 받았을 때에 해당프로세스를 실행되도록 합니다.
12. init에 의해 /etc/rc.d/rc.sysinit 실행
    /etc/rc.d/rc.sysinit 파일은 실행레벨가는 무관하게 부팅과 함께 일회만 실행이 됩니다.
    /etc/rc.d/rc.sysinit 파일의 역할
13. init에 의해 각 부팅 레벨별 스크립트 실행
    앞 단계에서 결정된 실행레벨에 따라서 설정되어 있는 모든 프로세스들을 실행하게 됩니다.
14. init에 의해 /etc/rc.d/rc.local 파일 실행
15. init에 의해 /sbin/update 실행
16. init에 의해 CRTL+ALT+DEL키 작동 설정
17. init에 의해 전원관리 설정
18. init에 의해 6개의 가상콘솔 실행
    콘솔 로그인을 위해 /sbin/mingetty를 실행합니다.
19. init에 의해 콘솔(첫번째 가상콘솔)로그인 프롬프트 실행됨

* 사용자 관리
1. 사용자 생성
# useradd bible
# passwd bible
# grep bible /etc/passwd
bible:x:500:500:/home/bible:/bin/bash
# grep bible /etc/shadow
bible:$akdsjflkjalkdjfakdjfa;dkjfqpijfa:12784:0:99999:7:::
# grep bible /etc/group
bible:x:500:
# ls /home/bible
# ls -l /var/spool/mail/bible
-rw-rw---- 1 bible mail 0 Jan 1 13:46 bible
# useradd -d /user/bible2 -u 1000 -s /bin/sh bible2
# grep bible2 /etc/passwd
bible2:x:1000:1000::/user/bible2:/bin/sh
# grep bible2 /etc/shadow
bible2:!!:12784:0:99999:7:::
# grep bible2 /etc/group
bible2:x:1000
# ls /user/bible2
# useradd -d /user/bible3 -u 2000 -s /bin/csh -c parkSungSoo -e 2011-12-3 -p 88888888 bible3
  -d /user/bible3 : 홈디렉토리 위치를 /user/bible3으로 지정함
  -u 2000  : UID를 2000으로 지정함
  -s /bin/csh  : bible3 사용자가 기본으로 사용할 쉘종류를 C쉘로 지정함
  -c ParkSungSoo : 계정사용자의 간단한 코멘트문(주로 이름이나 사무실명등을 지정함)
  -e 2011-12-31  : bible3 사용자의 계정사용 종료일자를 2011년 12월 31일로 지정함
  -p 88888888  : bible3사용자의 기본 패스워드를 88888888로 지정함
  bible3  : 생성할 계정명(bible3)을 지정함
# grep bible3 /etc/passwd
bible3:x:2000:2000:ParkSungSoo:/user/bible3:/bin/csh
# grep bible2 /etc/shadow
bible2:88888888:12784:0:99999:7::15339:
# grep bible2 /etc/group
bible3:x:2000
# ls /user/bible3
- useradd 명령이 참조하는 파일들
  a. /etc/default/useradd 파일
     이 파일은 useradd 명령어로 새로운 사용자를 생성할 때에 기본적으로 사용할 홈디렉토리와 사용할 쉘종류, 종료일자, 기본소속그룹, 홈디렉토리에 복사될 초기화 파일들의 위치등을 정의하고 있는 파일입니다.
     GROUP=100
     HOME=/home
     INACTIVE=-1
     EXPIRE=   # EXPIRE="2010-10-30"
     SHELL=/bin/bash
     SKEL=/etc/skel
  b. /etc/login.defs
     MAIL_DIR  각 계정사용자들의 메일파일이 저장될 위치를 지정
     PASS_MAX_DAYS 계정사용자들이 패스워드를 변경하지 않고 동일한 패스워드를 지속적으로 사용할 수 있는 최대일자
     PASS_MIN_DAYS 패스워드 변경없이 사용할 수 있는 최소일자
     PASS_MIN_LEN 각 계정사용자들이 패스워드문자로 지정할 수 있는 최소바이트수(영문자수)
     PASS_WARN_AGE 패스워드 종료일자가 다가오기 몇일 정부터 패스워드 사용불가에 대한 안내메시지를 알려줄 것인가를 지정한 것이다.
     UID_MIN  일반사용자의 UID번호를 할당할 때에 자동 할당할 최소 UID번호를 지정
     UID_MAX  리눅스 서버에서 생성할 수 있는 UID의 최대값
     GID_MIN  새로 생성되는 그룹의 GID 시작번호
     GID_MAX  새로 생성되는 그룹에서 지정할 수 있는 최대 GID번호
     CREATE_HOME 새로 생성되는 계정사용자의 홈디렉토리를 생성할 것인가를 결정하는 값
  c. /etc/skel
     사용자를 생성할 때, 이 디렉토리의 모든 파일들이 사용자의 홈디렉토리로 복사된다.
2. 사용자 삭제
# userdel [-r] 사용자명
# userdel bible2
# userdel -r bible3
3. 사용자 정보변경
# usermod -d /usr/sspark5 sspark5 -> 홈디렉토리 변경
# usermod -e 2006-12-31 sspark5 -> 계정사용종료일 설정
# usermod -s /bin/csh sspark5 -> 기본사용쉘 변경
# usermod -u 508 sspark5 -> UID 변경
# usermod -l bible5 -p 12345678 sspark5 -> 아이디를 bible5로 패스워드를 12345678로 변경
4. 사용자를 일시적으로 로그인하지 못하게 하기
# grep test00 /etc/shadow
# passwd -l test00
test00:$1$tAeIn2Ca$mLxnIr.n4VO/4jqa85F/8/:13229:0:99999:7:::
# grep test00 /etc/shadow
test00:!!$1$tAeIn2Ca$mLxnIr.n4VO/4jqa85F/8/:13229:0:99999:7:::
# passwd -u test00
# grep test00 /etc/shadow
test00:$1$tAeIn2Ca$mLxnIr.n4VO/4jqa85F/8/:13229:0:99999:7:::
5. 모든 일반사용자들의 일시적인 서버접속 금지방법
# touch /etc/nologin -> 이 파일이 있으면 root 를 제외한 일반사용자는 로그인할 수 없다.

* passwd : 사용자 패스워드 관리
# passwd [-k] [-l] [-u [-f]] [-d] [-S] [사용자 ID]
# passwd widemail -> widemail 사용자 패스워드 변경
# passwd -S widemail -> widemail의 패스워드를 MD5로 암호화한다.
# passwd -l widemail -> widemail 사용자의 패스워드에 lock를 건다. widemail 사용자는 로그인할 수 없다.
# passwd -u widemail -> widemail 사용자에게 걸었던 lock을 해제한다.
# passwd -d widemail -> widemail 사용자자의 패스워드를 삭제한다. widemail 사용자는 어떤 패스워드로도 로그인이 가능하다.

* 그룹 관리
1. 그룹생성
# groupadd [-g GID] [-o] [-r] [-f] 새로생성할그룹명
# groupadd chongmu
# tail -1 /etc/group
chongmu:x:505:
# groupadd -g 1000 youngup
# tail -1 /etc/group
youngup:x:1000:
# groupadd -r sysadmin -> -r 옵션으로 시스템여역의 GID를 할당받는다.
# tail -1 /etc/group
sysadmin:x:11:
2. 그룹삭제
# groupdel sysadmin

* 로그인 메시지 관리
- /etc/issue  : 콘솔(console)접속 시도시(접속완료전)에 보여줄 메시지파일
- /etc/issue.net : 원격지에서 접속 시도시(접속완료전)에 보여줄 메시지파일
- /etc/motd  : ID, 패스워드로 인증을 받은 후 즉, 접속완료후에 보여줄 메시지파일

* 프롬프트 변경
쉘프롬프트의 모양을 결정하는 것은 프롬프트의 변수인 PS1이라는 변수에 값을 변경함으로써 가능합니다.
# echo $PS1
[\u@\h \W]\$
PS1쉘변수의 값으로 사용할 수 있는 기호들
\t 24시간제로 현재시간을 나타냄. 표시형식은 시:분:초, 즉 "HH:MM:SS"의 형식임
\T 12시간제로 현재시간을 "HH:MM:SS"형식으로 표시함
\@ 12시간제로 현재시간을 "오전/오후"형식으로 표시함
\d 현재 날짜를 나타냄. 표시형식은 "요일 월 일"의 문자로 표시됨
\s 현재 사용중인 쉘의 이름을 표시함(C쉘이면 /bin/csh, bash쉘이면 /bin/bash임)
\w 현재디렉토리의 전체 절대경로를 모두 표시함
\W 현재 디렉토리의 전체 절대경로명중 마지막 디렉토리명만을 표시함. 즉, 현재 디렉토리명만을 표시함.
\u 사용자명을 표시함
\h 서버의 호스트명을 표시함.(예: http://www.superuer.co.kr/에서 www부분)
\H 서버의 도메인명을 표시함.(예: http://www.superuser.co.kr/에서 superuser.co.kr부분)
\# 접속한 순간부터 사용한 명령어의 번호를 1번부터 차례대로 표시함. 즉, 명령어를 사용한 횟수를 표시하기 위함이 목적임.
\! 사용한 명령어의 history번호를 표시함
\$ 현재 사용자가 root(UID가 0이면)이면 #을 표시하고 아니면 $를 표시함
\\ "\"문자 자체를 표시함
\a ASCII 종소리 무자(07)
\E ASCII의 escape문자(033)
\n 개행문자(줄바꾸기)
\v 사용중인 bash의 버전
\V 사용중인 bash의 배포, 번전+패치수준으로 버전을 상세히 표시함.
\r Carrage return
\nnn 8진수 nnn에 해당하는 문자

* 시간 관리
1. clock : CMOS의 시간을 설정
-u : CMOS의 시각을 국제시각으로 조정한다.
-r : CMOS의 시각을 출력한다.
-w : 리눅스시스템 시각으로 CMOS시각을 조정한다.
-s : CMOS의 시각으로 리눅스시스템시각을 조정한다.
-a : CMOS의 시각으로 리눅스시스템시각으로 조정하고 다시 CMOS에 조정한다.
# clock -r -> CMOS 시간을 읽기
Thu 23 Mar 2006 12:56:56 AM KST  -0.918420 seconds
# clock -w -> 리눅스의 시스템시간으로 CMOS 시간 설정
# clock -s -> CMOS 시간으로 리눅스의 시스템시간을 설정
2. date
   - date 로 시간설정
# date MMDDhhmmYY -> 시간 설정
MM 월
DD 월 중 일
hh 시
mm 분
CC 연도의 처음 두 숫자(선택적)
YY 연도의 나중 두 숫자(선택적)
ss 초(선택적)
# date 020301012005
# date
Thu Feb 3 0:01:03 KST 2005
   - date 로 시간츨력
     a. 시간 필드:
       %H     시 (00..23)
       %I     시 (01..12)
       %k     시 ( 0..23)
       %l     시 ( 1..12)
       %M     분 (00..59)
       %p     로케일의 AM 또는 PM
       %r     시간, 12-시간제 (hh:mm:ss [AP]M)
       %s     1970-01-01 00:00:00 UTC (비표준 확장기능)로 부터 경과된 초
       %S     초 (00..61)
       %T     시간, 24-시간 (hh:mm:ss)
       %X     로케일에서 정의한 시간 표현(%H:%M:%S)
       %Z     시간대 (에, EDT), 시간대를 결정할 수 없는 때는 아무 값도 출력하지 않는다.
     b. 날짜 필드:
       %a     로케일의 약식 요일 이름 (Sun..Sat)
       %A     로케일의 완전한 요일 이름, 가변 길이 (Sunday..Saturday)
       %b     로케일의 약식 월 이름 (Jan..Dec)
       %B     로케일의 완전한 월 이름, 가변 길이 (January..December)
       %c     로케일의 날짜와 시간 (Sat Nov 04 12:02:33 EST 1989)
       %d     월 중 일 (01..31)
       %D     날짜 (mm/dd/yy)
       %h     %b 와 동일
       %j     연 중 일 (001..366)
       %m     월 (01..12)
       %U     연 중 주 번호, 일요일을 주의 첫번째 날로 생각 (00..53)
       %w     요일 번호 (0..6), 0 은 일요일
       %W     연 중 주 번호, 월요일을 주의 첫번째 날로 생각 (00..53)
       %x     로케일의 날짜 표현식 (mm/dd/yy)
       %y     연 중 일의 마지막 두 숫자 (00..99)
       %Y     연 (1970...)
3. rdate : 운격타임서버로부터 날짜시간정보 구하기
# rdate [-p] [-s] [-u] -[l] [타임서버]
# rdate -p time.bora.net
rdate: [time.bora.net]  Thu Mar 23 01:06:43 2006
# rdate -s time.bora.net
# rdate -s time.kriss.re.kr
# crontab -l | grep rdate
00 01 * * * /usr/bin/rdate -s time.bora.net && /sbin/clock -w

* 리눅스의 커널버전 및 배포판버전 확인
# uname -a
Linux mail.jpd.co.kr 2.6.15-1.1833_FC4 #1 Wed Mar 1 23:41:37 EST 2006 i686 i686 i386 GNU/Linux
# uname -r
2.6.15-1.1833_FC4
# cat /etc/redhat-release
Fedora Core release 4 (Stentz)
# cat /proc/version
Linux version 2.6.15-1.1833_FC4 (bhcompile@hs20-bc1-1.build.redhat.com) (gcc version 4.0.2 20051125 (Red Hat 4.0.2-8)) #1 Wed Mar 1 23:41:37 EST 2006
# cat /proc/sys/kernel/osrelease
2.6.15-1.1833_FC4

* USB 장치 사용
1. USB장치를 리눅스서버에 꼽아두십시오.
2. USB장치를 마운트할 마운트포인트를 생성한다.
# mkdir /media/usb
3. modprobe명령어로 ide-scsi모듈을 로드한다.
# modprobe ide-scsi
4. 리눅스에서 대부분 USB장치는 /dev/sda 또는 /dev/sdb 또는 /dev/sdc등의 장치명을 사용하는데 현재 리눅스서버에서 사용되고 있지 않은 장치명을 USB장치명으로 사용할수 있다.
   어떤 장치명에 할당되었는가를 확인하기 위하여 다음과 같이 "fdisk -l"을 실행해 본다.
# fdisk -l
Disk /dev/sdc: 32M, 32768000 bytes
2 heads ...
5. USB장치가 /dev/sdc장치를 사용하는 것을 확인했으므로, 해당 장치를 마운트한다.
# mount -t vfat /dev/sdc /media/usb
6. 사용이 끝나면 마운트를 해제한다.
# umount /media/usb

* rename 명령어
# ls
test1  test2  test3  test4  test5
# rename test test0 test?
  - test : 변경전 파일패턴
  - test0 : 변경후 파일패턴
  - test? : 적용대상파일들, 여기서 ?는 임의의 문자를 의미한다.
# ls
test01  test02  test03  test04  test05
# rename test0 test test??
# ls
test1  test2  test3  test4  test5

* find 명령어
사용형식: find [찾을 디렉토리경로] [찾기옵션] [찾은후 수행할 작업]
[찾을 디렉토리경로]
.   : 현재 디렉토리 이하를 검색대상으로 한다.
/   : 루트디렉토리(파일시스템전체)이하를 대상으로 한다.
~ID : 지정된ID의 홈대렉토리이하를 대상으로 한다.
[찾기옵션]
-empty  : 비어있는 파일을 찾는다.
-uid UID : 지정된 UID를 갖는 파일을 찾는다.
-gid GID : 지정된 GID를 갖는 파일을 찾는다.
-group 그룹명 : 지정된 group을 가진 파일을 찾는다.
-name  : 지정된 형식의 패턴을 가지는 파일을 찾는다.
-newer  : 지정된 파일 이후에 생성된 파일을 찾는다.
-perm  : 지정된 퍼미션을 가진 파일을 찾는다.
-used 일자수 : 최근 n일 이후에 변경된 파일을 찾는다.
-user  : 지정된 파일을 소유하고 있는 소유자의 모든 파일을 찾는다.
[찾은후 수행할 작업]
-exec "수행명령어" : 검색된 파일을 대상으로 "수행명령어"(쉘명령어)를 실행한다.
1. 특정 사용자의 ID소유로된 모든 파일 찾기
# find / -user test01 -print
2. 특정 사용자의 홈디렉토리 내에서  특정 파일 찾기
# find /home/test01 -name *.html -print
# find ~test01 -name *.html -print
3. 시스템내의 특정파일들을 검색하여 자동삭제하는 방법
# find ~test01 -name *.bak -exec rm -f {} \;
4. 지정한 소유자의 모든 파일을 찾아서 확인하기
# find / -user test01 -exec ls -l {} \;
5. 서버내의 불필요한 파일들 모두 정리(삭제)하기
# find / -name access_log -exec rm -f {} \;
6. 특정용량 이상되는 파일들 모두 찾기(용량단위로 파일검색)
# find /usr -size +10000k -exec ls -l {} \;
7. 특정 퍼미션을 가지고 있는 파일들 모두 찾기
# find / -perm 4755 -exec ls -l {} \;
8. 특정디렉토리내에 존재하는 모든 디렉토리 목록만 확인하기
# find ~test01 -type d -print
9. 서버내에 존재하는 모든 링크파일 검사하기
# find / -type l -exec ls -l {} \;
10. 쓰기 권한이 있는 파일 및 디렉토리 찾기
# find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;
# find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \;
11. 특정문자를 포함하는 파일찾기와 그 문자가 속한 행 찾기
# find ~test01 type f -exec egrep -i "doc" /dev/null {} \;

* 하드디스크 추가
1. 현재 사용중인 하드디스크 확인(추가전)
# cat /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
none                    /dev/pts                devpts  gid=5,mode=620  0 0
LABEL=/home             /home                   ext3    defaults        1 2
LABEL=/jms              /jms                    ext3    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /dev/shm                tmpfs   defaults        0 0
LABEL=/tmp              /tmp                    ext3    defaults        1 2
/dev/sda3               swap                    swap    defaults        0 0
/dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0
# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda2              5036316    884644   3895840  19% /
/dev/sda1               101089     14577     81293  16% /boot
/dev/sda6              1004024     66172    886848   7% /home
/dev/sda7              9345096   3285944   5584436  38% /jms
none                    127648         0    127648   0% /dev/shm
/dev/sda5              1004024     16436    936584   2% /tmp
# mount
/dev/sda2 on / type ext3 (rw)
none on /proc type proc (rw)
usbdevfs on /proc/bus/usb type usbdevfs (rw)
/dev/sda1 on /boot type ext3 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda6 on /home type ext3 (rw)
/dev/sda7 on /jms type ext3 (rw)
none on /dev/shm type tmpfs (rw)
/dev/sda5 on /tmp type ext3 (rw)
2. 추가할 HDD를 HDD확장슬롯에 장착한다.
3. 새로운 HDD를 장착한 후에 서버를 재부팅한다.
4. 재부팅이 끝나고 나면 dmesg란 명령어를 사용하여 장착된 SCSI HDD의 정보를 확인한다.
SCSI device sdb: 71687340 512-byte hdwr sectors (36704 MB)
5. SCSI ID를 확인했다면 이제 fdisk를 실행시켜 파티션을 설정해 준다.
6. 작성된 파티션을 사용하기 위해 파일시스템을 생성한다.
# mke2fs /dev/sdb1 -> for ext2 filesystem
# mke2fs /dev/sdb1 -j -L /data -> for ext3 filesystem
7. 준비된 파티션을 마운트를 시키기 위해 디렉토리를 작성하고 마운트를 시킨다.
# mkdir /data
# mount -t ext2 /dev/sdb1 /data -> for ext2 filesystem
# mount -t ext3 /dev/sdb1 /data -> for ext3 filesystem
8. 부팅시 자동마운트 되게 하기 위한 파일시스템테이블 수정
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
none                    /dev/pts                devpts  gid=5,mode=620  0 0
LABEL=/home             /home                   ext3    defaults        1 2
LABEL=/jms              /jms                    ext3    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /dev/shm                tmpfs   defaults        0 0
LABEL=/tmp              /tmp                    ext3    defaults        1 2
/dev/sda3               swap                    swap    defaults        0 0
/dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0
LABEL=/data             /data                   ext3    defaults        1 2
9. 파일시스템 생성 최종확인
# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda2              5036316    884644   3895840  19% /
/dev/sda1               101089     14577     81293  16% /boot
/dev/sdb1             35278540     32828  33453664   1% /data
/dev/sda6              1004024     66172    886848   7% /home
/dev/sda7              9345096   3285944   5584436  38% /jms
none                    127648         0    127648   0% /dev/shm
/dev/sda5              1004024     16436    936584   2% /tmp

* 서버 메모리상태 점검하기
# free
             total       used       free     shared    buffers     cached
Mem:        255300     178908      76392          0      17696      20380
-/+ buffers/cache:     140832     114468
Swap:      1020116     230444     789672
- Mem행은 시스템의 물리적인 메모리에 대한 사용량을 각 필드로 표시한 것이다.
  total은 전체 메모리의 용량
  used는 현재 시스템에서 사용중인 메모리의 용량
  free는 현재 시스템에서 사용중이지 않은 메모리의 용량
  shared는 현재 시스템에서 공유한 메모리의 용량
  buffers는 현재 시스템에서 버퍼링(buffering)된 메모리의 용량
  cached는 현재 시스템에서 캐싱(caching)된 메모리의 용량
- -/+ buffers/cache 는 현재 캐시메모리에서 버퍼링된 사용량을 표시한다.
- Swap메모리는 스왑메모리의 용량이다.
  total은 시스템의 전체 Swap메모리의 용량
  used는 전체 스왑메모리에서 현재 사용중인 스왑메모리의 용량
  free는 전체 스왑메모리에서 사용되지 않고 남았는 메모리의 용량

* ping 응답 설정/해제
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all -> ping에 응답하지 않게 설정
# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all -> ping에 응답하도록 설정

* Quota 설정
quota와 관련하여 알아두셔야하는 것은 다음과 같습니다.
- 커널쿼타지원여부 : 커널(kernel)에서 해당 파일시스템의 quota지원이 되는가?
- quota   : 설정된 각 사용자(그룹)의 quota를 확인한다.
- edquota  : 각 사용자(그룹)의 디스크 quota를 설정한다.
- quotaon  : 시스템에서 quota를 가동한다.
- quotaoff  : 시스템에서 quota를 중지한다.
- quotacheck  : 시스템에서 quota 상황을 확인한다.
- repquota  : 사용자들의 quota설정내역을 확인한다.
1. quota 적용을 위한 피일시스템 수정사항
quota를 적용할 파티션의 파일시스템 마운트시에 usrquota라는 속성을 넣어서 마운트한다.
# grep usrquota /etc/fstab
LABEL=/home  /home  ext3 defaults,usrquota 1 2
2. 시스템커널에서 quota지원여부 확인하기
/var/log/messages파일과 dmesg명령어로 quota관련 내용을 확인한다.
# dmesg | grep quota
VFS: Disk quotas dquot_6.5.1
3. 특정 사용자의 quota설정 내역을 확인하는 방법
# quota -v dhan
Disk quotas for user dhan (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 23680 0 50000 1887 0 0
quota에서 "Soft Limit"이란 일반적인 용량제한범위를 의미하는 것으로 여기서 설정된 용량을
넘기게 되면 일단은 유예기간(grace period)내에서는 허용은 하지만 경고를 받게 됩니다.
quota에서 "Hard Limit"이란 절대적으로 넘을 수 없는 용량제한을 의미합니다.
사용자에게 허용된 용량의 10%정도를 추갈 저장할 수 있도록 설정할 수 있다.
quota에서 "Grace Period"란 유예기간으로서 해당 사용자의 용량이 "Soft Limit"을 넘기는
시점부터 적용되어 용량초과를 허용할 시간을 의미합니다.
4. 일반사용자의 자기자신의 quota설정내역 확인하는 방법
# quota -u dhan
Disk quotas for user dhan (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda6 23680 0 50000 1887 0 0
5. 특정 그룹의 디스크용량 설정내용 확인하기
# quota -g dhan
Disk quotas for group dhan (gid 500): none
6. 디스크사용량 제한 설정하는 edquota
# edquota -u dhan
설정한 후 quota를 적용할 파일시스템에서 aquota.user 파일을 생성한다.
# cd /home
# touch aquota.user
# chmod 640 aquota.user
7. quota가동과 중지
# quotaon -avug
-a : quota옵션이 들어가 있는 파일시스템은 자동으로 가동한다.
-v : quota가 가동된 각 파일시스템들의 메시지를 출력한다.
-u : 기본으로 적용되는 것으로 각 개별 사용자들의 quota설정을 읽어 적용한다.
-g : 각 그룹별 quota설정을 읽어 적용한다.
# quotaoff -aug
8. quota가동여부 및 상태 확인
# quotaon -a -p
9. quota가 설저오딘 파티션의 quota설정 및 용량제한 내역 확인
# repquota -av
-a : 보고할 파일시스템 대상을 지정하는 것으로 /etc/fstab에서 usrquota, grpquota가 설정된 모든 파일시스템을 대상으로 한다는 옵션이다.
-v : 사용량이 없는 사용자들의 보고도 포함하게 한다.
-g : 그룹quota에 대한 보고를 한다.
-u : 사용자의 qutoa에 대한 보고를 한다.(기본값)

* 동종 프로세스 모두 죽이기
# ps -ef | grep httpd | awk '{ print $2 }' | xargs kill -9
# killall httpd

* whowatc 유틸리티 : 현재 접속한 사용자 실시간 감시법

* idled 유틸리티 : 일정시간 미사용시 강제 로그아웃시키기

* 리눅스 커널에 이더넷카드 인식시키기
리눅스 커널에 이더넷카드를 인식하도록 하려면 다음과 같은 사항들을 확인해야합니다.
- 이더넷카드의 모듈이름
- 이더넷카드의 I/O(입출력)주소, 일반적으로 0x300을 사용함.
- 이더넷카드의 IRQ번호
- DMA를 사용하는 카드라면 DMA번호
- modprobe, insmod, lsmod, rmmod명령어 사용법
리눅스에서 커널모듈들은 모두 /lib/modules/<커널버전>/kernel 이라는 디렉토리에 위치하고 있다.
/lib/modules/<커널버전>/kernel/drivers/net이라는 디렉토리에는 네트워크 관련 커널모듈들이 있다.
레드햇 리눅스에서는 /boot/modules-info라는 파일내에 리눅스 커널모듈에 관한 정보를 저장하고 있다.
이렇게 확인 모듈을 커널에 올린다.
# modprobe 3c509 io=0x300 irq=13
# insmod 3c509 io=0x300 irq=13
대부분의 PCI카드는 io옵션과 irq옵션은 자동검색되므로 생략가능하다.
단 NE2000계열의 네트워크드라이브를 사용한다면 io옵션과 irq옵션을 지정해 주어야 한다.
그리고, io포트와 irq번호는 현재 사용중이 아닌 값으로 지정한다.
사용중인 io포트번호 확인
# cat /proc/ioports
사용중이 irq번호 확인
# cat /proc/interrupts
서버 재부팅후에 지속적으로 적용하기 위해서는 /etc/modules.conf파일에 (또는 /etc/modprobe.conf 파일)
관련 모듈 설정을 입력해 주어야 한다.
# cat /etc/modules.conf
alias eth0 e100
alias scsi_hostadapter aic7xxx
alias usb-controller usb-uhci

* 하드디스크 배드블록 검사
# badblocks -v /dev/sdb5
# badblocks -v /dev/sdb5 -o badlocks.txt
# badblocks /dev/fd0H1440 1440
- 디스크의 배드블록 마크하기
# e2fsck -cv /dev/sdb5

* 하드디스크 속도점검
- 버퍼링되어 있지않은 데이터의 디스크 ACCESS 속도 검사
# hdparm -t /dev/hda
- 버퍼링되어 있는 데이터의 디스크 ACCESS속도 검사
# hdparm -T /dev/hda
- CD-ROM 드라이브 읽는속도 검사
# hdparm -t /dev/cdrom

* fdisk : 디스크 파티션 작업 프로그램
현재 모든 디스크의 파티션설정현황 파악하기
# fdisk -l
특정 파티션을 대상으로 한 fdisk 시작과 종료
# fdisk /dev/sdb

The number of cylinders for this disk is set to 4462.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): m
Command action
   a   toggle a bootable flag   -> 부팅파티션을 설정할 수 있음.
   b   edit bsd disklabel   -> BSD로 디스크라벨 설정
   c   toggle the dos compatibility flag -> DOS호환가능한 플래그 설정
   d   delete a partition   -> 파티션을 삭제할 수 있음.
   l   list known partition types  -> 설저가능한 파티션 타입을 보여줌.
   m   print this menu    -> 파티션 설정도움말을 보여줌.
   n   add a new partition   -> 새로운 파티션을 생성할 수 있음.
   o   create a new empty DOS partition table -> 새로운 도스파티션 테이블을 생성함.
   p   print the partition table  -> 현재 설정된 파티션정보를 보여줌.
   q   quit without saving changes  -> 설정된 정보를 저장하지 않고 fdisk를 종료.
   s   create a new empty Sun disklabel  -> SUN 디스크라벨을 생성함.
   t   change a partition's system id  -> 파티션 타입을 변경할 수 있음.
   u   change display/entry units  -> 유닛(UNITS)정보를 열람하거나 변경할 수 있음.
   v   verify the partition table  -> 지정된 파티션을 검사함.
   w   write table to disk and exit  -> 현재까지 설정한 파티션정보를 저장하고 fdisk 종료.
   x   extra functionality (experts only) -> 파티션 전문가 모드로 들어감. 실린터수나 헤드수 그리고 트랙당 섹터수를 변경할 수 있음.

Command (m for help): q

* 리눅스 파일시스템 포맷(생성)하기
- mke2fs로 파일시스템을 생성하면 다음과 같은 세부항목들이 파일시스템내에 생성됩니다.
1. Block size 크기
2. Fragment size 크기
3. indoe의 수
4. 수퍼유저가 사용할 block의 수(전체 block의 5%를 차지함)
5. 첫 번째 데이터블록
6. Block group의 수
7. 그룹당 블록수
8. 그룹당 fragment의 수
9. 그룹당 inode의 수
# mke2fs [-c|-l 파일명] [-b 블로그기] [-f 프레그먼트ㅡ기] [-i 노드당바이트수] [-m 예약블록퍼센트] [-q] [-v] [-F] [-S] 장치명 [블록갯수]
# mke2fs -t ext2 /dev/hdb1 -> /dev/hdb1을 ext2 타입의 파일시스템으로 생성
# mke2fs -j /dv/hdb1  -> /dev/hdb1을 ext3 타입의 파일시스템으로 생성
# mke2fs -j -b 4096 /dev/hdb1 -> /dev/hdb1에 대해서 ext3타입의 파일시스템을 생성하면서 블록의 크기를 4069byte로 생성
# mke2fs -c /dev/hdb1  -> /dev/hdb1에 대한 배드블록을 점검한 후에 ext2파일시스템을 생성
# mke2fs -i 4096 /dev/hdb1 -> 아이노드 당 바이트수를 지정하여 파일시스템을 생성. -i옵션으로 주어지는 값은 최소 1024이상이다. 기본값은 4096
# mke2fs -j -m 20 /dev/hdb1 -> ext3파일시스템(-j)을 생성하면서 수퍼유저(root)의 예비블록으로 20%를 남겨둔다.
# mke2fs /dev/sdb1 -j -L /data
- 디스크 추가 장착시 작업 순서
1. 디스크 장착
2. fdisk로 파티션 생성
3. mkfs or mk2fs로 파일시스템 생성
4. mount 작업
5. 부팅시 자동마운트를 위하여 /etc/fstab에 등록
- mkfs로 리눅스 파일시스템 생성
# mkfs [-V] [-t 파일시스템타입] [파일시스템옵션] 장치이름 [블록]
옵션설명
-V : 자세한 정보를 보여준다.
-t : 생성할 파일시스템타입(ext2, ext3)
파일시스템옵션
-c : 파일시스테을 생성하기 전에 배드블록을 검사
-l 파일명 : 지정된 파일명으로부터 배드블록목록을 읽는다.
-v : 작업상태와 결과를 자세히 보여준다.
장치이름 : 자치명
# mkfs -t ext3 /dev/hdb1 -> ext3 타입의 파일시스템 생성
  => # mkfs.ext3 /dev/hdb1
# mkfs -t ext2 /dev/hdb1 -> ext2 타입의 파일시스템 생성
  => # mkfs.ext2 /dev/hdb1
# mkfs -V -t ext3 -j -L /data /dev/sdb1

* mount : 파일시스템 마운트하기
# mount -a [fnrvw] [-t 파일시스템타입]
# mount [-fnrvw] [-o 옵션[,...]] 장치 디렉토리
# mount [-fnrvw] [-t 파일시스템타입] [-o 옵션[,...]] 장치 디렉토리
# mount -t iso9660 /dev/cdrom /mnt/cdrom
# mount -r /dev/hdb1 /backup -> /dev/hdb1 파티션을 /backup디렉토리로 마운트를 하면서 -r옵션을 사용히여 쓰기 금지옵션을 사용하여 마운트한다. /backup디렉토리는 읽기만 가능하다.
# mount -w /dev/hdb1 /backup -> /dev/hdb1 파티션을 /backup디렉토리로 마운트하면서 -w옵션을 사용하여 쓰기가 가능하도록 마운트한다.
# mount -t ext3 /dev/hdb1 /backup
# mount -t vfat /dev/fd0 /mnt/floppy
# mount -t nfs 192.168.0.200:/web_data /web_data -> 마운트가 되면 192.168.0.200서버의 /web_data디렉토리를 현재 서버의 /web_data디렉토리처럼 사횽할 수 있다.
# mount -t nfs 192.168.0.201:/db_data /db_data

* /etc/fstab : 파일시스템 자동마운트 정보파일
# cat /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
LABEL=/data             /data                   ext3    defaults        1 2
none                    /dev/pts                devpts  gid=5,mode=620  0 0
LABEL=/home             /home                   ext3    defaults        1 2
LABEL=/jms              /jms                    ext3    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /dev/shm                tmpfs   defaults        0 0
LABEL=/tmp              /tmp                    ext3    defaults        1 2
/dev/sda3               swap                    swap    defaults        0 0
/dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0
- /etc/fstab 파일 구조
[파일시스템장치명] [마운트포인트] [파일시스템] [옵션] [dum관련설정] [파일점검옵션]
[파일시스템장치명] : 파일시스템의 장치명. 만약 레이블(LABEL)이 설정되어 있다면 장치명 대신 에이블명으로 지정할 수도 있다.
[마운트포인트]     : 파일시스템이 마운트될 위치.
[파일시스템]       : 파일시스템의 종류
    ext  초기 리눅스에서 사동되었던 파일시스템
    ext2 현재 많이 사용하고 있는 파일시스템
    ext3 저널링파일시스템으로서 ext2에 비해 파일시스템 복구기능과 보안부분을 크게 향상시킨 파일시스템
    iso9660 CD-ROM의 표준 파일시스템
    nfs  Network File System으로서 원격서버를 마운트할 때 사용.
    swap 스왑파일시스템
    ufs  UNIX FileSystem으로서 UNIX SYSTEM 5계역ㄹ에서는 표준파일시스템이다.
    vfat 윈도우 95나 98, 그리고, NT를 지원하기 위한 파일시스템
    msdos MS-DOS파티션을 사용하기 위한 파일시스템
    hpfs HPFS 파일시스템
    ntfs 윈도우NT나 200의 NTFS 파일시스템
    sysv 유닉스시스템 V를 지원하기 위한 파일시스템
    hfs  Mac 컴퓨터의 hfs파일시스템
    ramdisk RAM 디스크를 지원하는 파일시스템
[옵션]             : 파일시스템을 용도에 맞게 사용하기 위한 파일시스템 속성을 설정하는 옵션이다.
    defaults rw, nouser, auto, exec, suid 속성을 모두 가지는 속성임. 가장 일반적인 파일시스템에서 사용하는 속성임.
    auto 부팅시 자동마운트됨
    exec 실행파일이 실행되는 것을 허용하는 파일시스템
    suid SetUID와 SetGID의 사용을 허용하는 파일시스템
    ro  읽기전용 파일시스템으로만 사용됨(Read Only)
    rw  일고 쓰기 파일시스템으로 사용됨(Read, Write)
    user 일반 계정사용자들도 마운트를 할 수 있는 파일시스템.
    nouser 일반 계정사용자들은 마운트 할 수 없는 파일시스템. root만 mount할 수 있다.
    noauto 부팅시 자동마운트되지 않게 한다.
    noexec 실행파일을 실행되지 못하게 하는 파일시스템
    nosuid SetUID와 SetGID의 사용을 허용하지 않는 파일시스템
    usrquota 개별 계정사용자의 quota설정이 가능한 파일시스템
    grpqutoa 그룹별 quota설정이 가능한 파일시스템
[dum관련설정]      : 0또는 1을 가질 수 있다. 1은 데이터백업등을 위해 dump가 가능한 파일시스템이며, 0은 dump명령으로 덤프되지 않는 파일시스템이다.
[파일점검옵션]     : 0또는 1, 그리고 2가 올 수 있다. 0은 부팅시 실행되는 fsck가 실행되지 않는 설정이며, 1은 루트파일시스템을 의미하며, 2는 루트파일시스템이외의 파일시스템을 의미한다. 여기서 설정된 파일시스템의 순서를 기준으로 부팅시 실행되는 fsck의 순서가 결정된다.

* tune2fs : 파일시스템 튜팅 프로그램
# tune2fs [-l] [-c 최대마운트횟수] [-e 에러발생시반응] [-i 각점검간의간격] [-m 예약블록 퍼센트] [-r 예약블록갯수] [-u 사용자] [-g 그룹] 장치명
# tune2fs -l /dev/sdb1 == # dumpe2fs -h /dev/sdb1
tune2fs 1.38 (30-Jun-2005)
Filesystem volume name:   /dtc
Last mounted on:          <not available>
Filesystem UUID:          cfa85fdd-ba5b-461b-830b-b405810abcc4
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr filetype needs_recovery sparse_super
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              4480448
Block count:              8960764
Reserved block count:     448038
Free blocks:              7826381
Free inodes:              4478614
First block:              0
Block size:               4096
Fragment size:            4096
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         16352
Inode blocks per group:   511
Last mount time:          Tue Mar  7 18:34:27 2006
Last write time:          Tue Mar  7 18:34:27 2006
Mount count:              6
Maximum mount count:      35
Last checked:             Thu Feb 23 18:50:02 2006
Check interval:           15552000 (6 months)
Next check after:         Tue Aug 22 18:50:02 2006
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Journal backup:           inode blocks
# tune2fs -c 100 /dev/hdb1 -> /dev/hdb1 파일시스템의 최대 마운트횟수를 100으로 설정
# tune2fs -r 1000000 /dev/hdb1 -> /dev/hdb1 파일시스템의 예약블록갯수가 1000000으로 변경
# tune2fs -g wheel /dev/hdb1 -> /dev/hdb1 예약블록을 wheel그룹이 사용가능하도록 설정
# tune2fs -g 10 /dev/hdb1 -> /dev/hdb1 예약블록을 GID가 10인 그룹이 사용가능하도록 설정
# tune2fs -u dhan /dev/hdb1 -> /dev/hdb1 파일시스템을 dhan이라는 사용자도 예약블록을 사용할 수 있도록 설정
# tune2fs -u 500 /dev/hdb1 -> /dev/hdb1 파일시스템을 UID가 500인 사용자도 예약블록을 사용할 수 있도록 설정
# tune2fs -m 20 /dev/hdb1 -> /dev/hdb1 파일시스템의 예약블록의 용량을 20%로 설정

* Swap 용량 늘이기
1. swap파일시스템을 이용하기
# free
             total       used       free     shared    buffers     cached
Mem:        255300     231464      23836          0      22816      34928
-/+ buffers/cache:     173720      81580
Swap:      1020116     199116     821000
# swapon -s
Filename                        Type            Size    Used    Priority
/dev/sda3                       partition       1020116 199116  -1
# umount /data
# fdisk /dev/sdb -> 기존에 사용하던 파티션중 하나를 swap 파티션으로 변경한다.

The number of cylinders for this disk is set to 4462.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sdb: 36.7 GB, 36703918080 bytes
255 heads, 63 sectors/track, 4462 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sdb1   *         1      4462  35840983+  83  Linux

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 82
Changed system type of partition 1 to 82 (Linux swap)

Command (m for help): p

Disk /dev/sdb: 36.7 GB, 36703918080 bytes
255 heads, 63 sectors/track, 4462 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sdb1   *         1      4462  35840983+  82  Linux swap

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
# mkswap /dev/sdb1 -> /dev/sdb1에 swap 파일시스템 생성
Setting up swapspace version 1, size = 36701159 kB
# swapon /dev/sdb1 -> /dev/sdb1 swap 파일시스템을 활성화한다.
# free
             total       used       free     shared    buffers     cached
Mem:        255300     249548       5752          0      23036      35388
-/+ buffers/cache:     191124      64176
Swap:     36861088     199116   36661972
# swapon -s
Filename                        Type            Size    Used    Priority
/dev/sda3                       partition       1020116 199116  -1
/dev/sdb1                       partition       35840972        0       -2
# cat /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
LABEL=/data             /data                   ext3    defaults        1 2
none                    /dev/pts                devpts  gid=5,mode=620  0 0
LABEL=/home             /home                   ext3    defaults        1 2
LABEL=/jms              /jms                    ext3    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /dev/shm                tmpfs   defaults        0 0
LABEL=/tmp              /tmp                    ext3    defaults        1 2
/dev/sda3               swap                    swap    defaults        0 0
/dev/sdb1               swap                    swap    defaults        0 0
/dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0
# swapoff /dev/sdb1 -> /dev/sdb1 swap 파일시스템 해제.
# free
             total       used       free     shared    buffers     cached
Mem:        255300     234344      20956          0      21928      37092
-/+ buffers/cache:     175324      79976
Swap:      1020116     199116     821000
# swapon -s
Filename                        Type            Size    Used    Priority
/dev/sda3                       partition       1020116 199116  -1
2. swap파일을 이용하기
# dd if=/dev/zero of=swapfile bs=1024 count=1000 -> swap으로 사용할 파일 생성
1000+0 records in
1000+0 records out
# ls -l swapfile
-rw-r--r--    1 root     root      1024000 Mar 24 00:22 swapfile
# mkswap swapfile -> swap 파일에 swap 파일시스템생성
Setting up swapspace version 1, size = 1019 kB
# swapon swapfile -> swap 활성화
# free
             total       used       free     shared    buffers     cached
Mem:        255300     180912      74388          0      19836      23132
-/+ buffers/cache:     137944     117356
Swap:      1021108     199140     821968
# swapon -s
Filename                        Type            Size    Used    Priority
/dev/sda3                       partition       1020116 199140  -1
/data/swapfile                  file            992     0       -3
# swapoff swapfile
# free
             total       used       free     shared    buffers     cached
Mem:        255300     180968      74332          0      19932      23148
-/+ buffers/cache:     137888     117412
Swap:      1020116     199140     820976
# swapon -s
Filename                        Type            Size    Used    Priority
/dev/sda3                       partition       1020116 199140  -1

* finger : 로컬/원격 서버의 사용자 계정정보 확인
# finger widemail -> 로컬 계정사용자(widemail)의 계정정보 출력
Login: widemail                         Name: (null)
Directory: /home/widemail               Shell: /bin/bash
On since Thu Mar 23 14:55 (KST) on pts/1 from 192.168.0.11
   8 hours 46 minutes idle
On since Thu Mar 23 22:12 (KST) on pts/2 from 192.168.0.12
No mail.
No Plan.
# finger @192.168.0.3 -> 192.168.0.3에 접속해 있는 계정사용자 모두를 확인
# findger widemail@192.168.0.2 -> 192.168.0.2에 접속해 있는 widemail 게정정보 출력

* 파일 복수
# cp
-a : 복사대상 원본파일의  속성과 링크정보등을 그대로 유지하면서 복사하는 옵션 (= -dpR)
-b : 복사하고자 하는 파일이 동일한 이름으로 이미 그 위치에 존재하고 있을 경우, 덮어쓰기 또는 원본을 지우고 복사할 경우에 원본파일의 복사본을 만든다.
-f : 복사대상파일이 이미 그 위치에 존재한다면 파일을 지우고 복사한다.
-i : 복사대상파일이 이미 그 위치에 존재한다면 덮어쓸 것인가 또는 복사하지 않을 것인가를 사용자에게 확인하는 절차를 가진다.
-P : 복사대상이 되는 원본파일이 디렉토리경로와 함께 지정되었을 경우에 지정된 디렉토리경로를 그대로 복사한다.
-u : 복사되는 원본파일의 이름과 동일한 파일이 대상위치에 존재할 경우에 온본파일과 변경날짜를 비교하여 최신파일일 경우에 복사하지 않는다.
# install : 관리자 전용 복사명령어
# install [옵션] [-s] [--strip] 원본파일 복사파일
# install [옵션] [-s] [--strip] 원본파일.. 복사파일
# install [옵션] [-d,--directory] 디렉토리
-c : 전총 유닉스 버전과 호환을 위한 옵션
-d,--directory : 지정한 파일이 복사될 경로를 지정하는 옵션으로서 만약 지정한 경로명의 디렉토리가 존재하지 않는다면 직접 만들어서 복사를 한다.
-g,--group : 지정한 파일 복사시에 이 옵션으로 지정한 그룹명을 복사되는 파일의 소유그룹으로 지정하여 복사한다.
-m,--mode : 지정한 파일 복사시에 이 옵션으로 지정한 퍼미션을 복사되는 파일의 퍼미션으로 한다.
-o,--owner : 지정한 파일복사시에 이 옵션으로 지정한 소유자를 복사되는 파일의 소유자로 한다.
-s,--strip : 지정한 파일복사시에 이 옵션이 사용되면 strip명령을 수행한다.

* 디스크 사용량 점검
- du : 특정 디렉토리의 용랴응ㄹ 확인
# du -sh /etc -> /etc 전체 파일 및 디렉토리 용량의 합을 표시
- df : 파일시스템별 디스크사용량 점검
# df -k  -> 디스크사용량을 파티션별로 확인할 때 용량을 Kbyte 단위로 표시
# df -m  -> 디스크사용량을 파티션별로 확인할 때 용량을 Mbyte 단위로 표시
# df -h  -> 디스크사용량을 파티션별로 확인할 때 가장 적당한 용량단위로 표시
# df -a  -> 디스크용량 확인시에 모든 파일시스템을 대상으로 점검
# df -i  -> 파티션별 디스크용량 점검시에 inode사용정보를 표시
# df -T  -> 디스크사용량을 출력할 때에 파일시스템의 종류와 함께 표시
# df -t ext3 -> 특정 파일시스템의 종류만을 대상으로 디스크사용량 조사
# df -x ext3 -> 특정 파일시스템의 종류를 제외한 디스크사용량 조사

* ls
-R : 지정한 디렉토리이하에 있는 하부디렉토리와 파일들을 모두 포함한다.
-r : 출력결과를 정열할 때에서 내림차순으로 정렬한다.
-S : 파일사이즈가 가장 큰 것부터 순서대로 나열하게 된다.
-l : 파일들을 나열할 때에 자세한 출력을 한다.
-a : 경로안의 ㅁ든 파일을 나열한다. '.'으로 시작하는 파일들도 포함한다.
-A : 출력결과의 파일들에서 .과 ..은 제외한다.
-h : 파일사이즈를 용량단위(Mb, Gb)를 붙여서 출력한다.
# ls -l -> 찰일정보 자세히 표시
# ls -lr -> 파일명을 기준으로 내림차순 정렬하기
# ls -al -> 특정 디렉토리의 모든 파일 확인하기
# ls -m -> 콤마로 파일들을 구분하기
# ls -lF -> 파일의 끝부분에 파일형태를 표시하는 특수문자 표시하기
  일반적인 파일 : 아무런 표시도 하지 않는다.
  실행파일 : "*"를 붙여서 표시
  디렉토리 : "/"를 붙여서 표시
  심볼릭링크 : "@"를 붙여서 표시
  FIFO파일 : "|"를 붙여서 표시
  소켓파일 : "="를 붙여서 표시
# ls -aAl -> 현재디렉토와 상위디렉토리를 제외하고 표시
# ls -n -> 파일의 UID, GID 표시
# ls -lG -> 소유그룹정보 제외하기
# ls -1 -> 한 줄에 한 파일씩만 표시
# ls -lB -> 파일의 끝에 '~'가 붙은 파일(백업파일)은 출력제외하기
# ls -w 60 -> 가로길이를 지정하여 표시
# ls -l -I b* -> 특정패턴의 파일은 나열에서 제외하기
# ls -lR -> 서브디렉토리내의 모든 파일 함께 표시
# ls -lS -> 파일의 용량별로 내림차순 정렬하여 표시
# ls -lSr -> 파일의 용량별로 오름차순 정렬하여 표시
# ls -lX -> 파일확장자순으로 정렬하여 표시
# ls -lU -> 디스크저장 순서대로 표시
# ls -lL -> 심볼릭 링크파일을 일반 파일형태로 표시
# ls -lc -> 최근 변경시간을 기준으로 정령하여 표시
# ls -lt -> 파일의 시간순서대로 표시
# ls -lu -> 파일의 사용시간 순서대로 표시 (파일을 언제 접근했는지 표시)
# ls --fule-time -> 시간표시를 자세히 표시
# ls -li -> 파일리스트 맨 앞에 파일 색인번호를 표시
# ls -x -> 가로로 나열하여 표시
# ls -ls -> 파일의 크기를 KB단위로 표시
# ls -alRSh /backup -> 특정디렉토리 이하의 모든 파일을 대상으로 용량별로 정렬하여 표시

* 문자열 검색 및 편집
- grep에서 사용되는 검색문자패턴 정규표현식
  . : 아무문자나 한문자를 의미함.
  * : 어떤문자열이나 문자길에 무관한 문자열을 의미함.
  ^ : 행의 시작 위치를 의미함.
  $ : 행의 미지막 위치를 의미함.
  [] : 한문자 길이의 패턴리스트
  [^] : 지정된 문자들 이외의 문자들을 의히마(^는 여집합을 의미함)
  \ : 위에 오는 문자를 문자 그대로 인식(특수문자를 그대로 표현할 때 사용함)
  /< : 단어의 시작 위치를 의미함
  /> : 단어의 마지막 위치를 의미함
# grep [옵션] 검색할문자표현식 [파일..]
# grep [옵션] [-e 검색할문자표현식 | -f 파일] [파일..]
# 지정된 파일내에서 특정문자 찾기
# grep apache README -> README 파일에서 apache가 있는 행을 출력
# 지정된 파일내에서 특정문자를 포함한 행의 개수 출력
# grep -c apache README -> README에서 apache라는 문자열있는 행의 개수 출력
# 지정된 파일내에서 특정문자가 존재하지 않는 행만 검색
# grep -v apache README -> README에서 apache라는 문자열이 없는 행을 출력
# 지정된 파일 내에서 대소분자 구분없이 특정문자 검색하기
# grep -i apache README
# 특정 디렉토리내에서 디렉토리리스트만 확인하기
# ls -l /etc/ | grep "^d"
# 특정 디렉토리내에서 파일리스트만 보기
# ls -l /etc/ | grep -v "^d"

* touch
# 특정 파일의 날짜시간정보 변경
# touch MMDDhhmm[[CC]YY][.ss]
$ ls -l a
-rw-r--r--  1 widemail jms 21 Jan  1 10:10 a
$ touch -t 03241201 a
$ ls -l a
-rw-r--r--  1 widemail jms 21 Mar 24 12:01 a
# 특정파일의 날짜시간과 동일한 날짜시간을 다른 파일에 적용하기
$ ls -l a b
-rw-r--r--  1 widemail jms 21 Mar 24 12:01 a
-rw-r--r--  1 widemail jms  0 Jan  1 01:01 b
$ touch -r a b -> a파일의 날짜시간정보를 읽어서 b에 동일하게 적요
$ ls -l a b
-rw-r--r--  1 widemail jms 21 Mar 24 12:01 a
-rw-r--r--  1 widemail jms  0 Mar 24 12:01 b

* tar
# tar
-c : tar파일을 생성할 때(여러개의 파일을 하나의 파일로 묶을 때) 반드시 사용
-d : tar파일과 해당 파일시스템간의 차이점을 확인 하고자 할 때 사용
-r : tar파일에 다른 파일들을 추가하고자 할 경우에 사용
-t : tar파일의 내용을 확인하고자 할 때 반드시 사용
-f : tar파일을 사용할 때에는 반드시 사용
-p : tar파일을 생성할(풀) 때 원본 파일퍼미션을 그대로 유지함.
-v : 묶을 때나 풀 때 그 과정을 자세하게 보려고 할 때 사용
-Z : compress로 압축파일을 사용할 때 압축이나 해제까지 한번에 할 때 사용
-z : gzip(gunzip)과 관련하여 압축이나 해제를 한꺼번에 하려고 할 때 사용
-j : bzip2(bunip2)과 관련하여 압축하거나 해제하는 옵션으로 사용
# tarㄹ 파일 묶는 가장 기본적인 사용법
# tar cvf dir1.tar dir1
# tar로 묶여진 파일내의 파일리스트 확인하기
# tar tvf dir1.tar
# tar로 묶여지 파일 풀기
# tar xvf dir1.tar
# tar로 파일묶기와 압축하기를 동시에 하기
# tar cvfz dir2.tar.gz dir2
# tar로 묶고 압축된 파일 풀기
# tar xvfz dir2.tar.gz
# tar로 원본파일의 퍼미션을 그대로 유지한채로 묶고 압축하기
# tar cvfpz dir2.tar.g dir2
# tar로 워논파일 퍼미션을 유지한 채로 묶고 압축한 파일 풀기
# tar xvfpz dir2.tar.gz
# tar로 압축시에 용량단위로 나누어 압축하기 그리고 풀기
# tar cvfpz - /home/dhan | split -b 100m - widemail.tar.gz
# ls -l widemail.tar.g*
widemail.tar.gzaa widemail.tar.gzab widemail.tar.gzac
# cat home.tar.gz* | tar xvfpz -
# tar와 bzip2로 압축하고 tar와 bunzip2로 압축풀기
# tar cvfpj etc.tar.bz2 /etc
# tar xvfpj etc.tar.bz2


***********************************************************
* 로그 관리
***********************************************************

* 기본로그파일의 종류와 이해
리눅스 서버에서는 발생되는 기본적인 로그에는 ㅡ게 두가지가 있습니다. 첩선째 커널로그로서 kernel messages 라고하는 것으로 klogd라는 데몬에 의해 생성됩니다. 두번째 syslogd데몬에 의해 생성되는 로그입니다.
리눅스에서는 /var/log디렉토리에서 시스템의 모든 로그를 기록 및 관리하고 있습니다.
시스템의 /etc/syslog.conf파일에서 시스템 로그파일들의 위치를 지정하고 있습니다.
/var/log/boot.log : 리눅스가 부팅이 될 때 출력되는 모든 메시지를 기록하고 있다.
/var/log/cron: 시스템의 정기적이 작업에 대한 로그, 즉 시스템 cron작업에 대한 기록을 하고 있는 파일이다.
/var/log/messages : 리눅스 시스템의 가장 기본적인 시스템로그파일로서 시스템 운영에 대한 전반적인 메시지를 저장하고 있다.
/var/log/secure : 주로 사용자들의 원격로그인 정보를 기록하고 있는 로그파일ㄹ서 서버보안에 아주 민감하고 중용한 파일이다.
/var/log/xferlo : 리눅스 시스템의 FTP 로그파일로서 proftpd 또는 vsftpd 데몬들의 서비스내역을 기록하는 파일이다.

* /etc/syslog.conf 파일의 설정포맷
$ cat /etc/syslog.conf
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console  -> kernel에 관련된 로그를 /dev/console에 출력하라.

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages -> mail, 접속시의 인증 등에 대한 로그를 /var/messages에 기록하라.

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure  -> xinetd(tcp_wrapper)에 관련된 로그들을 /var/log/secure에 기록하라.

# Log all the mail messages in one place.
mail.*                                                  /var/log/maillog -> 메일에 관련된 로그를 /var/log/mail에 기록하라.


# Log cron stuff
cron.*                                                  /var/log/cron  -> 시스테므로(crond)에 관련된 로그를 /var/log/cron에 기록하라.

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log -> 시스템이 부팅될 때의 로그메시지로서 /var/log/boot.log 파일에 기록하라.

/etc/syslog.conf파일의 각 행들은 다음과 같은 포맷으로 정의되어 있다.
facility.priority logfile-location
facility 서비스(데몬)에 대하여 priority의 경우에 해당하는 상황이 발생하였을 때 logfile-location 파일에 그 기록을 남겨라.
- facility : 서비스이름(메시지의 종류)
  auth : 로그인과 같이 사용자 인증에 관한 메시지
  autpriv : 보안 및 승인에 간한 메시지
  cron : crond데몬과 atd데몬에 의해 발생되는 메시지
  daemon : telnet, ftp등과 가은 데몬에 의한 메시지
  kern : kernel에 의한 메시지로서 커널메시지라고함.
  lpr : 프린터데몬인 lpd에 의해 발생되는 메시지
  mail : sendmail또는 pop또는 qmail등의 메일에 의해 발생되는 메시지
  news : innd등과 같은 뉴스시스템에 의해 발생되는 메시지
  uucp : uucp 에 의한 시스테에 의한 메시지
- priority : 메시지의 우선순위를 의미함.
  emerg : 최상위. 매우 위험한 상황.
  info : 단순한 프로그램에 대한 정보 메시지
  notice : 에러가 아닌 알리메 관한 메시지
  warning : 주의를 요하는 메시지
  err : 에러가 발생한 상황
  crit : 급한상황은 아니지만 치명적인 시스템 문제발생 상황
  alert : 최하위, 즉각적인 조치를 ㅜ치해야하는 상황
  none : 어떠한 경우라도 메시지를 저장하지 않는다.

* 로그데몬 컨트롤
# /sbin/syslogd -m 0
# /etc/init.d/syslogd start
# /etc/init.d/syslogd restart
# /etc/init.d/syslogd stop

* 로그구성 및 로그모니터링하기
1. tcpd 로그기록 파일 모니터링
# tail -f /var/log/secure
2. 시스템로그 모니터링
# tail -f /var/log/messages
3. 메일관련 로그 모니터링
# tail -f /var/log/maillog
4. 부팅시의 메시지 확인
# more /var/log/boot.log
# dmesg | more
5. cron 로그 모니터링
# tail -f /var/log/cron

* 마지막 로그인(접속)정보 확인하는 법
# lastlog [-u 계정명] [-t 일자]
lastlog는 /var/log/lastlog파일의 정보에 저장된 정보를 참조하여 결과를 출력한다.
/var/log/lastlog파일에는 각 계정의 최근 접속정보가 기록되는 파일이다.
또한 /usr/include/lastlog.h 파일에 정의된 포맷으로 /var/log/lastlog에 저장이 된다.
즉, /var/log/lastlog파일에 저장되는 포맷은 /usr/include/utmp.h파일에 지정된 포맷을 사용한다는 것을 알 수 있다.
# lastlog -> 시스템 각 계정의 최근 접속정보 확인
사용자명        포트    ~로부터         최근정보
root             tty1                      목  3월 23 16:11:22 +0900 2006
bin                                        **한번도 로긴한적이 없습니다**
daemon                                     **한번도 로긴한적이 없습니다**
adm                                        **한번도 로긴한적이 없습니다**
lp                                         **한번도 로긴한적이 없습니다**
sync                                       **한번도 로긴한적이 없습니다**
shutdown                                   **한번도 로긴한적이 없습니다**
halt                                       **한번도 로긴한적이 없습니다**
mail                                       **한번도 로긴한적이 없습니다**
news                                       **한번도 로긴한적이 없습니다**
uucp                                       **한번도 로긴한적이 없습니다**
operator                                   **한번도 로긴한적이 없습니다**
games                                      **한번도 로긴한적이 없습니다**
gopher                                     **한번도 로긴한적이 없습니다**
ftp                                        **한번도 로긴한적이 없습니다**
nobody                                     **한번도 로긴한적이 없습니다**
rpm                                        **한번도 로긴한적이 없습니다**
vcsa                                       **한번도 로긴한적이 없습니다**
nscd                                       **한번도 로긴한적이 없습니다**
sshd                                       **한번도 로긴한적이 없습니다**
rpc                                        **한번도 로긴한적이 없습니다**
rpcuser                                    **한번도 로긴한적이 없습니다**
nfsnobody                                  **한번도 로긴한적이 없습니다**
mailnull                                   **한번도 로긴한적이 없습니다**
smmsp                                      **한번도 로긴한적이 없습니다**
pcap                                       **한번도 로긴한적이 없습니다**
xfs                                        **한번도 로긴한적이 없습니다**
named                                      **한번도 로긴한적이 없습니다**
widemail         pts/2    58.140.225.64    토  3월 25 23:33:38 +0900 2006
mysql                                      **한번도 로긴한적이 없습니다**
# lastlog -u widemail -> 특정 계정사용자의 시스템 최근 접속정보 확인
사용자명        포트    ~로부터         최근정보
widemail         pts/2    58.140.225.64    토  3월 25 23:33:38 +0900 2006
# # lastlog -t 3 -> 지정한 최근일 까지의 시스템접속정보 확인
사용자명        포트    ~로부터         최근정보
root             tty1                      목  3월 23 16:11:22 +0900 2006
widemail         pts/2    58.140.225.64    토  3월 25 23:33:38 +0900 2006

* 로그파일의 종류
- 콘솔로그(/dev/console)
  kernel에 관련된 내용을 시스템 콘솔에 뿌려주는 로그
- 시스템로그(/var/log/messages)
  이 로그에 기록되는 내용은 주로 접속시의 인증에 관한 것과 메일에 관한 내용, 그리고 시스템에 관한 변경상항 등 시스템에 관한 전반적인 로그를 기록하는 파일이다.
- TCPD로그(/var/log/secure)
  이것은 xinetd에 의한 로그파일이다.
  xinetd의 PID저장 파일은 /var/run/xinetd.pid 이다.
- 메일로그(/var/log/maillog)
  snemail아니 pop등의 실행에 관한 기록이다.
- 크록로그(/var/log/cron)
  시스템의 크론이 작업한 기록을 보관하는 파일이다.
- 부팅로그(/var/log/boot.log)
  시스템의 데몬들이 실행되거나 재시작되었을 때 기록되는 로그파일이다.
- FTP로그(/var/log/xferlog)
  ftp나 ncftp등의 접속이 이루어 졌을 때 이 로그파일에 기록된다.
- 웹로그(/usr/local/apache2/logs/access_log)
  웹서버로 apache 2를 사용하며 apache 2의 설치경로가 /usr/local/apache2 일 때, 웹로그가 기록되는 파일이다.

* syslogd 설치/확인/제거
# syslogd -v -> syslog의 버전을 확인
syslogd 1.4.1
# rpm -qf /etc/syslog.conf -> syslogd의 구체적인 패키지버전을 확인
sysklogd-1.4.1-14.legacy.9
# rpm -ql sysklogd-1.4.1-14.legacy.9 -> 설치되어 있는 파일들의 내용을 확인
/etc/logrotate.d/syslog
/etc/rc.d/init.d/syslog
/etc/sysconfig/syslog
/etc/syslog.conf
/sbin/klogd
/sbin/syslogd
/usr/share/doc/sysklogd-1.4.1
/usr/share/doc/sysklogd-1.4.1/ANNOUNCE
/usr/share/doc/sysklogd-1.4.1/CHANGES
/usr/share/doc/sysklogd-1.4.1/ChangeLog
/usr/share/doc/sysklogd-1.4.1/INSTALL
/usr/share/doc/sysklogd-1.4.1/NEWS
/usr/share/doc/sysklogd-1.4.1/README.1st
/usr/share/doc/sysklogd-1.4.1/README.linux
/usr/share/man/man5/syslog.conf.5.gz
/usr/share/man/man8/klogd.8.gz
/usr/share/man/man8/sysklogd.8.gz
/usr/share/man/man8/syslogd.8.gz
# rpm -Uvh sysklogd-1.4.1-14.legacy.9.rpm -> syslogd 업그레이드
# rpm -e sysklogd-1.4.1-14.legacy.9 -> syslogd 삭제
로그데몬위치 : /sbin/syslogd
로그데몬 설정파일 : /etc/syslog.conf
로그데몬 PID파일 : /var/run/syslog.pid
로그데몬 실행 : /etc/init.d/syslog start
로그데몬 종료 : /etc/init.d/syslog stop
로그데몬 재시작 : /etc/init.d/syslog restart

* 로그데몬의 실행 흐름도
1. init 프로세스에 의한 syslogd 실행
   시스템이 부팅되면서 처음으로 시작죄며, 또는 /etc/rc.dinit.d/syslog start 라는 명령의 수행으로 /sbin/syslogd 의 데몬프로세스가 수행된다.
2. syslog.conf 읽음
   /sbin/syslogd 데몬이 실행이 되면서 /etc/syslog.conf파일을 읽어들이게 된다.
3. syslog.pid 기록
   /sbin/syslogd도 데몬이므로 PID를 /var/run/syslogd.pid에 기록한다.
4. syslog.conf에 기록된 각각의 로그파일들의 로그기로 시작
   /sbin/syslogd의 실행과 함께 syslog.conf파일에 설정되어 있는 각각의 ㄹ그파일들이 기록되기 시작한다.
5. logrotate에 의한 각log파일들 관리

* 로그파일 관리(logrotate)
1. logrotate파일구성
   /usr/sbin/logrotate : 데몬의 위치 및 데몬프로그램
   /etc/logrotate.conf : 설정파일
   /etc/logrotate.d : logrotate에 적용할 각종 로그파일들을 보관하는 디렉토리
   /var/lib/logrotate.status : logrotate한 작업내역을 보관한 파일
   /etc/cron.daily/logrotate : logrotate는 주기적으로 실행이 되어야하므로 cron에 의해 일단윌 실행이 됨
# cat /etc/logrotate.d/syslog
/var/log/messages { -> logrotate에 의해서 작업될 로그파일(messages)을 절대경로로 지정해둔다.
    monthly  -> 로그파일을 순환시킬 주기이며, monthly이므로 한달에 한번씩 순환한다. (가능한 값: daily, weekly, monthly)
    compress  -> 순환된 파일이 gzip에 의해서 압축이 된다.
    rotate 2  -> 순환되는 파일갯수를 지정한다. 0부터 시작하며 monthly로 지정했기 때문에 2달간 ㄹ그파일이 저장된다.
    mail super@superuser.co.kr  -> 순환되어 지정된 갯수를 넘게되는 로그파일은 지정된 메일주소로 메일이 보내지게 된다. 메일을 보내지 않으려면 nomail이라고 한다.
    errors super@superuser.co.kr -> 지정된 log파일의 logrotate작업시에 에러가 발생을 하면 지정된 메일주소로 메일을 발송한다.
    postrotate  -> 지정된 로그파일에 lorotate작업 끝이 난 이후에 실행할 작업을 설정해둔 것이다. logrotate 작업 전에 실행할 작업이 있다면 prerotate/endscript를 사용한다.
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
2. logrotage 주요옵션
-f : 강제순환 시킨다. 이 옵션은 새로운 항목을 추가한 후에 로그파일을 순환시키거나 옛날 로그파일이 이미 삭제되어 새로운 로그파일이 생성되어 로그기록이 계속되고 있을 경우에 유용한 옵션이다.
-s, --state <statefile> : 기본 상황파일인 /var/lib/logrotate.status 파일 대신에 지정한 state파일을 사용한다.
--usage : logrotate의 기본 사용법을 간단히 보여준다.
compress : 순한되는 로그파일을 gzip으로 압축한다.
nocompress : 순환되는 로그파일의 압축을 하지 않는다.
create mode owner group : 순환되어 생성되는 로그파일의 파일퍼미션(mode)과 소유자(owner), 그리고 그룹소유자(group)를 지정한 것이다(예, create root 600 wheel)
daily : 로그파일을 이 ㄹ주기로 순환시킨다.
weekly :  로그파일을 주 주기로 순환시킨다.
monthly : 로그파일을 한달 주기로 순환시킨다.
errors addrss : logroate작업시에 에러가 발생한다면 지정된 메일주소로 메일을 보낸다.
extension et : logroate 실행 후에 순횐되어 생성되는 파일의 이름 뒤에 확장자로 붙일 확장자명을 지정한다.
ifempty : 로그파일이 비어있는 경우에도 rotate(순환)을 한다. 기본값
notifempty : ifempty와는 반대로 로그파일이 비어있을 경우에는 순환을 하지 않는다.
mail address : logrotate 작업 후에 이전 로그파일을 지정된 메일주소로 메일을 보낸다.
postrotate/endscript : logrotate 작업 이후에 지정된 작업을 실행한다.
prerotate/endscript : logrotate 작업 이전에 지정된 작업을 실행한다.
rotate count : logroate의 실행결과 순환되는 파일들의 총 갯수이다. 0이면 이전파일은 순환과 함께 삭제된다.
size size : logroate의 결과 순환된 결과 파일사이즈가 지정환 크기를 넘지 않도록 한다.

* Webalizer를 이용한 멀티웹로그 자동 분석법
-- 설치
1. http://www.webalizer.com/ 에서 다운로드한다.
2. Webalizer는 gd라이브러리가 필요하다. 설치되어 있지 않다면 설치한다.
3. tar xfz webalier-2.01-10-src.tgz
4. cd webalier-2.01-10
5. ./configure --with-language-korean
6. make
7. make install
-- 환경구성
1. 실행설정파일 만들기
# cd /usr/local/webalier
# mkdir conf
# cd conf
# cp /etc/webalizer.conf.sample home.org.conf
# cp /etc/webalizer.conf.sample home.net.conf
# home.org.conf 에서 다음의 항목을 수정한다.
  LogFile : 웹로그파일 위치 (예: /home/home.org/www_log/access_log)
  OutputDir : 부석결과 저장파일 (예: /home/home.org/www/weblog)
  HistoryNam : 사이트명 (예: dhan.org)
  ReportTitle : 분석결과 페이지 이름 (예: DHAN ORG WEBSITE)
  Hostname : 호스트명 FQDN 형식(예: http://www.dhan.org/)
2. Webalizer 실행파일 생성
# cat /usr/local/webalizer/bin/webalizer.sh
/usr/local/bin/webalizer -c /usr/local/webalizer/conf/dhan.org.conf
/usr/local/bin/webalizer -c /usr/local/webalizer/conf/dhan.net.conf
3. 자동분석 설정을 위한 cron 설정
# crontab -l
00 03 * * * su - root -c '/usr/local/webalizer/bin/webalier.sh'
3. 웹로그 분석결과 확인하기
http://도메인/weblog 에서 확인한다. (예: http://www.dhan.org/weblog)

* 로그서버 구축 및 운영
-- 대상서버들(로그 클라이언트) 내부 작업
로그클라이언트는 내부에서 다음의 작업을 한다.
1. /etc/hosts에 로그서버의 IP와 호스트이름을 지정한다.
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.5.12 loghost
2. /etc/syslog.conf 파일 수정
# cat /etc/syslog.conf | grep loghost
*.info;mail.none;authpriv.none  @loghost
authpriv.*    @loghost
*.*     @loghost -> 모든 로그를 loghost에 보내는 경우에만 설정
3. 로그데몬 재시작
# /etc/init.d/syslog restart
-- 로그서버내부 작업
1. /etc/host 파일에 로그대상서버들 설정
# cat /etc/hosts
192.168.0.1 web1 web1.dhan.org
192.168.0.2 web2 web2.dhan.org
192.168.0.3 db db.dhan.org
2. 로그서버의 syslogd 데몬을 재시작한다.
   리눅스 서버의 syslogd 데몬은 기본이 원격지의 로그를 받아들이지 않는다.
   따라서 원격지의 로그를 받아들여서 로그서버의 로그파일에 기록을 허용하도록 -r 옵션과 함께 syslogd 를 수작업으로 실행시켜야 한다.
   다른 방법은 /etc/init.d/syslog 를 수정하는 것이다.
# /sbin/syslogd -r -m 0
# grep SYSLOGD /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0" -> SYSLOGD_OPTIONS="-r -m 0"

***********************************************************
* 인터넷 수퍼데몬 xinetd
***********************************************************

* chkconfig
# chkconfig 서비스명 on  -> 실행레벨 2, 3, 4, 5 에서 해당 서비스를 각각 활성화한다.
# chkconfig 서비스명 off -> 실행레벨 2, 3, 4, 5 에서 해당 서비스를 각각 비활성화한다.
# chkconfig 서비스명 --add -> chkconfig 관리대상에 해당 서비서를 등록한다.
# chkconfig 서비스명 --del -> chkconfig 관리대상에서 해당 서비스를 제거한다.
# chkconfig --list  -> 모든 서비스들의 각 실행레벨에 따른 on/off 상황을 전부 보여준다.
-- example
# chkconfig telnet on  -> telnet 서비스를 실행레벨 2, 3, 4, 5번에서 각각 on한다.
# chkconfig telnet off  -> telnet 서비서를 실행레벨 2, 3, 4, 5번에서 각각 off한다.
# chkconfig telnet --list -> telnet 서비스에 대한여 on/off 상황을 보연준다.
# chkconfig --list telnet
# chkconfig --level 3 5  -> 실행레벨 3과 5에 대하여 각각 on/off된 서비스 내역을 보여준다.

* xinetd의 특징
- xinetd는 inetd 상위버전으로 레드햇 7.0이후 버전부터 사용되었다.
- 각각의 서비스별로 별도의 파일에 설정이 가능하다. (/etc/xinetd.d/ 디렉토리에 있는 파일들)
- xinetd에서 가지고 있던 접근제어기능을 가지고 있다.
- tcp_wrapper를 내장하고 있기 때문에 접근제어를 할 수 있다.
- timeout 설정으로 서비스 접근제어를 할 수 있다.
- 접속시도 횟수로 접근제어를 할 수 있으므로 무차별 서비스거부공격(DoS)을 방지할 수 있다.
- 동일한 IP를 가진 호스트에서 동시 접속수를 제어하여 즙근제어를 할 수 있다.
- 로그파일의 크기를 재한할 수 있다.
- xinetd에서 제어되는 각 서비스들에 대한 syslog 로깅 레벨 설정이 가능하다.
- 접속하는 클라이언트의 서비스 이용시간을 기록할 수 있다.
- 서비스를 거부하거나 서비스 접근제어가 되었을 경웨 상세로그를 기록한다.

* 리눅스 서버의 서비스 관리방식들
- init프로세스에 의한 관리
  init 프로세스 설정파일 : /etc/inittab
- SYSTEM V 스크립트방식
  /etc/rc.d/init.d/ 디렉ㅌ리에 존재하는 각 서비스 제어파일에 의한 관리방식
- 리눅스 명령어(command)에 의한 관리방식
  가장 직접적인 방식
- xinetd에 의한 관리방식
  /etc/xinetd.d/ 디렉토리내의 각 서비스파일들에 의한 관리방식
- 서비스 제어 흐름도
  CSU <-> ROUTER <-> 방화벽 <-> 스위치 <-> 리눅스 서버내부(iptables <-> xinetd한경서비슽 <-> /etc/xinetd.c/설정파일에 의한 서비스 연결(pop3, telnet)

* xinetd 서비스 흐름도(telnet의 경우)
1. 외부에서 telnet 서비스의 요청이 들어온다.
2. xinetd데몬은 외부에서 요청된 서비스를 tcpd에 넘겨준다.
3. tcp는 /etc/hosts.allow와 /etc/hosts.deny파이을 검사하여 허가된 접속인지를 검사한다.
4. 3번의 검사에 의해 허가된 요청일 경우에는 /etc/syslog.conf에 설정되어 있는 /var/log/secure파일에 접속요청에 대한 정보를 기록하고 /etc/xinetd.d/telnet파일을 불러들여서 서비스를 연결한다.
   이 때, /etc/xinetd.d/telnet파일내의 server 지시장행에 설정되어 있는 telnet 데몬의 위치를 찾아서 요청을 처리한다.
5. 3번의 검사에 의해 허가되지 않은 요청일 경우에는 /etc/syslog.conf파일에 설정되어 있는 /var/log/secure 파일에 허가되지안흥ㄴ 접속이 있었다는 로그를 남기고 접속요청을 거부한다.

* xinetd에 관련된 파일들
/etc/xinetd.conf : xinetd 서비스에 공통적으로 적용되는 주된 설정파일
/etc/xinetd.d/서비스파일들 :xinetd로 서비스될 파일들이 존재하는 디렉토리
/usr/sbin/xinetd : xinetd데몬
/etc/services  : 서비스포트 설정파일
/etc/protocols  : 프로토콜 설정파일
/etc/syslog.conf : 시스템로그 설정파일
/usr/sin/tcpd  : tcp데몬
/etc/hosts.allow : 시비스별 허용목록파일(tcpd)
/etc/hosts.deny  : 서비스별 거부목록 파일(tcpd)
/var/log/secure  : tcpd 로그파일(접속기록 파일)
/etc/init.d/xinetd : xinetd 시작/종료 스크립트파일

* xinetd에서 사용하는 서비스이름
1. chkconfig 명령어에서 사용하는 서비스명
2. "service 서비스데몬명 start"에서 사용하는 서비스데몬명
3. /etc/hosts.allow파일과 /etc/hosts.deny파일 내에서 사용하는 서비스명
4. /etc/xinetd.d/디렉토리내에서 사용하는 서비스파일명
5. /etc/xinetd.d/디렉토리내에 존재하는 각 파일들의 내부에 설정된 "service 서비스명"에서 설정하는 서비스명
6. /etc/services파일내에서 사용하는 서비스명
규칙1: 위의 1번부터 6번까지의 각 서비스명(이름)들은 동일하게 사용하지 않아도 된다.
규칙2: /etc/hosts.allow파일과 /etc/hosts.den파일내에서 사용하는 서비스이름은 실제 데몬파일명을 지정해야 한다.
       예를 들어 "sshd : ALL"에서 sshed라는 이름은 /usr/sbin/sshd라는 파일명에서 가져온 것이다.

* /etc/xinetd.d/ 디렉토리내의 각 설정파일내에 설정가능한 지시자들
# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
 disable  = no
 flags  = REUSE
 socket_type = stream
 wait  = no
 user  = root
 server  = /usr/sbin/in.telnetd
 log_on_failure += USERID
}
service : 서비스 이름입니다. 가능한 파일이름과 /etc/services파일에 등록딘 서비스이름과 동일해야 한다.
disable : 해당 서비스를 서비스할 것인가(no) 아닌가(yes)를 결정한다.
          즉, 서비스를 하도록 설정하려면 no로 설정하고 서비스를 하지 않으려면 yes로 설정한다.
socket_type : tcp일 경우에는 strea이며, udp일 경우에는 dgram이라고 명시한다. (가능한 값은 raw, rdm, seqpacket 등이 있다)
wait : xinetd가 서비스 요청을 받은 경우, 이후에 즉시 또 다른 요청을 처리할 것인지(no) 아닌지(yes)의 여부를 결정하는 지시자이다.
       stream일 경우에는 반드시 no이어야 한다.
       no 는 현재 요청외에는 다른 접속요청을 새로운 것으로 시작하여 처리하게 된다.
user : 이 서비스를 어떤 사용자 권한으로 서비스할 것인가를 결정한다.
server : 이 서비스를 실행할 때에 어느 위치에 있는 프로그램(데몬)을 불러와 연결할 것인가를 명시한 것이다. 반드시 절대경ㄹ로 지정해야 한다.
log_on_failuer : 서버접속에 성ㄱㅇ하지 못하였을 때 ㄹ그파일에 기록하는 내용들을 설정할 수 있다.
                 여기에는 HOST, USERID 그리고 ATTEPMT, RECORD 등이 추가로 설정될 수 있다.
   HOST란 접속을 시도한 클라이언트의 IP주소를 의미한다.
   USERID란 접속한 사용자의 ID를 의미한다.
   +=는 /etc/xinetd.conf파일의 기본설정항목에 추가할 항목을 지정할 때 사용한다.
   -=는 /etc/xinetd.conf파일의 기본설정항목에서 뺄 항목을 지정할 때 사용한다.
log_on_success : 서버 접속에 성공하였을 경웨 기록할 내용을 설정할 수 있다.
                 이 설정에는 PID, HOST, USERID, EXIT, DURATION 등을 기록할 수 있다.
   여기서 PID란 프로세스의 ID를 의미한다.
   HOSTID란 클라이언트의 IP주소를 의미한다.
   USERID란 접속한 사용자의 ID를 의미한다.
   EXIT란 프로세스의 종료상태를 의미한다.
   DURATION이란 연결지속시간을 의미한다.
only_from : "only_from = 192.168.1.0/24"아 같은 설정이 가능하다. 즉, 현재 이 서버로 해당 서비스(telnet) 접속이 가능한 곳은 192.168.1.0 네트워크내의 호스트들로 제한된다.
no_access : "no_access = 192.168.1.100"와 같은 설정이 가능하다. 즉, 접속 가능한 호스트 중에서 192.68.1.100번 IP주소를 가진 호스트는 제외하여 접속하지 못하게 한다.
instances : "instances = 60"와 같은 설정이 가능하다.즉, 해당 서비스(telnet)로 접속이 가능한 총 접속자수는 60명까지로 제한한다.
access_time : "access_time = 08:00-18:00"와 같은 설정이 가능하다. 즉, 해당 서비스의 이용가능 시간을 오전 8시부터 오후 6시까지로 제한한다.
per_source : "per_source = 5"와 같은 설정이 가능하다. 즉, 동일한 호스트에서 해당 서비스로의 접속시에 동시에 5번 이상 접속할 수 없다. 이 서비스는 서비스거부공격(DoS)을 차단하기 위해 사용할 수 있다.

* xinetd 시작/종료
# /etc/init.d/xinetd start -> xinetd 시작
# /etc/init.d/xinetd stop -> xinetd 종료
# /etc/init.d/xinetd restart -> xinetd 재시작
# /etc/init.d/xinetd status -> xinetd 상황점검

* xinetd에 의한 접속제어(tcpd)
tcpd는 특정 IP나 도메인으로부터 서버로의 telnet, ftp, pop 등의 접속을 차단할 있으며, 접속기록이나 접속시도기록을 특정한 파일에 로그로 기록한다.
xinetd는 tcp-wrapper를 내장하고 있기 때문에 xinetd모드에서 실행되는 서비스들(예: ftp, telnet, ssh)은 거의 대부분 tcpd라는 tcp_wrapper의 데몬에 의해 접속제어를 받게 된다.
쉽게 말해서 개별 서비스들(예: ftp, telnet 등)의 접근허용을 설정하는 파일은 /etc/hosts.allow이며 접근허용이 되지 않도록 설정하는 파일은 /etc/hosts.deny 파일이다.
--
접근제어 대상서비스 : xinetd기반에서 제어되는 모든 서비스명들로서 /etc/services내의 각 서비스이름과 /etc/xinetd.d/디렉토리에 존재하는 파일명과 동일한 이름을 사용한다. (예: telnet, sshd, proftpd)
접근제어 대상 : 특정 도메인명, 특정 호스트명, 특정 IP주소, 특정 네트워크 (예: superuser.co.kr, host1, 192.168.0.100, 192.168.1.0/24, 192.168.2.0/255.255.255.0)
실제예)
ALL : ALL
proftpd : 192.168.10.0/255.255.255.0 EXCEPT 19.168.10.100
proftpd : 192.168.0.100 : twist /bin/echo "Access Denied!"
sshd : 192.168.0.100
sshd ; 192.168.1.0/24
in.telnetd : 210.101.112.240 210.101.112.241 211.123.12.12 168.126.3.
in.ftpd :    210.101.112.240 210.101.112.241 211.123.12.12 168.126.3.
ipop3d : ALL
--
- 접근제어 대상서비스와 접근제어 대상은 콜론(:)으로 구분한다. 또한 세번째 항목을 계속 설정할 때에도 콜론으로 구분하여 설정한다.
- /etc/hosts.allow내의 설정과 /etc/hosts.deny내의 설정이 중복되었을 경우에 /etc/hosts.allwo파일의 내용이 적용된다.
- 각 대상리스트들의 나열은 스페이스(space)나 콤마(,)로 구분한다.

* /etc/services 파일
- 형식
서비스이름 포트/사용프로토콜유형 별칭
서비스이름 : 설정되는 포트에 대한 서비스의 이름이다. (예: telnet, ftp 등)
포트/프로토콜 : 지정된 서비스에서 사용될 포트번호와 사용할 프로토콜유형이다. 프로토콜유형은 일반적으로 tcp와 udp등이 사용된다.
별칭 : 지정된 "서비스이름"외에 다른 이름을 사용할 수 있도록 한다.

* /etc/protocols 파일
/etc/services 파일에서 사용하는 프로토콜의 정의가 있는 파일이다.
# cat /etc/protocols
..
tcp     6       TCP             # transmission control protocol
..
udp     17      UDP             # user datagram protocol
..

***********************************************************
* RPM 패키지 관리
***********************************************************

* rpm 명령어의 실행 종류
패키지 설치 : rpm -i [옵션] 패키지명
패키지 업그레이드 : rpm -U [옵션] 패키지명
패키지 제거(삭제) : rpm -e [옵션] 패키지명
패키지 질의 : rpm -q [옵션] 패키지명
패키지 검증 : rpm -V [옵션] 패키지명
              rpm -y [옵션] 패키지명
패키지 제작 : rpm -b [옵션] 패키지명세파일
              rpmbuild -b [옵션] 패키지명세파일

* rpm 패키지 명명방법
tcp_wrapper-7.6-34.i386.rpm
패키지이름 : tcp_wrapper
    패키지이름은 제작자에 의해 붙여진 이름으로 대부분은 특정 서비스를 나타내는 이름이거나 특정 라이브러리를 의미하는 이름을 붙이는 것이 관례이다.
패키지버전 : 7.6
    패키지의 버전을 의한다.
릴리즈버전 : 34
    동일한 패키지이름의 동일한 패키지버전을 업데이트하여 배포할 때마다 새롭게 붙이는 버전이다.
    릴리즈버전을 붙이는 이유는 주로 동일한 패키지에서 버그를 수정하였거나 간단한 업그레이드를 하였을 경우에 패키지버너을 높이지않고 릴리즈버전만 높여서 패보하기 때문이다.
아키텍처번 : i386
    이 패키지의 설치가 가능한 컴퓨터 아키텍쳐를 의미한다.

* rpm 패키지 설처
# rpm -i [옵션] 패키지명
# rpm -ivh [옵션] 패키지명
  -v : verbose옵션으로 자세한 설치과정을 보여준다.
  -h : 설치과정을 "#"표시를 하면서 그 진행과정을 표시한다.
# rpm -ivh --replacepkgs 패키지명
  --replacepkgs 옵션은 기존의 설치되어 있던 패키지를 무시하고 다시 설치하게 한다.
  이 옵션은 기존의 설정과 파일들을 모두 삭제한다.
  이미 설치된 패키지 무시하고 패키지 설치하기
# rpm -iv --replacefiles 패키지명
  --replacefiles 는 패ㅣ지의 일부 파일과 이미 설치되어 있는 다른 패키지의 일부 파일과 중복되어 설치가 되지않을 경우 사용하며, 기존의 파일을 무시하고 새 파일로 설치한다.
  다른 패키지의 파일과 중복될 경우에 무시하고 설치하기
# rpm -ivh --force 패키지명
  --force 옵션은 --replacepkgs 옵션과 --replacefiles 옵션, 그리고 --oldpackage라는 옵션을 모두 사용하는 것돠 동일한 효과를 가진다.
  --oldpackage라는 옵션은 현재 설치하려고 하는 패키지의 번전이 이미 설치디어 있는 패키지의 버전보다 낮은 버전일 경우에 에러가 발생한다.
  패키지중복 또는 다른 패키지의 파일이 충돌발생시 무시하고 설치하기
# rpm -ivh --nodeps 패키지명
  --nodeps는 의존성문제를 무시하고 설치하기 위한 옵션이다.
  패키지의 의존성문제를 무시하고 패키지 설치하기

* rpm 패키지 업그레이드
# rpm -U [옵션] 패키지명
# rpm -Uvh [옵션] 패키지명
  -U 옵션을 사용하여 설치하면 기존에 설치되어 있던 RPM 패키지의 파일들을 삭제하는 것이 아니라 "기존파일명.rpmsave"라는 파일명으로 보관한 후에 새롭게 설치한다.
# rpm -Uvh --replacepkgs 패키지명
  이미 설치된 중복패키지를 무시하고 업그레이드하기
# rpm -Uvh --replacefiles 패키지명
  다른 패키지의 파일가  중복될 경우에 무시하고 업그레이드하기
# rpm -Uvh --force 패키지명
  패키지중복 또는 패키지의 파일이 충돌발생시 무시하고 업그레이드하기
# rpm -Uvh --nodeps 패키지명
  패키지의 의존성문제를 무시하고 패키지 업그레이드하기

* rpm 패키지 삭제
# rpm -e 패키지명
# rpm -e --nodeps 패키지명
  의존성을 무시하고 삭제하기

* rpm 패키지 설치정보 확인
# rpm -q [옵션] 패키지명
# rpm -qa
  현재 시스템에 설치디어 있는 모든 패키지를 출력
# rpm -qf 파일명
  특정 파일명이 어떤 패키지에 속해있는지 확인한다.
# rpm -ql 패키지명
  특정 패키지에 의해 설치된 파일들을 확인한다.
# rpm -qi 패키지명
  특정 패키지의 상세한 정보 확인하기.
# rpm -qs 패키지명
  특정 패키지에 의해 설치된 파일들의 정상여부 점검하기.
# rpm -qc 패키지명
  특정 패키지의 설정파일들 확인하기.
# rpm -qd 패키지명
  설치된 패키지의 문서파일위치 확인하기
# rpm -qRp rpm패키지파일
  패키지 의존성 관계 확인하기

* 설치딘 rpm 패키지 변경가능성 여부 검증하기
설치한 패키지의 무결성을 확인하는 방법
# rpm -V [옵션] 패키지명

***********************************************************
* FTP 서버 (vsftpd)
***********************************************************

* vsftpd 관련 파일들
/etc/xinetd.d/vsftpd  xinetd 환경에서 서비스하기 위한 vsftpd의 xinetd 설정파일
/etc/vsftpd/vsftpd.conf  vsftpd의 주된 설정파일.
/usr/sbin/vsftpd  vsftpd의 데몬파일.
/etc/initd./vsftpd  vsftpd 시작/종료/재시작 스크립트.
/etc/pam.d/vsftpd  vsftpd의 PAM설정
/var/log/vsftpd.log  vsftpd의 로그파일
/etc/vsftpd/user_list  ftp접속을 제한할 사용자 리스트
/etc/vsftpd/ftpusers  PAM에서 사용하는 ftp접속제한자 리트스파일. 이 파일에 등록된 사용자들은 ftp접속을 할 수 없다.

* 계정별 vsftpd 접속제한 파일
1. /etc/vsftpd/user_list
   vsftpd에서 기본으로 사용하는 계정별 접속제어 파일은 /etc/vsftpd/user_list(or /etc/vsftpd.user_list)파일이다.
   이 파일에 등록된 사용자들은 ftp접속을 거부하게 된다.
   이 파일에 등록할 때에는 다으 3가지 룰을 지켜주면 된다.
   - 가능한 시스템 계정들은 모두 등록한다.
   - 한 행에 한 계정씩만 등록한다.
   - /etc/vfstpd/vsftpd.conf파일(or /etc/vsftpd.conf)에서
     "userlist_deny=NO"으로 설정되었을 경우에 여기에 등록한 사용자들은 접속을 허용하는 사용자들이며
     "userlist_deny=YES"로 설정하였을 경우에는 접속을 거부하는 사용자리스트가 된다.
     YES가 기본이므로 기본설정을 변경하지 않는다면 이 파일은 접속거부자리스트파일이 된다.
2. /etc/vsftpd/ftpusers
   다음은 PAM의 VSFTPD설정파일로서 /etc/vsftpd/ftpusers파일에 등록된 사용자들은 접속을 거부하겠다는 의미의 설정파일이다.
   즉, /etc/vsftpd/ftpusers파일은 PAM에서 설정하여 사용하고 있는 ftp접속거부자 이스트파일이다.
#cat /etc/pam.d/vsftpd
#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_stack.so service=system-auth
auth       required     pam_shells.so
account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth

* /etc/vsftpd/vsftpd.conf 설정옵션
- anonymous_enable=YES (default YES)
  익명(anonymous)접속을 허용할 것인(YES) 허용하지 않을 것인가(NO)를 결정한다.
- anon_root=/var/ftp
  익명(anonymous)접속시 루트디렉토리를 지정한다.
- local_enable=YES (default YES)
  로컬 계정 사용자들의 접속을 허용할 것인가의 여부를 결정한다.
  YES로 설정하면 로컬계정사용자의 접속을 허용하는 것이며 NO로 설정하면 허용하지 않는 것이다.
- write_enable=YES (default YES)
  이 설정은 ftp전용명령어 중에 write명령어를 허용할 것인가를 결정하는 것이다.
  허용하려면 YES, 허용하지 않으려면 NO를 설정한다.
- local_umas=022 (default 022)
  로컬계정 사용자들의 umask값을 설정한다.
- anon_upload_enable=YES (default NO)
  익명(anonymous)계정 사용자에게 파일 어로드를 허용할 것인가(YES) 허용하지 않을 것인가(NO)의 여부를 설정한다.
  가능한 익명계정으로 접속한 사용자에게는 업로드 권한을 허용하지 않는 것이 보안에 좋다.
- anon_mkdir_write_enable=YES (default NO)
  익명(anonymous)계정 사용자에게 디렉토리 생성권한을 허용할 것인가(YES) 허용하지 않을 것인가(NO)의 여부를 설정하는 지시자이다.
  가능한 익명계정으로 접속한 사용자에게는 디렉토리 생성권한을 허용하지 않는 것이 보안에 좋다.
- ftpd_banner=Welcome to blah FTP service.
  ftp서버로 접속할 때에 안내메시지등을 출력하려면 여기서 설정하면 된다.
- dirmessage_enable=YES
  ftp접속한 사용자가 특정 디렉토리로 이동하였을 때 개별 디렉토리의 메시지를 보여주도록 허용할 것인가(YES) 허용하지 안을 것인가(NO)를 설정하다.
- message_file=.message
  ftp접속후에 특정 디렉토리로 이동할 때에 디렉토리 안내메시지 파일로 사용할 파일명을 지정한다.
- xferlog_enable=YES
  ftp접속후에 파일 업로드와 다운로드에 대한 로그를 남길것인가(YES) 남기지 않을 것인가(NO)를 설정한다.
- xferlog_file=/var/log/vsftpd.log
  ftp로그파일의 위치를 결정한다.
- xferlog_std_format=YES
  로그파일에 남길 로그파일의 포맷을 기본포맷으로 남길 것인가(YES) 아닌가(NO)를 설정한다.
- connect_from_port_20=YES
  ftp서비스는 깁ㄴ적으로 21번 포트와 20번 포트를 사용한다.
  ftp 접속돠 명령어에 사용되는 포트는 21ㅓㄴ이며 실제 데이터전송에 사용되는 기본포트는 20번이다.
  이 때 20번 포트의 데이터전송 연결을 허용할 것인가(YES) 허용하지 않을 것인가(NO)를 설정한다.
- session_support=YES
  이 설정이 YES로 설정되어 유효하게 되었을 때에는 바이너리파일인 wtmp에 ftp접속관련기록을 남기게 된다.
  last라는 명령어는 각 사용자들의 접속기록을 wtmp파일에서 가져와 확인하는 명령어이므로 이 설정이 적용되면 last명령어로 ftp접속기록을 확인할 수 있다.
- idle_session_timeout=600
  ftp연결에서 idle타임에 대한 타임아웃값을 설정한다.
- data_connection_timeout=120
  데이터 전송시 적용되는 타임아웃값을 설정한다.
- anon_max_rate=0
  local_max_rate=0
  trans_chunk_size=0
  ftp서비스의 전송속도를 제한하는 설정이다.
  초당 byte수를 지정할 수 있으며 제한없이 허용하려면 0으로 설정한다.
  이 설정은 vsftpd가 독립뎀ㄴ(standalone)모드로 서비스될 때에만 적용되는 것이다.
- max_clients=30
  max_per_ip=3
  이 설정은 동시 ftp접속자수를 제한하는 설정이다.
  max_clients는 ftp접속을 최대 30명까지만 허용하는 설정이다.
  max_per_ip는 한 IP(호스트)에서 동시에 3번까지만 접속이 가능하다는 설정이다.
- ascii_upload_enable=YES
  ascii_download_enable=YES
  기본적으로 ASCII모드로 업로드/다운로드하는 것은 제한되어 있다.
  이 설정으로 ASCII모드로의 업로드/다운로드를 허용하도록 설정할 수 있다.
- deny_email_enable=YES
  banned_email_file=/etc/vsftpd/banned_emails
  익명접속시에 기본적으로 사용되는 계정명을 anonymous이며 패스워드는 email형식으로 입력하면 된다.
  이 때 패스워드로 인정하지 않을 즉, 패스워드로 사용하지 못하도록 할 email 주소를 사용하도록 하는 지시자이다.
  즉, "deny_email_enable=YES"로 설정하시고 "banned_email_file=/etc/vsftpd/banned_emails"로 설정되어 있다면
  패스워드로 허용하지 않을 email 주소를 /etc/vsftpd/banned_emails 파일에 넣어두면 된다.
  그러면 이 파일에 등록된 email주소는 패스워드로 인정하지 않는다.
- chroot_list_enable=YES
  chroot_list_file=/etc/vsftpd/chroot_list
  전체 사용자가 아닌 특정 사용자들에 대하여 자신의 홈디렉토리를 루트디렉토리로 인식하도록 하는 기능으로서 이 기능은 사용자의 홈디렉토리의 상위디렉토리로 벗어나지 못하도록 하는 설정이다.
  먼저 "chroot_list_enable=YES"로 설정하고 /etc/vsftpd/chroot_list 파일에는 이 기능을 적용할 사용자계정명을 등록하면 된다.
  즉, /etc/vsftpd/chroot_list 파일에 등록된 사용자들에 한하여 chroot기능이 적용되어 자기 자신의 홈디렉토리 상위 디렉토리의 이동이 제한된다.
- chroot_local_user=YES
  특정 사용자가 아닌 전체 사용자를 대상으로 chroot()기능을 적용하여 자기 자신의 홈디렉토리 상위 디렉토리로 이동하지 못하도록 하려면 이 설정을 YES로 설정한다.
  만약 "chroot_list_enable=YES" 이고 "chroot_local_user=YES"이면 /etc/vsftpd/chroot_list파일에 등록된 사용자들만 chroot()적용을 받지 않게 된다.
  즉, 이 두 설정이 모두 YES로 되어있다면 /etc/vsftpd/chroot_list에 등록된 사용자들을 제외한 나머지 사용자들만 chroot()가 적용된다.
- ls_recurse_enable=YES
  ftp접속에서는 ls 사용시 -R옵션을 허용하지 않는 것이 기본 설정이다.
  -R옵션이란 서브디렉토리내의 파일들의 리스팅(목록)까지 모두 확인할 수 있도록 하는 것이다.
  이 지시자의 값이 YES로 되어 있다면 ftp접속후에 디렉토리 목록 확인시에 서브디렉토리들의 목록들까지 하넌에 볼 수 있는 -R옵션을 허용하게 된다.
- pam_service_name=vsftpd
  vsftp에서 PAM설정파일명으로 사용할 파일명을 지정한다.
- listen=YES
  listen_port=21
  만약 vsftpd를 xinetd모드가 아닌 독립데몬(standalone)으로 서비스하려면 위의 listen지시자를 YES로 설정하고 listen_port에 서비스할 포트번호(기본 21번)를 지정하면 된다.

* ftp 전용명령어 요약
ascii : 전송모드를 ASCII모드로 설정한다.
binary : 전송모드를 BINARY로 설정한다.
bell : 명령어 완료시에 벨소리를 나게한다.
bye : ftp접속을 종료하고 빠져나간다.
cd : remote시스템의 디렉토리를 변경한다.
cdup : remote시스템에서 하단계 사우이디렉토리로 이동한다.
chmod : remote시스테의 파일퍼미션을 변경한다.
close : ftp저속을 종료한다.
delete : remote시스템의 파일을 삭제한다.
dir : remote시스템의 디렉토리 내용을 출력한다.
disconnect : ftp접속을 종료한다.
exit : ftp접속을 종료하고 빠져나간다.
get : 지정된 파일 하나늘 가져온다.
hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.
help : ftp명령어 도움알을 볼 수 있다.
lcd : local시셈의 디렉토리를 변경한다.
ls : remote시스템의 디렉토리 내용을 출력한다.
mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.
mget : 여러개으 파일을 한꺼번에 가져오려할 때 사용한다.
mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.
open : ftp접속을 시도한다.
prompt : 파일전송시에 확인과정을 거친다. on/off 토글
put : 하나의 파일을 remote시스템에 올린다.
pwd : remote시스템의 현재 작업디렉토리를 표시한다.
quit : ftp접속을 종료하고 빠져나간다.
rstatus : remote시스템의 상황(version, 어디서, 접속ID등)을 표시한다.
rename : remote시스템의 파일명을 바꾼다.
rmdir : remote시스템의 디렉토리를 삭제한다.
size : remote시스템에 있는 파일의 크기를 byte단위로 표시한다.
status : 현재 연결된 ftp세션 모드에 대한 설정을 보여준다.
type : 전송모드를 설정한다.

* ncftp
- ncftp를 이용한 원격서버로의 익명(anonymous) ftp접속하기
# ncftp
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
ncftp> open ftp://ftp.bora.net/
Connecting to ftp://ftp.bora.net/...                                                                                               
ProFTPD 1.2.7 Server (ftp://ftp.bora.net/) [ftp5]
Logging in...                                                                                                               
Anonymous access granted, restrictions apply.
Logged in to ftp://ftp.bora.net/.
ncftp / >
# ncftp ftp://ftp.bora.net/
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to ftp://ftp.bora.net/...                                                                                               
ProFTPD 1.2.7 Server (ftp://ftp.bora.net/) [ftp5]
Logging in...                                                                                                               
Anonymous access granted, restrictions apply.
Logged in to ftp://ftp.bora.net/.                                                                                                  
ncftp / >
- 원격서버의 계정사용자를 지정하여 저속하기
# ncftp -u dhan ftp://ftp.bora.net/
- 원격서버의 계정사용자 패스워드 지정하여 자동접속하기
# ncftp -u dhan -p dhan ftp://ftp.bora.net/
- 특정포트를 지정하여 원격서버 접속하기
# ncftp -u dhan -P 2121 ftp://ftp.bora.net/
- 원격서버의 특정파일을 로컬서버로 가져오기
ncftp /home/widemail/a > get spas.sql
- 원격서버의 여러개의 파일을 한번에 로컬서버로 가져오기
ncftp /home/widemail/a > mget *.html
- 원격서버의 특정 디렉토리내의 모든 파일을 한번에 로컬서버로 가져오기
ncftp /home/widemail/a > mget *
- 원격서버의 특정 디렉토리내의 모든 파일과 서브디렉토리를 한번에 가져오기
ncftp /home/widemail/a > mget -R www
- 원격서버의 현재 디렉토리내의 모든 파일과 서브디렉토리들을 한번에 가져오기
ncftp /home/widemail/a > mget -R *
- 원격서버내의 특정 파일 내용 확인하기
ncftp /home/widemail/a > cat README
- 원격서버내의 특정 파일 내용을 한 페이지씩 확인하기
ncftp /home/widemail/a > page README
- 로컬서버내의 특정 파일 내용을 한 페이지씩 확인하기
ncftp /home/widemail/a > lpage INSTALL
- 로컬서버의 현재 작업디렉토리 확인하기
ncftp /home/widemail/a > lpwd
- 로컬서버의 현재 작업디렉토리 내에 파일리스트 확인하기
ncftp /home/widemail/a > lls
ncftp /home/widemail/a > lls -l
ncftp /home/widemail/a > lls -al
ncftp /home/widemail/a > lls -alR
- 로컬서버 내에 존재하는 특정파일명 변경하기
ncftp /home/widemail/a > lreanem file1 newfile
- 원격서버내의 특정 파일 삭제하기
ncftp /home/widemail/a > rm list
- 로컬서버내의 특정 파일 삭제하기
ncftp /home/widemail/a > lrm local_list
- 로컬서버내의 특정 파일 퍼미션 변경하기
ncftp /home/widemail/a > lcmod 777 local_list
- ㄹ컬서버내의 특정 디렉토리 삭제하기
ncftp /home/widemail/a > lrmdir local_dir
- 로컬서버내의 새로운 디렉토리 생성하기
ncftp /home/widemail/a > lmkdir local_new_dir
- ncftp에서 특정 도메인 및 호스트정보 확인하기
ncftp /home/widemail/a > lookup ftp://ftp.bora.net/
ncftp /home/widemail/a > lookup -v ftp://ftp.bora.net/
- ncftp의 북마크 설정과 사용방법
# ncftp -u widemail -p "12345" localhost
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to localhost...                                                                                                  
(vsFTPd 2.0.3)
Logging in...                                                                                                               
Login successful.
Logged in to localhost.                                                                                                     
ncftp /home/widemail > bookmark
Enter a name for this bookmark, or hit enter for "localhost": spas_dev


You logged into this site using a password.
Would you like to save the password with this bookmark?

Save? [no] yes
Bookmark "spas_dev" saved.
ncftp /home/widemail >

[widemail@dev f]$ ncftp spas_dev
NcFTP 3.1.9 (Mar 24, 2005) by Mike Gleason (http://www.NcFTP.com/contact/).
Connecting to localhost...                                                                                                  
(vsFTPd 2.0.3)
Logging in...                                                                                                               
Login successful.
Logged in to localhost.                                                                                                     
ncftp /home/widemail > bookmarks

* ncftpget
# ncftpget [flags] 원격서버 로컬디렉토리 원격서버디렉토리
# ncftpget -f login.cfg [flags] 로컬디렉토리 원격서버디렉토리
# ncftpget -u 사용자명 -p 패스워드 원격서버 로컬디렉토리 원격서버디렉토리
  -u XX : 사용자명(익명 anonymouss계정을 대신하게됨)
  -p XX : 지정된 사용자의 패스워드
  -P XX : FTP서비스포트 21번 대신 다른 포트번호 사용시 포트번호 지정
  -a    : ASCII 전송모드 지정(지정하지 않으면 BINARY가 기본 전송모드임)
  -t XX : 타임아웃(전송종료)할 초단위 시간지정
  -f XX : 호스트명, 사용자명, 패스워드가 지정된 설정파일
  -A    : 로컬파일에 덮어쓰기하지 않고 추가저장하기
  -F    : PASSIVE 모드 사용(기본값)
  -DD   : 파일 수신 후에 원격서버의 파일 삭제하기
  -R    : 지정한 원격디렉토리의 서브디렉토들까지 통째로 전송하기
- 익명계정으로 원격서버에 접속하여 특정 파일을 가져오기
# ncftpget ftp://ftp.superuser.co.kr/tools/lib.tar.gz
- 익명계정으로 원격서버에 접속하여 지정한 두개 이상의 파일을 한번에 가져오기
# ncftpget ftp://ftp.superuser.co.kr/ . /tools/lib.tar.gz /utility/rsync/rsync-2.5.5.tar.gz
- 익명계정으로 원격서버에 접속하여 지정한 모든 파일을 한번에 가져오기
# ncftpget ftp://ftp.superuser.co.kr/ /tmp/tools/ /tools/*.tar.gz
- 익명계정으로 원격서버에 접속하여 특정 디렉토리의 내용을 통째로 가져오기
# ncftpget -R ftp://ftp.superuser.co.kr/ /root/ /tools/
- 특정계정으로 원격서버에 접속하여 지정한 파일 가져오기
# ncftpget -u dhan ftp://ftp.mycom.net/ . /home/dhan/www/domain.tar.gz
# ncftpget -u dhan ftp://ftp.mycom.net/ /tmp /home/dhan/www/domain.tar.gz
- 특정 계정으로 원격서버에 접속하여 지정한 디렉토리의 모든 내용 통째로 가져오기
# ncftpget -u dhan -R ftp://ftp.mycom.net/ /tmp /home/dhan/www/
- 특정 계정가 패스워드를 지정하여 원격서버에 접속하여 지정한 파일 가져오기
# ncftpget -u dhan -p 12345 ftp://ftp.mycom.net/ . /home/dhan/www/
# ncftpget -u dhan -p 12345 ftp://ftp.mycom.net/ /tmp/ /home/dhan/www/
- 로그인정보파일을 이용하여 원격서버에 접속하여 지정한 파일 가져오기
# cat ncftplogin.cfg
host 192.168.0.100
user dhan
pass 12345
# ncftpget -f ncftplogin.cfg ftp://ftp.mycom.net/ /tmp/ /home/dhan/www/index.html

* ncftpput
# ncftpput [flags] 원격서버 원격서버디렉토리위치 로컬파일
# ncftp -f login.cfg [flags] 서버디렉토리위치 로컬파일
  -u XX : 사용자명(익명 anonymouss계정을 대신하게됨)
  -p XX : 지정된 사용자의 패스워드
  -P XX : FTP서비스포트 21번 대신 다른 포트번호 사용시 포트번호 지정
  -a    : ASCII 전송모드 지정(지정하지 않으면 BINARY가 기본 전송모드임)
  -t XX : 타임아웃(전송종료)할 초단위 시간지정
  -f XX : 호스트명, 사용자명, 패스워드가 지정된 설정파일
  -A    : 로컬파일에 덮어쓰기하지 않고 추가저장하기
  -F    : PASSIVE 모드 사용(기본값)
  -DD   : 파일 수신 후에 원격서버의 파일 삭제하기
  -R    : 지정한 원격디렉토리의 서브디렉토들까지 통째로 전송하기
- 익명계정으로 원격서버에 파일 업로드하기
# ncftpput 192.168.0.00 /pub/ zlib.tar.gz
- 특정계정명으로 원격서버에 파일 업로드하기
# ncftpput -u dhan 192.168.0.00 /home/dhan/ zlib.tar.gz
- 특정 계정명과 패스워드를 지정하여 원격서버에 파일 자동업로드하기
# ncftpput -u dhan -p 12345 192.168.0.00 /home/dhan/ zlib.tar.gz
- 로그인정보파일을 사용하여 원격서버에 자동으로 파일업로드하기
# cat ncftplogin.cfg
host 192.168.0.100
user dhan
pass 12345
# ncftpput -f ncftplogin.cfg /home/dhan/ domain.tar.gz
- 지정한 디렉토리의 모든 파일을 통째로 원격서버에 자동으로 업로드하기
# ncftpput -R -f ncftplogin.cfg /home/dhan/ www

* ncftp배치작업을 위한 ncftpbatch
# ncftpbatch -d
# ncftpbatch -l
# ncftpbatch -D
  -d : 개인 홈디렉토리의 $HOME/.ncftp/spool/디렉토리에 현재 FTP작업들을 백그라운드로 실행한다.
  -l : 계정사용자아ㅢ FTP배치작업큐의 작업리스트를 출력한다.
  -D : -d옵션과 같지만 데몬형식으로 실행되지는 않는다.
- ncftpget을 이용하여 ncftpbatch 작업큐에 백그라운드로 작업하도록 설정
# ncftpget -b ftp://ftp.superuser.co.kr/ . /tools/zlib.tar.gz
- ncftpput을 이용하여 ncftpbatch 작업큐에 백그라운드로 작업하도록 설정
# ncftpput -b 192.168.0.100 /pub/ ./zlib.tar.gz

***********************************************************
* APM
***********************************************************

* zlib 설치
zlib은 gzip등으로 압축된 압축파일을 읽고 쓰기 위해 꼭 필요한 라이브러리이다.
# wget ftp://ftp.superuser.co.kr/etc/zlib-1.1.4.tar.gz
# tar xfz zlib-1.1.4.tar.gz
# cd zlib-1.1.4
# ./configure
# make
# make install

* libpng 설치
zlib가 생성한 이미지파일을 png포맷으로 변형하여 사용하기 위한 라이브러리이다.
# wget ftp://ftp.superuser.co.kr/etc/libpng-1.2.5.tar.gz
# tar xfz libpng-1.2.5.tar.gz
# cd libpng-1.2.5
# cp scripts/makefile.linux makefile
# make test
# make install

* freetype 설치
freetype은 일종의 폰트엔진으로서 작고, 효율적이고, 이미지 출력시 커스트마이징이 쉬운 폰트라이브러리이다.
freetype은 그래픽라이브러리에 사용될 수 있으며 폰트컨버전 툴에서도 사용될수 있다.
또한 텍스트이미지 생성도구도로 많이 사용하고 있다.
# wget ftp://ftp.superuser.co.kr/etc/freetype-2.1.5.tar.gz
# tar xfz freetype-2.1.5.tar.gz
# cd freetype-2.1.5
# ./configure
# make
# make install

* jpeg 설치
JPEG 압축/압축해제 라이브러리 소프트웨어이다.
jpeg이미지 파일을 사용하고 처리하기 위하여 필요한 소프트웨어이다.
# wget ftp://ftp.superuser.co.kr/etc/jpegsrc.v6b.tar.gz
# tar xfz jpegsrc.v6b.tar.gz
# cd jpegsrc.v6b
# ./configure --enable-shared --enable-static
  "--enable-shared"는 GNU libtool을 이용한 공유라이브러리를 생성하기 위한 옵션이며
  "--enable-static"은 GNU libtool을 이용한 정적라이브러리를 생성하기 위한 옵션이다.
# make
# make install

* gd 설치
동적이미지 생성 ANSI C라이브러리로서 PNG, JPEG, GIF의 포맷으로된 이미지들을 생성할 수 있는 유용한 툴이다.
# wget ftp://ftp.superuser.co.kr/etc/gd-2.0.33.tar.gz
# tar xfz gd-2.0.33.tar.gz
# cd gd-2.0.33
# ./configure
  "--with-png=DIR" png관련 라이브러리가 설치된 디렉토리를 지정한다.
  "--with-freetype=DIR" freetype 2.X버전을 지원하기 위한 옵션이다.
  "--with-jpeg=DIR" jpeg라이브러리를 지원하기 위한 옵션이다.
  "--with-xpm=DIR" xpm라이브러리를 지원하기 위한 옵션이다.
# make
# make install

* libxml2 설치
libxml2는 XML C파서(parser)로서 리눅스의 Gnome프로젝트를 위한 툴킷되는 도구이다.
# wget ftp://ftp.superuser.co.kr/etc/libxml2-2.6.16.tar.gz
# tar xfz libxml2-2.6.16.tar.gz
# cd libxml2-2.6.16
# ./configure
# make
# make install

* MYSQL 설치
# wget ftp://ftp.superuser.co.kr/mysql/mysql-4.1.8.tar.gz
# tar xfz mysql-4.1.8.tar.gz
# cd mysql-4.1.8
# ./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-charser=euckr
  "--prefix=/usr/local/mysql" 설치될 MYSQL의 위치이다.
  "--localstatedir=/usr/local/mysql/data" MYSQL의 데이터베이스 데이터들이 저장될 위치이다.
  "--with-charset=euckr" MYSQL에서 한글지원을 하기 위한 설정이다.
  "--without-innodb" InnoDB테이블 핸들러를 포함하지 않는다.
  "--disable-largefile" 큰파일 지원을 하지않도록 설정한다. 성능보다는 안정성을 위한 옵션이다.
  "--with-raid" RAID를 지원하도록 설정한다.
  "--with-unix-socket-path=SOCKET" MYSQL소켓파일(mysql.sock)파일의 위치를 지정한다. 단, 반드시 절대경로를 이용해야한다.
  "--with-mysqld-user=username" mysqld데몬을 실행할 계정명을 지정한다.
  "--with-zlib-dir=DIR" 데이터압축 라이브러리인 zlib을 지원하기 위한 zlib설치위치를 지정한다.
  "--with-openssl-includes=DIR" OpenSSL을 지원하기 위한 옵션으로 DIR에는 OpenSSL의 헤더 위치를 지정한다.
  "--with-openssl-libs=DIR" OpenSSL을 지원하기 위한 옵션으로 DIR에는 OpenSSL의 라이브러리 위치를 지정한다.
  "--WITH-ISAM" ISAM타입의 테이블을 지원한다.
# make
# make install
# cd /usr/local/mysql/bin
# ./mysql_install_db
# useradd -M mysql
# chown -R mysql:mysql /usr/local/mysql/data
# /usr/local/mysql/bin/mysqld_safe &
# cd /usr/local/mysql/bin
# mysqladmin -u root password 12345

* APACHE2 설치
# wget ftp://ftp.superuser.co.kr/apache/httpd-2.0.52.tar.gz
# tar xfz httpd-2.0.52.tar.gz
# cd httpd-2.0.52
# vi server/mpm/prefork/prefork.c
  "DEFAULT_SERVER_LIMIT" 값을 1280으로 설정한다. (최대 접속자수를 늘리기 위한 것이다.)
# vi seerver/mpm/worker/worker.c
  "DEFAULT_SERVER_LIMIT"값을 20으로 수정한다. (최대 접속자수를 늘리기 위한 것이다.)
# ./configure --prefix=/usr/local/apache2 --enable-so --with-mpm=worker
  "--prefix=/usr/local/apache2" 설치될 APACHE2의 위치이다.
  "--enable-so" DSO방식으로 설치하기 위한 옵션이다.
  "--with-mpm=worker" 아파치 프로세스가 사용할 멀티스레드방식을 지정한 것으로 worker방식을 지정한 것이다. prefor방식은 전통적인 아파이프로세스 방식이며 worker방식은 스레드 방식을 의미하는 것으로 멀티르로세싱 모듈, 멀티스레드, 멀티르로세서 지원이 가능하다.
  "--disable-access" 호스트기반의 접근제어를 위한 옵션이다.
  "--disable-auth" 사용자기반의 접근제어를 위한 옵션이다.
  "--enable-auth-anon" 익명(anonymous)사용자 액세스를 위한 옵션이다.
  "--enable-auth-dbm" 암호인증방식으로 DBM 데이터베이스의 인증방식을 지원한다.
  "--enable-auth-digest" 암호인증방식으로 RFC2617에 따른 Digest 인증방식을 지원한다.
  "--enable-ssl" SSL/TLS을 지원하다.
  "--disable-status" 아파치 르로세스/스레드 모니터링을 지원하지 않도록 한다.
  "--disable-autoindex" 디렉토리 리스팅을 지원한다.
  "--enable-speling" 보편적으로 알려진 URL가운데 틀린 URL 스펠링을 고쳐주는 스펠링보정긴으을 위한 옵션이다.
  "--with-port=PORT" 아파치 기본포트로 사용할 포트번호를 지정한다.
  "--enable-disk-cache" 디스크캐싱기능을 위한 모듈을 넣을 수 있다.
  "--enable-mem-cache" 메모리 캐싱기능을 위한 모듈을 넣을 수 있다.
  "--enable-auth-ldap" LDAP기반 인증을 지원하기 위한 옵션이다.
# make
# make install
# vi /usr/local/apache2/conf/httpd.conf
  php모듈을 로드하기 위하여 다음가 같이 LoadModuel행을 설정한다.
  LoadModule php4_module libexec/libphp4.so
  LoadModule php5_module libexec/libphp5.so
  확장자가 .php, .html인 파일을 아파치가 PHP로 파상하기 위한 설정이다.
  AddType application/x-httpd-php .php .html
  AddType application/x-httpd-php-source .phps
  한글문자를 기본지원하기 위한 코드설정이다.
  #AddDefaultCharset ISO-8859-1
  AddDefaultCharset EUC-KR
  아파치 웹로그파일(access_log)파일에 이미지에 관한 로그내역을 기록하지 않기 위한 설정이다.
  SetEnvIfNoCase Request_URI (gif|png|jpg|css|js|bmp|jpeg|swf)$ IMAGE=1
  CustomLog logs/access_log common env=!IMAGE
# /usr/local/apache2/bin/apachectl start

* PHP 설치
# wget ftp://ftp.superuser.co.kr/php/php-4.3.9.tar.gz
# tar xfz php-4.3.9.tar.gz
# cd php-4.3.9
# ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-mysql=/usr/loca/mysql --with-freetype-dir --with-zlib-dir --with-jpeg-dir --with-gd --disable-debug --prefix=/usr/local/php
  "--with-apxs=/usr/local/apache2/bin/apxs" 공유된 APACHE2모듈을 함께 연동하기 위한 컴파일 옵션이다.
  "--with-mysql=/usr/local/mysql" 설치할 MYSQL과 PHP를 연동하기 위한 옵션이다.
  "--with-freetype-dir' FreeType2를 지원하기 위한 옵션이다.
  "--with-zlib-dir" PHP에서 zlib을 지원하기 위한 옵션이다.
  "--with-jpeg-dir" PHP에서 jpeg를 지원하기 위한 옵션이다.
  "--with-gd" PHP에서 GD라이브러리관련 함수를 사용하여 GD를 지원하기 위한 옵션이다. (예: --with-gd=/usr/local, --with-gd=/usr/local/gd)
  "--disable-debug" PHP ZendOptimizer를 사용하기 위해서는 debugging을 사용하지 않는다.
  "--with-config-file-path=/usr/local/lib" PHP설정파일 php.ini파일이 존재할 위치를 지정한 것이다.
  "--enable-ftp" PHP에서 FTP관련 함수들을 지원하기 위한 옵션이다.
  "--enable-socket" 소켓(socket)파일을 사용하기 위한 옵션이다.
# make
# make install
# cp php.ini-dist /usr/local/lib/php.ini

* PHP ZendOptimizer 설치
# wget ftp://ftp.superuser.co.kr/ZendOptimizer/ZendOptimizer-2.5.2-Linux_glibc21-i386.tar.gz
# tar xfz ZendOptimizer-2.5.2-Linux_glibc21-i386.tar.gz
# cd ZendOptimizer-2.5.2-Linux_glibc21-i386
# ./install.sh

* php.ini 파일의 설정값 수정
- register_globals 값 수정
- default_sockeet_timeout 값 수정
- post_max_size 값 수정
- memory_limit 값 수정
- upload_max_filesize 값 수정
- allow_url_fopen 값 수정
  이 지시자의 값을 가능하면 off로 설정하기 바란다.
  최근에 웨을 통한 해킹기법에서 이 값이 on으로 서정되어 있기 때문에 문제가 되곤 하였다.

***********************************************************
* APACHE2
***********************************************************

* 아파치를 설치하고 관리하는 관리자는 아래와 같은 정보습득과 역할을 해야만 한다.
- 아파치에 대한 최신정보를 빠르게 얻을 수 있는 곳
- 아파치를 설치하는 방법
- 아파치를 업그레이드하는 방법
- 서버(운영체제)와 아파치와의 상호 관계 분석
- 여러 개의 웹사이트 운용을 위한 가상호스트 설정 방법
- 가입자별 홈디렉토리 셋팅 방법
- 가입자별 사용량 제한 및 체크하기(quota)
- 가입자의 메일 셋팅하기
- 웹로그 분석을 위한 가입자별 디렉토리 설정하기
- DNS 셋팅하기
- 데이터베이스 관리자로서의 역할 수행
- 웹사이트 기획 및 분석 능력
- 웹서버 모니터링하는 방법
- 웹서버의 로그 접속통계분석 하는 방법

* APACHE 디렉토리 구성과 관련파일
/usr/local/apache2 : 아파치 홈디렉토리
/usr/local/apache2/bin : 아파치웹서버 운용에 필요한 여러가지 실행파일들이 있다.
    ab : 아파치 밴치마킹툴
    apachectl : 아파치웹서버의 시작/종료/재시작과 설정파일 검사등을 하는 툴.
    htpasswd : 특정페이지 암호인증에서 ID와 함호를 생성하는 툴.
    htdigest : 사용자 인증파일을 생성하고 업데이트하기 위한 툴.
    httpd: 아파치 웹데몬 파일
    logresolve : 아파치 로그파일에서 IP주소에 대한 호스트네임을 리졸빙하는 툴
    rotatelogs : 아파치 웹로그를 로테이트하기 위한 툴
/usr/local/apache2/logs : 아파치 웹로그파일들을 저장한다.
    access_log : 홈페이지 방문자들의 방문기록을 하는 웹로그파일
    error_log : 홈페이지 에러발생시에 기록하는 에러로그파일
    httpd.pid : 아파치 프로세스의 PID를 기록하는 파일
/usr/local/apache2/conf : 설정파일들이 존재하는 디렉토리
    httpd.conf : 아파치웹서버의 주설정파일
    mime.types : 아파치웹서버의 MIME 타입설정 파일
    ssl.conf : SSL 사용을 위한 설정파일
/usr/local/apache2/htdocs : 기본 홈페이지 문서들이 저장되어 있는 디렉토리
/usr/local/apache2/cgi-bin : CGI파일들이 존재하는 디렉토리. 모든 사용자들이 공통적으로 사용할 CIG파일들을 보관한다.
/usr/local/apache2/error : 에러문서를 저장하고 있는 디렉토리로서 에러코드별로 별도의 파일들이 지정되어 있다.
/usr/local/apache2/icons : 기본적으로 사용하고 있는 이미지아이콘파일들을 저장하고 있다.
/usr/local/apache2/include : 아파치 웹서버에 필요한 C헤더파일들일 존재하는 위치이다.
/usr/local/apache2/lib : 아파치웹서버에서 사용하는 여러가지 라이브러리파일들이 존재하는 위치이다.
/usr/local/apache2/build : 아파치 개발에 관련된 라이브러리 및 도구들
/usr/local/apache2/man : 아파치웹서버으 man페이지 파일들이 존재하는 위치이다.
/usr/local/apache2/manual : 아파치웹서버의 매뉴얼파일이 존재하는 위치이다.
/usr/local/apache2/modules : 아파치에서 사용할 각종 모듈파일들을 직접 컴파일하거나 또는 생성된 모듈파일을 직접 가져와서 이 디렉토리에 저장해 두시고 아파치 httpd.conf 파일에서 LoadModule이라는 구문으로 불러서 사용한다.

* apachectl 관리
start : 아파치를 시작한다.
stop : 아파치실행을 종료한다.
restart : 아파치를 재시작한다.
fullstatus : 아파치의 실행상태를 자세하게 보여준다. (lynx와 mod_status가 설치되어 있어야 한다.)
status : 아파치의 실행상태를 간단하게 보여준다. (lynx와 mod_status가 설치되어 있어야 한다.)
graceful : 아파치를 graceful모드로 재시작한다.
configtest : 아파치 설정파일의 문법을 검사한다.
help : 도움말을 보여준다.







***********************************************************
* 메일 서버
***********************************************************

* sendmail 관련파일들 및 디렉토리
/usr/sbin/sendmail  sendmail 데몬
/usr/bin/makemap  sendmail 맵생성파일(access, virtuser 등 등록시)
/usr/bin/newaliases  앨리어스(alias)파일의 DB를 생성함
/usr/lib/sendmail  sendmail 데몬(대부분 /usr/sbin/sendmail과 링크)
/var/spool/mqueue  sendmail 큐디렉토리(메일 일시저장하는 디렉토리)
/var/spool/mail   받는 메일저장 디렉토리
/etc/mail/access  Relay 제한 및 설정파일
/etc/mail/aliases  앨리어스 설정파일
/etc/mail/domaintable  도메인테이블 등록파일
/etc/mail/local-host-names 최종수진지 설정파일
/etc/mail/sendmail.cf  sendmail 설정파일
/etc/mail/sendmail.cw  최종수신지 설정파일(구버전)
/etc/mail/virtusertable  가상메일주소 등록파일
/etc/init.d/sendmail  sendmail 시작 및 종료 스크립트(rpm 설치시)

* Sendmail 설치
1. 현재 사용중인 sendmail 데몬 확인
2. 현재 사용중인 sendmail 데몬 버전 확인
3. 현재 실행중인 sendmail 실행 중지
# /etc/init.d/sendmail stop
# service sendmail stop
4. 현재 버전 sendmail 데몬 파일 백업하기
# mv /usr/sbin/sendmail /usr/sbin/sendmail.org
5. 현재 버전 sendmail.cf 파일 백업하기
# mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.org
6. sendmail 최신버전 다운로드하기
# wget ftp://ftp.sendmail.org/pub/sendmail/sendmail-current.tar.gz -> 현재 sendmail.8.13.6.tar.gz
7. 압축풀기
# tar xfz sendmail-current.tar.gz
8. 디렉토리 이동하기
# cd sendmail-current
9. 컴파일
# sh Build
10. mail install 하기
# cd makemap
# make install
11. 에러발생으로 조치후 다시 make install 하기
# mkdir /usr/man
# mkdir /usr/man/man8
12. 새로 생성한 sendmail 데몬파일 복사하기
# cp obj.Linux.2.6.15-1.1833_FC4.i686/sendmail/sendmail /usr/sbin/sendmail
13. sendmail 데몬 파일 소유자(그룹)권한 및 퍼미션 설정하기
# chown root:smmsp /usr/sbin/sendmail
# chmod 2755 /usr/sbin/sendmail
14. 새로 생성한 sendmail.cf 파일 복사
# cp cf/cf/generic-linux.cf /etc/mail/sendmail.cf
15. 새로 설치한 sendmail 시작하기
# /etc/init.d/sendmail start
16. 새로 설치한 sendmail 버전 데몬 확인하기

* sendmail 시작/종료/재시작
- 시작
# /etc/init.d/sendmail start
# service sendmail start
- 재시작
# /etc/init.d/sendmail restart
# service sendmail restart
- 종료
# /etc/init.d/sendmail stop
# service sendmail stop

* /etc/mail/local-host-names (최종수신지 도메인 설정)
sendmail은 이 파일(local-host-names)을 참조하여 현재 서버에 도착한 메일의 최종 수신지라고 인식하게 된다.
이 서버를 거쳐가는 메일 중 이 파일에 등록되어 있는 도메인에 대한 메일을 더 이상 메일라우팅을 시켜 다른 서버로 보내지 않고 이 서버에 잡아두게 된다.

* /etc/mail/access를 이용한 spam 메일 방지법
특정 IP주소 또는 도메인 또는 Email주소, 그리고 특정 네트워크에 대하여 sendmail에 접근하지 못하도록 설정할 수 있는 파일이다.
# cat /etc/mail/access
localhost.localdomain  RELAY
localhost   RELAY
127.0.0.1   RELAY
hung.co.k   RELAY
spam.com   REJECT
spamuser@spam.com  DISCARD
192.168.2.1   REJECT
192.168.3.   REJECT
192.168.4.0/255.255.255.0 REJECT
- RELAY : 메일 RELAY를 허용한다. 즉, 관련(host에서 지정된)메일의 수신/발신을 허용한다.
- REJECT : RELAY와는 반대로 메일 RELAY(수발신)을 허용하지 않는다. 즉, 관련(host에서 지정된) 메일의 수신/발신을 거부한다.
- DISCARD : 메일을 받은후에 폐기한다. 단, 메일발신자에게 폐기통보를 하지 않는다. 즉, /etc/sendmail.cf에 지정된 $#discardmailer에 지정된 곳으로 메일을 폐기함.
- OK : 조건없이 허용한다.
- "501 메시지" : 메일주소가 일부분이상 일치할 경우에 지정된 "메시지"로 거부한다.
- "502 메시지" : 발신메일주소에 host명이 없을 경우에 메일을 받지 않는다.
- "503 메시지" : 관련(host에서 지정된)된 도메인과 관련된 메일을 받지 않는다.
- "550 메시지" : 특정한 도메인에 대해 지정된 "메시지"로 거부한다.
- "571 메시지" : 주로 스팸메일의 경우에 사용하는 설정으로 지정된 "메시지"로 경로메일을 보낸 후에 거부한다.
- "572 메시지" : 571 설정과 거의 유사한 설정이다.
# makemap hash /etc/mail/access.db < /etc/mail/access
or
# cd /etc/mail; make

* 가상메일 설정법
가상도메인으로 사용할 메일주소(예: webmaster)를  /etc/mail/virtusertable에 다음과 같이 등록한다.
가상메일주소와 실제계정사이는 반드시 TAB으로 띄워야한다.
# cat /etc/mail/virtusertable
webmaster@manualand.co.kr manual
webmaster@yung.co.kr  hyung
# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable

* /etc/aliases (메일 애리어스)
# cat /etc/aliases
mailer-daemon:  postmaster
postmaster:     root
staff:  admin,kimdj,parksk,sonts
admin:  :include:/home/admin/admin_list
# newaliases or # /sendmail -bi

* /etc/mail/sendmail.cf 파일의 주요 설정
sendmail을 환경설정하기 위해서는 아래의 설정명령어들로 시작한다.
C: 클래스의 정의 설정
D: 매크로의 정의 설정
E: 환경변수의 정의 설정
F: 클래스의 정의 파일 설정
H: 헤드(Header)정의 설정
K: Key File 정의(map 정의) 설정
M: Mailer 정의 설정
O: 옵션 설정
P: Message Precedences 설정
R: 덮어쓰기 설정(Rewrite)
S: Ruleset 설정
T: 사용자 설정
V: 버전
- 최종수신지 및 localhost 설정(/etc/mail/local-host-name)
현재 이 메일서버를 최종수신지로 설정할 도메인을 설정한다.
sendmail 버전 8.9.x 대 버전에서는 /etc/sendmail.cw를 사용한다.
수정 후에는 sendmail을 재시작해야한다.
- 가상메일 설정파일(/etc/mail/virtusertable)
sendmail에서 가상메일을 사용할 수 있도록 /etc/mail/sendmail.cf파일에는 다음과 같은 설정이 있다.
# Virtual user table (maps incoming users)
Kvirtuser hash -o /etc/mail/virtusertable.db
- relay 설정파일 지정(/etc/mail/access)
/etc/mail/sendmail.cf파일내에는 /etc/mail/access파일이 메일 relay를 제어할 수 있도록 하기 위하여 다음과 같은 설정이 있다.
# Access list database (for spam stomping)
Kaccess hash -T<TMPF> -o /etc/mail/access.db
- 메일 장애시 ㅂ내느 사람이름 설정
메일을 거부하였거나 메일시스템에 장애나 에러가 발생했을 경우에 sendmail은 다음에 설정된 이름으로 리턴메일을 발송한다.
# my name for error messages
DnMAILER-DAEMON
- sendmail 버전 설정
/etc/mail/sendmail.cf파일내에는 DZ라는 지시자 다음에 sendmail의 버전을 표시하고 있다.
# Configuration version number
DZ8.13.4
여기서 설정된 sendmail 버전은 SmtpGreetingMessage 설정에서 $Z의 값으로 사용된다.
- 메일별칭 파일 설정(/etc/aliases)
# location of alias file
O AliasFile=/etc/aliases
- 발송메일 최대크기 제한설정(MaxMessageSize)
발송메일의 최대크기를 제한한다. 단위는 byte이다.
# maximum message size
#O MaxMessageSize=0
- 보관가능한 메일의 최대 크기 설정
MDA가 한번에 받는 메일의 용량을 제한한다.
예를 들어 bible이라는 사용자에게 도착한 메일이 있을 경우에 MDA가 이 메일을 받아서 /var/spool/mail/bible파일에 저장한다.
이 때 받은 메일 한건 한건에 대하여 MDA가 /var/spool/mail/bible파일에 저장하는 한건 한건 용량을 제한하는 설정이다.
주의할 것은 /var/spool/mail/bible파일의 전체 용량을 제한하는 설정이 아니다.
Mlocal,  P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL, M=2048000
  T=DNS/RFC822/X-Unix,
  A=procmail -t -Y -a $h -d $u
위에서 보는 "M=2048000"은 기본설정에는 없는 부분이다.
이 부분을 추가하면 MDA(예: procmail)가 한건 한건씩을 /var/spool/mail/ID파일에 한건 한건씩 저장할 때의 용량을 2MB로 제한한다.
- sendmail을 백그라운드로 실행
다음은 sendmail데몬을 백그라운드로 실행되도록 설정한 내용이다.
# default delivery mode
O DeliveryMode=background
  DeliveryMode에 설정가능한 값
  interactivity : mqueue에 있는 메일들을 동기화하는 모드로 메일을 전송한다.
  background : mqueue에 있는 메일들을 비동기화하는 모드로 메일을 전송한다.
  queue : 메일을 수신하여 메일큐(queue)에 저장하도록 한다.
  defer : 메일을 수신하여 최대한 빨리 메일큐(queue)에 저장한다.
- 최대 Hop수 제한 설정(MaxHopCount)
hop수란 몇 개의 메일서버를 거쳤는가를 확인하는 값이다.
이 값의 최대값을 설정하고 이 최대값까지 라우팅을 하였음에도 불구하고 메일이 최종수신지까지 도착하지 못하였다면 그 메일은 루프(loop)메일이거나 존재하지 않는 사용자를 최종수신자로 하는 메일로 인정하게 되어 그 메일을 최조 수신지 서버로 리턴한다.
# maximum hop count
#O MaxHopCount=25
- .forward파일 위치 설정
일반적으로 포워딩은 각 계정의 홈디렉토리에 ".forward"라는 파일을 만들어서 이 파일에 특정 메일주소를 입력두면 그 메일주소로 메일을 다시 포워딩한다.
# Forward file search path
O ForwardPath=$z/.forward.$w:$z/.forward
- 로그기록레벨 설정(LogLevel)
sendmail의 로그파일은 /var/log/maillog 파일이다.
이 로그파일에는 정해진 포맷으로 메일 송수신내역을 기록하고 있다.
# log level
O LogLevel=9
  로그레벨의 의미
  0 : sendmail 작동에 관하여 최소한의 정ㅂ만 기록
  1 : 메일처리에 심각한 에러발생 또는 보안정보를 기록함.
  2 : 메일처리시 네트워크 에러 또는 접근 실패의 경우에 기록함.
  3 : 메일처리시 DNS Lookup실패 및 존재하지 않는 주소, forward 처리에러, timeout 발생 등에 따른 접속실패 등을 기록
  4 : 메일처리시에 tcp_wrapper에 의한 접속거부 발생시에 기록함.
  5 : 수신메일의 레코드를 기록함.
  6 : vrfy명령에 의한 사용자 정보를 위한 접속시에 기록함
  7 : sendmail이 메일수신을 실패하였을 경우에 기록함.
  8 : sendmail이 메일수신을 성공하였을 경우에 기록함.
  9 : sendail이 메일처리시에 시스템 자원부족에 의한 수신실패를 기록함.
  10 : 데이터베이스에서 탐색되는 키값 기록함.
  11 : NIS사용시 에러발생가 프로세스 종료 발생시 기록함.
  12 : sendmail에 접속하였을 경우에 기록함.
  13 : 비사용자, 디렉토리 퍼미션 설정등의 상황에 대한 기록을 함.
  14 : sendmail의 접속거부 상황에 대한 기록을 함
  15 : sendmail에서 발생되는 모든 메일 상황을 기록하며 가장 많은 기록을 남기게 됨.
- 메일큐 디렉토리 설정(QueueDirectory)
# queue directory
O QueueDirectory=/var/spool/mqueue
QueueDirectory라는 지시자에 설정된 디렉토리는 sendmail이 받은 메일과 보내는 메일을 바로 Relay하는 것이 아니라 일단 Queue디렉토리에 보관하였다가 다른 메일서버(SMTP서버)나 계정으로 메일을 보내는 용도로 사용된다.
즉, 메일 일시보관용으로 사용되는 공간이 메일큐디렉토리이며 이 지시자에서 이 디렉토리의 위치를 지정한 것이다.
- sendmail Timeout 값 설정
# timeouts (many of these)
#O Timeout.initial=5m
O Timeout.connect=1m
#O Timeout.aconnect=0s
#O Timeout.iconnect=5m
#O Timeout.helo=5m
#O Timeout.mail=10m
#O Timeout.rcpt=1h
#O Timeout.datainit=5m
#O Timeout.datablock=1h
#O Timeout.datafinal=1h
#O Timeout.rset=5m
#O Timeout.quit=2m
#O Timeout.misc=2m
#O Timeout.command=1h
O Timeout.ident=0
#O Timeout.fileopen=60s
#O Timeout.control=2m
O Timeout.queuereturn=5d
#O Timeout.queuereturn.normal=5d
#O Timeout.queuereturn.urgent=2d
#O Timeout.queuereturn.non-urgent=7d
#O Timeout.queuereturn.dsn=5d
O Timeout.queuewarn=4h
#O Timeout.queuewarn.normal=4h
#O Timeout.queuewarn.urgent=1h
#O Timeout.queuewarn.non-urgent=12h
#O Timeout.queuewarn.dsn=4h
#O Timeout.hoststatus=30m
#O Timeout.resolver.retrans=5s
#O Timeout.resolver.retrans.first=5s
#O Timeout.resolver.retrans.normal=5s
#O Timeout.resolver.retry=4
#O Timeout.resolver.retry.first=4
#O Timeout.resolver.retry.normal=4
#O Timeout.lhlo=2m
#O Timeout.auth=10m
#O Timeout.starttls=1h
Timeout 값은 여러가지가 있으나 일반적으로 설정하여 사용하는 것은 Timeout.connect 와 Timeout.queuereturn 값 그리고 Timeout.queuewarn 이다.
Timeout.connect는 sendmail에 접속한 최대시간을 설정하는 기본값으로 5분이 설정된다.
Timeout.queuereturn 값은 기본이 5일(5d)로 설정되어 있으며 어떤 사유로 인하여 메일을 보내지 못해 보관되는 최대값을 지정한다.
Timeout.queuewarn 값은 어떤 사유로 인하여 메일을 발송하지 못했을 경우에 메일발신자에게 경고메일을 보내게 된다. 초기값은 4h 즉 4시간동안 메일을 최종수신자에게 보내지 못했을 경우에 발신자에게 경고메일을 보낸다.
- sendmail 상태파일 지정(StatusFile)
실행 중인 sendmail의 서비스 상태내역을 기록하는 파일을 지정한다.
# status file
O StatusFile=/var/log/mail/statistics
- Mailer의 UID와 GID 설정
# default UID (can be username or userid:groupid)
O DefaultUser=8:12
- 큐보관 최소시간 설정(MinQueueAge)
sendmail이 어떤 사유로 인하여 메일 발송에 실패했을 경우에 다시 시도를 하게 되는데 이 때 다시 시도하기 위해 최소한 어느 정도의 시간을 보낸 후에 재발송 시도를 할것인가를 설정하는 것이다.
일반적으로 "큐(Queue)에 보관할 최소시간설정"이라고 한다.
# minimum time in queue before retry
#O MinQueueAge=30m
- 메일서비스를 일시정지하고 큐에 보관할 Load Average 값
sendmail은 시스템으 ㅣ상태에 따라서 메일서비스를 일시 정지하거나 메일서비스를 중지할 수 있다.
즉, 시스템의 평균부하율(Load Average)이 8이상이 디었을 때에는 메일을 발송하는 작업을 일시정지하고 모든 발송메일을 큐(/var/spool/mqueue)에 일시 보관하게 된다.
# load average at which we just queue messages
#O QueueLA=8
- 메일서비스를 거부할 Load Average 값
다음 RefuseLA 지시자는 sendmail이 메일서비스를 거부하게 되는 시스템평균 부하율 값이다.
# load average at which we refuse connections
#O RefuseLA=12
만약 위으 ㅣ설정이 적용되었을 때에 ps로 sendmail 데몬상태를 확인해 보면 "rejecting connectin"라는 메시지를 확인할 수 있다.
만약 다시 12이하로 떨어지면 메일발송작업은 하지 않지만 /var/spool/mqueue에 보관하는 작업은 한다.
그리고 다시 8 이하로 떨어지게 되면 메일발송업무를 다시 정상화한다.
- sendmail 환경메시지 설정(SmtpGreetingMessage)
# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
- Open Relay 설정
sendmail은 /etc/mail/access 파일을 통해 메일 Relay설정을 한다.
이 설정을 유효하게 하는 설정이 바로 /etc/mail/sendmail.cf내에 있은 아래와 같은 설정이다.
# anything else is bogus
R$*                     $#error $@ 5.7.1 $: "550 Relaying denied"
만약 이 설정에 주석(#)처리를 하게 디면 /etc/mail/access 에서 설정된 메일 Relay설정이 전효 유효하지 않게 되며 또한 자신의 메일서버를 스패메일의 온상지로 만들 수도 있다. 이 설정에 주석처리는 하지 않도록 하자.

* 원격지 Relay 허용 옵션 확인
# vi /etc/mail/sendmail.mc
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
=>
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
# /etc/init.d/sendmail restart

* 스팸방지를 위한 DRAC 실무
- DRAC의 작동방식
1. 메일사용자가 아웃룩 등에서 메일을 작성하고 메일을 발송한다.
   이 사용자가 IP가 유동IP이든 고정IP이든 상관없다.
2. 발송된 사용자의 메일은 POP3에서 사용자의 ID와 패스워드로 먼저 인증을 받는다.
   그리고 인증에 성공한 메일사용자일 경우에는 사용자의 IP주소를 확인하여 /etc/mail/dracd.db파일에 IP주소를 등록한다.
3. 여기에 등록된 IP주소는 영구적으로 저장되는 것이 아니라 기본적으로 30분동안만 저장되고 이후에는 자동삭제된다. 이 저장시간은 변경가능하다.
4. sendmail은 발송자의 메일을 발송하기 위하여 /etc/mail/dracd.db파일과 /etc/mail/access파일을 모두 확인하여 두 파일 중 하나의 파일에라도 발송허용이 되어있다면 메일을 발송시킨다.
   따라서 사용자의 메일을 정상발송된다.
   이 때 /etc/mail/access.db파일을 먼저 검사하고 그 다음 /etc/mail/dracd.db파일을 검사한다.
5. 즉, /etc/mail/dracd.db파일에 등록된 IP주소보다 /etc/mail/acess.db에 등록된 IP주소가 먼저 검사된다.
- DRAC 설치
DRAC이 정상적으로 작동하기 위해서는 다음과 같은 프로그램들과 작업이 필요하다.
portmap : 포트매퍼. drac이 rpc기반으로 작동되기 때문에 필요함.
qpopper : drac과 qpopper가 연동되도록 qpopper를 설치한다.
sendmail : sendmail.cf파일을 수정한다.
db3 : C를 위한 Berkeley DB 데이터베이스 라이브러리.
db3-devel : Berkeley DB 라이브러리를 위한 개발용 파일들.
drac : DRAC패키지이다. 컴파일하여 설치
# mkdir drac
# cd drac
# wget ftp://ftp.superuser.co.kr/mail/drac/drac.tar.Z
# tar xfz drac.tar.Z
# vi Makefile
INSTALL = /usr/bin/install
DEFS = -DSOCKET_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C
CFLAGS = $(DEFS) -g
LDLIBS = -ldb
TSTLIBS = -L. -ldrac
RPCGENFLAGS = -C -I
manlib = 3
manadm = 8
# make
# make install
# make install-man
- drac과의 연동을 위한 qpopper설치
# wget ftp://ftp.superuser.co.kr/qpopper/qpopper4.0.4.tar.gz
# tar xfz qpopper4.0.4.tar.gz
# cd qpopper4.0.4
# ./configure --enable-specialauth --enable-servermode --enable-shy --enable-drac=/usr/loca/drac
  --enable-specialauth 보안을 위해 아호화하거나 암호화된 shadow패스워드를 사용한다.
  --enable-servermode 일반적으로 사용자가 POP3서버에 접속하면 인증 후에 사용자의 메일박스를 임시파일(/var/spool/mail/사용자명.pop)에 복사하며, 이후 사용자가 접속을 종료하였을 때에 삭제되지 않은 메시지들이 원래의 메일박스로 옮겨지게 된다.
   하지만 ㅁ든 사용자가 접속 중에 모든 편지를 다 읽어서 삭제시키다든지 , 아니면 모든 사용자가 접속 중에 모든 편지를 삭제하지 않고 그대로 놓아 둔다면, 이러한 불필요한 복사작업은 없어질 것이다.
   여기서 지정하는 servermode란 이러한 오버헤드를 줄이기 위하여 메일박스 자체에 락(lock)을 걸고 내용을 검사하고 다시 락(lock)을 푸는 방법을 사용한다.
   일반적으로 사용하면 성능을 조금 노핑ㄹ 수 있으니 사용하기를 권한다.
  --enable-shy  qpopper버전 숨기기 위한 것이다. 보안을 위해 사용할 것을 추천한다.
  --enable-drac=/usr/local/drac
# make
# make install
# cp popper/popper /usr/local/lib
# cat /etc/xinetd.d/pop3
service pop3
{
 disable  = no
 socket_type = stream       
 wait  = no
 user  = root
 server  = /usr/local/lib/popper
 log_on_success += HOST DURATION
 log_on_failure += HOST
}
- drac과 연동하기 위한 sendmail.cf 파일 수정
# vi /etc/mail/sendmail.cf
*** drac setup
KDRAC BTREE /ETC/MAIL/DRAC
SLocal_check_rcpt
##### DRAC SETUP
R$* $: $&{client_addr}
R$+ $: $(drac $1 $: ? R)
R$ $@ ?
R$+ @ $#OK
# /etc/init.d/sendmail restart

* SMTP 인증
/etc/mail/sendmail.mc 파일에서 다음과 같이 편집한다.
# vi /etc/mail/sendmail.mc
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
=>
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
# /etc/init.d/sendmail restart

* qpopper 설치
# wget ftp://ftp.superuser.co.kr/qpopper/qpopper4.0.4.tar.gz
# tar xfz qpopper4.0.4.tar.gz
# cd qpopper4.0.4
# ./configure --enable-specialauth --enable-servermode --enable-shy --enable-drac=/usr/loca/drac
  --enable-specialauth  보안을 위해 아호화하거나 암호화된 shadow패스워드를 사용한다.
  --enable-servermode  일반적으로 사용자가 POP3서버에 접속하면 인증 후에 사용자의 메일박스를 임시파일(/var/spool/mail/사용자명.pop)에 복사하며, 이후 사용자가 접속을 종료하였을 때에 삭제되지 않은 메시지들이 원래의 메일박스로 옮겨지게 된다.
    하지만 ㅁ든 사용자가 접속 중에 모든 편지를 다 읽어서 삭제시키다든지 , 아니면 모든 사용자가 접속 중에 모든 편지를 삭제하지 않고 그대로 놓아 둔다면, 이러한 불필요한 복사작업은 없어질 것이다.
    여기서 지정하는 servermode란 이러한 오버헤드를 줄이기 위하여 메일박스 자체에 락(lock)을 걸고 내용을 검사하고 다시 락(lock)을 푸는 방법을 사용한다.
    일반적으로 사용하면 성능을 조금 노핑ㄹ 수 있으니 사용하기를 권한다.
  --enable-shy   qpopper버전 숨기기 위한 것이다. 보안을 위해 사용할 것을 추천한다.
  --enable-auto-delete  메일가져간 후에 가져간 메일 자동삭제
  --enable-auth-file=path 허용할 사용자 설정파일 지정
  --enalbe-nonauth-file=path 허용하지 않을 사용자 설정파일 지정
  --enable-spool-dir=path 스풀디렉토리로 사요할 위치지정
  --with-openssl=path  OpenSSL사용(/usr/local/ssl)
  --enable-drac=/usr/local/drac drac 연동 옵션 지정
# make
# make install
# cp popper/popper /usr/local/lib
# cat /etc/xinetd.d/pop3
service pop3
{
 disable  = no
 socket_type = stream       
 wait  = no
 user  = root
 server  = /usr/local/lib/popper
 log_on_success += HOST DURATION
 log_on_failure += HOST
}

***********************************************************
* DNS 서버
***********************************************************

* 도메인 체계
gTLD : 전세계 누구나 등록 가능한 도메인(.com, .net, .org, .edu 등)
nTLD : 국가코드에 의한 국가별 도메인(.kr, .jp, .tw 등)
iTLD : 국제기구 등에서 사용할 수 있는 도메인(.int)
sTLD : 미국내 특정기관만이 사용가능한 도메인(.gov, .mil)

* BIND 설치
- rpm으로 BIND 설치하기
bind-9.2.4-2.i386.rpm  DNS(도메인 이름 시스템)서버
bind-utils-9.2.4-2.i386.rpm DNS 네임서버 질의 및 관리를 위한 유틸리티들
bind-devel-9.2.4-2.i386.rpm BIND DNS 개발을 위해 필요한 파일들과 라이브러리들이 포함된 패키지
bind-chroot-9.2.4-2.i386.rpm BIND 네임서버의 chroot 기능지원 패키지
bind-libs-9.2.4-2.i386.rpm DNS 패키지에서 사용되는 라이브러리들
- 소스 설치하기
# wget ftp://ftp.superuser.co.kr/DNS/9.3.0/bind-9.3.0.tar.gz
# tar xvf bind-9.3.0.tar.gz
# cd bind-9.3.0
# ./configure
# make
# make install

* 네임서버 구성파일과 디렉토리들
/etc/named.conf   BIND의 부트파일로서 각종 옵션과 각 도메인들에 대한 zone파일정보들을 갖고 있다.
/usr/sbin/named   BIND데몬파일
/etc/init.d/named  BIND의 시작/종료/재시작을 할 수 있는 BIND관리 스크립트
/usr/sbin/named-checkconf named.conf파일을 검사하는 유틸리티
/usr/sbin/named-checkzone one파일 유효성 검사 유틸리티
/usr/sbin/rndc   원격 네임서버를 제어하기 위한 관리용 유틸리티. 즉, 원격지에 있는 네임서버를 reload, stop, status 등을 실행할 수 있도록 한다.
/etc/rndc.conf   rndc설정파일로서 rndckey값을 보관한고 있는 파일이다.
/usr/sbin/nsupdate  로컬 또는 원격서버에 있는 네임서버의 zone파일을 갱신할 수 있는 유틸리티. 즉, 동적 DNS갱신유틸리티라고 하낟.
/etc/host.conf   resolver의 옵션을 가지고 있는 파일. 즉 host피일을 먼저 검색할 것인지 아니면 dns에 의한 쿼리를 먼저 할 것인지의 순서를 정하는 설정이 order옵션으로 설정되어 있다.
/etc/resolv.conf  시스템에서 사용할 네임서버의 주소를 가지고 있다.
/etc/named/   각 도메인들에 대한 실제 정보들을 보유하고 있는 zone파일들이 저장된 위치.
/var/named/named.ca  hints파일로서 named의 캐시초기화에 필요한 정보를 저장하고 있는 파일이다.
/var/named/named.local  IP주소를 도메인으로 변경해주는 reverse파일과 비슷한 역할을 하는 파일.
/etc/nsswitch.conf  resolver의 우선순위를 결정하는 파일
/usr/bin/nslookup  대화형 네임서버의 질의 도구
/usr/bin/host   DNS lookup 유틸리티
/usr/bin/dig   host와 같은 DNS lookup 유틸리티

* named 시작, 종료 그리고 재시작
# /etc/init.d/named start
# /etc/init.d/named restart
# /etc/init.d/named stop
# service named start
# service named restart
# service named stop

* named의 보안을 위한 인증키(rndckey) 설정
- /etc/rndc.key 파일
이 파일은 rndckey를 보관하고 있는 키파일로서 /etc/named.conf파이과 /etc/rndc.conf파일에서 include하여 사용한다.
# cat /etc/rndc.key
key "rndckey" {
 algorithm hmac-md5;
 secret "2Tkl86mizSIjhPTkpozyN2Ub0nbFWZQV7B5FPaEVoSxJLjsGkOwNpw9AqIPb";
};
# grep rndc.key /etc/named.conf
include "/etc/rndc.key"
# grep rndc.key /etc/rndc.conf
include "/etc/rndc.key"
- /etc/rndc.key 파일에 rndckey키값 생성하기
//# dnssec-keygen -a hmac-md5 -b 512 -n ZONE -r /dev/random named
# dnssec-keygen -a hmac-md5 -b 512 -n HOST -r /dev/random named
Knamed.+157+58747
# cat Knamed.+157+58747.key
named. IN KEY 512 3 157 T3kDBMYCC6HvCEiizwH1GdftHCvteEkoMUwOOuoppUYB7e5DlS9yzAgF RAAoWGWQH3+MxJ15UpQbz3fnoDgj6g==
/etc/rndc.key파일내의 secret에 들어가야 하는 rndckey값은 "T3kDBMYCC6HvCEiizwH1GdftHCvteEkoMUwOOuoppUYB7e5DlS9yzAgF RAAoWGWQH3+MxJ15UpQbz3fnoDgj6g==" 이다.

* rndc를 이용한 named 데몬 제어
rndc 사용형식: rndc [-c config] [-s server] [-p port] [-k key-file] [-y key] command
               - reload      : 설정파일과 zone파일을 다시 읽어서 재적용함.
        - reload zone : 특정 zone파일만을 다시 읽어서 재적용함.
        - reconfig    : 새로 추가된 zone파일만 읽어서 설정파일을 재적용함.
        - stats       : named상황파일에 서버상황을 저장함.
        - dumpdb      : 덤프파일(named_dump.db)에 캐시데이터를 덤프함.
        - stop        : 저장되지 않은 값을 저장하고 named를 종료함.
        - halt        : 저장되지 않은 값을 그냥 두고 named를 종료함.
        - flush       : ㅐ시데이터를 디스크에 저장하여 동기화함.
        - status      : named데몬의 상태를 출력함.

* dig를 이용한 도메인설정정보 검색
사용형식: dig @server domain query-type query-class
    query-type
    - a     : 네트워크주소를 의미함
    - any   : 지정한 도메인의 모든 정보를 의미함.
    - mx    : 지정한 도메인의 메일서버 정보를 의미함.
    - ns    : 네임서버를 의미함.
    - soa   : SOA정보를 의미함.
    - hinfo : HINFO레코드에 대한 정보를 의미함
# dig @ns.superuser.co.kr txt chaos version bind
# dig @192.168.0.101 txt chaos version bind
# dig @192.168.0.101 any loveve.net
# dig @192.168.0.101 mx loveve.net
# dig @192.168.0.101 ns loveve.net
# dig @192.168.0.101 a loveve.net

* 도메인 쿼리순서 설정파일 : /etc/host.conf
도메인에 대한 IP주소값을 어디에서 찾을 것인가를 결정하는 파일이 /etc/host.conf 파일이다.
즉, 이 파일의 용도는 특정 도메인에 대한 IP를 찾고자 할 때 어디에서 먼저 찾을 것인가에 대한 순서를 정해 놓은 파일이다.
# cat /etc/host.conf
order hosts,bind
맨 앞의 order는 resolver의 순서를 지정한다는 의미이고, 그 다음에는 아래와 같은 옵션들이 올 수 있다.
- hosts : /etc/hosts파일을 지정한다.
- bind : DNS(named 데몬)을 의미한다.
- nis : NIS(Network Information Service)에 의한 domain query를 의미한다.

* 사용할 네임서버 지정파일 : /etc/resolv.conf
이 파일은 서버가 사용할 네임서버를 지정해둔 파일이다.
# cat /etc/resolv.conf
search supuer.co.kr
nameserver 168.126.63.1
nameserver 168.126.63.2
nameserver 211.220.193.181
  search : 호스트만 지정되었을 때에 "호스트+도메인"으로 사용할 도메인명을 지정해 둔 것이다.
  nameserver : 이 항목의 값은 이 서버에서 사용할 네임서버를 지정해 둔 것이다.

* named 설정파일 : /etc/named.conf
# cat /etc/named.conf
//
// named.conf for Red Hat caching-nameserver
//

options {
        directory "/var/named";
 --> 이 지시자는 DNS의 zone파일들이 어디에 위치하는가를 지정한 것이다.

 dump-file "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
         // query-source address * port 53;
};

//
// a caching only nameserver config
//
controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
--> 이 지시자는 로컬서버(localhost, 127.0.0.1)에서 named데몬 컨트롤을 허용하고 그 다음 인증키(rndckey)로서 컨트롤을 허용하겠다라는 설정이다.

zone "." IN {
        type hint;
        file "named.ca";
};
--> 이 설정은 DNS의 루트도메인(.)에 대한 설정을 named.ca라는 파일에 하고 있다라는 설정이다.

zone "localdomain" IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};

zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};

zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.ip6.local";
        allow-update { none; };
};

zone "255.in-addr.arpa" IN {
        type master;
        file "named.broadcast";
        allow-update { none; };
};

zone "0.in-addr.arpa" IN {
        type master;
        file "named.zero";
        allow-update { none; };
};

include "/etc/rndc.key";
--> named와 rndc가 사용할 인증키값을 저장하고 있는 파일의 이름으로 /etc/rndc.key파일을 지정한 것이다.

zone "dhan.net" {
 type master;
 file "dhan.net.zone";
};
--> 이 설정은 개별 도메인에 대한 설정이다.

* zone파일의 저장위치 : /var/named 디렉토리
개별도메인에 대한 DNS정보가 설정되어 있는 파일이 zone파일이다.
이들 zone파일은 /etc/named.conf파일의 directory지시자에 설정된 디렉토리에 존재해야한다.

* 루트도메인(.) 설정과 업그레이드
최상위 도메인이 루트도메인이므로 모든 네임서버에는 반드시 루트도메인에 대한 정보를 가지고 있어야 한다.
따라서 BIND를 설치하여 네임서버를 운영하고 있다면 이 루트도메인에 대한 설정을 확인하고 루트도메인 설정파일을 주기적으로 업데이트하는 것이 좋다.
# wget ftp://ftp.rs.internic.net/domain/named.root
# mv named.root /var/named/named.ca

* localhost 도메인 설정파일 : /var/named/named.local
이 파일은 서버 자기자신의 localhost에 대한 설정사항으로 기본값으로 사용토록 한다.

* 네임서버설정파일(named.conf) 문법검사 유틸리티 : named-checkconf
named-checkconf 를 이용하면 /etc/named.conf파일의 문법을 검사하여 어떤 문제점이 있는가를 사전에 알 수가 있다.
사용형식 : named-checkconf [-v] [-t directory] filename

* 특정 zone파일검사 유틸리티 : named-checkzone
/var/named/ 디렉토리에 있는 개별 zone파일들의 오류여부를 점검하는 유틸리티이다.
사용형식 : named-checkzone 도메인명 zone 파일절대경로명
# named-checkzone bible10.co.kr /var/named/bible101.co.kr.zone

* DNS에 새로운 도메인 추가
1 도메인등록대행기관에 도메인을 등록합니다.
2. /etc/named.conf파일에 zone구문 설정
zone "dhan.net" {
 type master;
 file "dhan.net.zone";
};
3. 해당 도메인의 zone파일 생성
# vi /var/named/dhan.net.zone
;-----------------------------------------------------------------
; dhan.net
; created by dhan
;-----------------------------------------------------------------
$TTL 3600
@  IN SOA ns.dhan.net. dhan.dhan.net. (
  2005030401 ; serial number
  28800  ; secondaries refresh every 8 hours
  14400  ; if refresh fails, retry every 4 hours
  2419200  ; if cannot refresh, expire IN 30 days
  86400  ; default ttl
)

;-----------------------------------------------------------------
  IN NS ns.dhan.net.
  IN MX 10 mail.dhan.net.

;-----------------------------------------------------------------
ns  IN A 202.86.12.131
mail  IN A 202.86.12.131
www  IN A 202.86.12.141
4. named데몬 재시작
# /etc/init.d/named restart

* zone파일의 설정법과 해석하기
$TTL : 이 값은 Minimum(TTL, Time to Live)항목에 설정되어 있는 값과 의미가 같은 것이다.
       즉, 도메인에 대한 정보를 다른 네임서버에서 가져간 다음 가져간 네임서버에 얼마나 보관할 것인가를 지정한 것이다.
       도메인 정보를 다른 서버에서 가져간 후에 그 서버의 캐시에 얼마나 보관할 것인가 대한 시간을 초로 설정해 둔 것이다.
@ : zone파일내에서 @는 origin도메인을 의미한다.
    즉, /etc/named.conf파일에 설정되어 있는 도메인명을 의미한다.
SOA : SOA는 "Start Of Authority"의 약어로서 해당 도메인에 대하여 여기서 설정한 네임서버가 모든 정보를 가지고 있음을 선언하는 것으로 해당 도메인에 대한 모든 권한이 여기 있다는 것을 의미한다.
Serial :
Refres :
Retry :
Expire :
Minimum :
NS 레코드 :
A 레코드 :
MX 레코드 :
CNAME 레코드 :
HINFO 레코드 :
UINFO 레코드 :
MINFO 레코드 :
PTR 레코드 :
TXT 레코드 :
WKS 레코드 :





* 특정 도메인에 대한 서브도메인 설정
- 개별 서브도메인들이 모두 동일한 IP주소로 매핑하는 예
 IN A 192.168.0.201
www IN A 192.168.0.201
db IN A 192.168.0.201
ftp IN A 192.168.0.201
- 개별 서브도메인들이 모두 다른 IP주소로 매핑하는 예
 IN A 192.168.0.201
www IN A 192.168.0.202
db IN A 192.168.0.203
ftp IN A 192.168.0.204
- 설정되지않은 모든 서브도메인들을 특정 IP주소로 매핑하는 예
 IN A 192.168.0.201
www IN A 192.168.0.202
db IN A 192.168.0.203
ftp IN A 192.168.0.204
* IN A 192.168.0.205

* DNS로 구현하는 서버 부하분산기능 설정법
$TTL 86400
@  IN SOA ns.dhan.net. dhan.dhan.net. (
  2006030401 ; serial number
  28800  ; secondaries refresh every 8 hours
  14400  ; if refresh fails, retry every 4 hours
  2419200  ; if cannot refresh, expire IN 30 days
  86400  ; default ttl
)
  IN NS 192.168.0.2
;
www 0 IN A 192.168.0.201
www 0 IN A 192.168.0.202
www 0 IN A 192.168.0.203
www 0 IN A 192.168.0.204
www 0 IN A 192.168.0.205
위의 예를 보면 5개의 www행의 캐싱값이 모드 0이다.
이것은 캐싱을 하지 말라는 의미로서 DNS의 Round-Robin기능을 이용할 때에 가능한 개별 레코드의 값은 0으로 설정하여 캐싱되지 않도록 하는 것이 좋다.
그러면 http://www.dhan.net/에 접속할 때마다 DNS에 질의하게 될 것이며 이 때마다 순차대로 응답을 하게 될 것이다.

* Lame Server 관련된 DNS 에러메시지 처리하기
# vi /etc/named.conf
logging {
 category lame-servers { null; };
};
위의 설정은 named 의 로그기록에 관한 설정으로 lame-servers에 관련된 로그를 남기지 않도록(null) 처리한 것이다.
만약 named에 관련된 꼭 필요하지 않은 로그들을 모두 기록하지 않고자 한다면 다음과 같이 내용을 추가한다.
logging {
 category lame-servers { null; };
 category unmatched { null; };
 category network { null; };
 category notify { null; };
};

***********************************************************
* MySQL 서버
***********************************************************

* MySQL 실행과 종료
- MySQL 실행
사용형식 : /usr/local/mysql/bin/mysqld_safe [각종 옵션들] &
- MySQL 종료
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p shutdown

* MySQL 기본관리
- MySQL 접속
사용형식 : /usr/local/mysql/bin/mysql -u MySQL_계정명 -p 접속할_데이터베이스명 -h 접속할 호스트이름 -P 접속포트번호 -S /tmp/mysql.sock
           mysql                 : MySQL 데이터베이스로 접속하기 위한 MySQL 클라이어트 프로그램
    -u                    : 접속할 MySQL 계정(사용자)명을 지정하기 위한 옵션
    MySQL_계정명          : 데이터베이스로 접속할 MySQL의 사용자(계정)명
    -p                    : 패스워드를 입력하기 위한 옵션(패스워드가 없을 경우에 생략가능함)
    접속할_데이터베이스명 : 접속 후 사요할 데이터베이스명
    -h                    : 접속할 호스트이름
    -P                    : 접속할 포트번호
    -S                    : 접속할 MySQL 소켓파일 위치 지정
# /usr/local/mysql/bin/mysql -u root -p mysql
Enter password: ********
# /usr/local/mysql/bin/mysql -u picasso -p picasso_db
Enter password: ********
# /usr/local/mysql/bin/mysql -u root -p'12345678' mysql
# /usr/local/mysql/bin/mysql -u user -p'11111111' user_db
# /usr/local/mysql/bin/mysql -u ruser -p ruser_db -h 192.168.0.111 -P 3306
Enter password: ********
- 패스워드 재설정
사용형식 : /usr/local/mysql/bin/mysqladmin -u 계정명 password 변경할_패스워드
# /usr/local/mysql/bin/mysqladmin -u root password 12345678 -> 기존에 패스워드가 존재하지 않을 때
Enter password: ********
# /usr/local/mysql/bin/mysqladmin -u root -p password 12345678 -> 기존에 패스워드가 존재할 때
Enter password: ********
# /usr/local/mysql/bin/mysqladmin -u user -p password 11111
Enter password: ********
# /usr/local/mysql/bin -u root -p'12345678' mysql
mysql> update user set password = password('12345678') where user = 'root';
mysql> set password for root = password('2345');
- 쉘상태에서 특정파일에 저장된 SQL문 실행하기
# /usr/local/mysql/bin -u user -p user_db < /home/user/user.sql
Enter password: ********
- 새로운 MySQL 사용자를 위한 MySQL 설정
mysql> create database user_db;
mysql> grant all on user_db.* to user@'localhost' identified by 'password';
## mysql> revoke all on user_db.* from user@'localhost';
## mysql> revoke all on user_db.* from user;
## mysql> delete from mysql.user where user = 'user';

* MySQL 패스워드 복구
1. 실행중인 MySQL을 종료한다.
# ps -ef | grep mysqld
# killall mysqld
2. table grant 권한없이 MySQL을 실행한다.
# /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
3. 패스워드없이 MySQL root 계정으로 MySQL에 접속한다.
# /usr/local/mysql/bin/mysql -u root mysql -> 패스워드 지정 안함
4. UPDATE 문으로 MySQL root사용자의 패스워드를 변경한다.
mysql> update user set password = password('12345678') where user = 'root';
5. "flush privileges"로 MySQL데이터들을 동기화한다.
mysql> flush privileges;
6. MySQL을 빠져나와서 실행했던 MySQL을 종료한다.
# killall mysqld
# /usr/local/mysql/bin/mysqladmin -u root shutdown
7. 일반적인 방법으로 MySQL을 실행한다.
# /usr/local/mysql/bin/mysqld_safe --skip-grant-table &
8. 패스워드를 사용하여 MySQL의 root계정으로 접속하여 확인한다.

* "too many connections" 에러 해결방법
원인: 이에 대한 원인을 설명하기 위해서는 php에서 사용하는 MySQL 연결함수인 mysql_connect()와 mysql_pconnect의 차이점 그리고, mysql_close()함수에 대한 정확한 이해가 필요하다.
      mysql_connect()함수를 이용하여 MySQL에 연결하였다면 해당 스크립트가 종료됨과 동시에 mysql_close()함수를 호출하지 않았다 하더라도 자동으로 연결이 종료된다.
      하지만, mysql_pconnect()함수는 해당 스크립트가 종료된 후 mysql_close()함수가 호출되어도 연결이 끊어지지 않은 채로 계속 연결을 유지하고 있다.
      따라서, 얼핏보기에는 "too many connections"라는 에러메시지는 mysql_pconnect()라는 함수의 사용때문에 발생하는 것 같지만 (물로 그런 이유도 있을 수 있지만) 근본적인 원인은 이와 다를 수 있다.
      결론적으로 "mysqladmin -u -p variables"의 결과로서 볼 수 있었던 MySQL의 환경변수값들 가운데 "wait_timeout"의 값만큼 서버에 그대로 연결을 유지한 채로 남아있는 것이다.
      따라서, 이것이 "too many connections" 에러가 발생하는 긍극적인 원인이 되는 것이다.
      이를 해겨하면 MySQL이 빠른 응답을 할 수 있도록 서버 하드웨어 사양(CPU, 메모리 등)을 높이는 방법도 있겠지만 급하게 조치해야하는 경우에는 MySQL의 필요한 변수의 값을 보다 높게 설정하는 방법이 현명할 것이다.
      "mysqladmin -u root -p variables"라고 하면 MySQL의 전체 환경변수의 값을 확인할 수 있다.
      이들 MySQL 환경변수 가운데 다음 3가지의 값을 현재보다 높게 설정함으로서 "too many connection" 에러를 응급초지할 수 있다.
      - max_connection : MySQL에 connect할 수 있는 최대 개수
      - table_cache    : MySQL의 테이블 캐쉬크기
      - wait_timeout   : MySQL에 connect하여 쿼리를 지속할 수 있는 시간
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep max_connections
      | max_connections                 | 100                                   |
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep table_cache
      | table_cache                     | 64                                    |
      # /usr/local/mysql/bin/mysqladmin -u root -p variables | grep wait_timeout
      | innodb_lock_wait_timeout        | 50                                    |
      | table_lock_wait_timeout         | 50                                    |
      | wait_timeout                    | 28800                                 |
      # /usr/local/bin/mysqld_safe -O max_connections=500 -O table_cache=256 -O wait_timeout=57600 &

* MySQL 관리자 전용 유틸리티 mysqladmin
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p 명령어
- 새로운 데이터베이스 생성하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p create 새로운_데이터베이스명
# /usr/local/mysql/bin/mysqladmin -u root -p create user_db2
Enter password: ********
- 특정 데이터베이스 삭제하기
사용형식: /usr/local/mysql/bin/mysqladmin -u root -p drop 삭제할_데이터베이스명
# /usr/local/mysql/bin/mysqladmin -u root -p drop user_db2
Enter password: ********
- MySQL 권한테이블 갱신하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p reload
# /usr/local/mysql/bin/mysqladmin -u root -p reload
Enter password: ********
- MySQL에 접속한 사용자 확인하기
사용형식: /usr/local/mysql/bin/mysqladmin -u root -p processlist
# /usr/local/mysql/bin/mysqladmin -u root -p processlist
- 접속되어 있는 MySQL 사용자(thread) 접속 끊기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p kill 쓰레드번호
# /usr/local/mysql/bin/mysqladmin -u root -p processlist -> 종료시킬 쓰레드 확인
# /usr/local/mysql/bin/mysqladmin -u root -p kill 8  -> Id가 8인 쓰레드 종료
- MySQL의 간단한 실행정보 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p status
# /usr/local/mysql/bin/mysqladmin -u root -p status
Uptime: 2095884  Threads: 12  Questions: 2578614  Slow queries: 0  Opens: 0  Flush tables: 1  Open tables: 138  Queries per second avg: 1.230
- MySQL의 현재 상황 자세히 살펴보기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p extended-status
# /usr/local/mysql/bin/mysqladmin -u root -p extended-status
- MySQL의 환경변수를 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p variables
# /usr/local/mysql/bin/mysqladmin -u root -p variables
- 현재 MySQL의 정확한 버전과 여러 가지 실행정보 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p version
# /usr/local/mysql/bin/mysqladmin -u root -p version
- MySQL이 죽었는지 살았는지 확인하기
사용형식 : /usr/local/mysql/bin/mysqladmin -u root -p ping
# /usr/local/mysql/bin/mysqladmin -u root -p ping

* MySQL 로그
- 쿼리로그 옵션 형식 : --log=쿼리로그파일명
                       이 형식을 사용하면 MySQL 데이터 디렉토리에 "쿼리로그파일명"으로 지정된 로그파일이 생성되며 SQL 쿼리로그를 기록한다.
- 바이너리로그 옵션 형식 : --log-bin=바이너리로그파일명
                           바이너리로그를 보기위해서는 /usr/local/mysql/bin/mysqlbinlog 명령어를 사용해야 한다.
      이 형식을 사용하면 MySQL 데이터디렉토리에 "바이너리로그파일명"으로 지정된 바이너리로그파일이 생성되면 MySQL데이터의 변경내역을 기록한다.
- SLOW쿼리 옵션 형식 : --log-slow-queries=SLOW쿼리파일명
                       이 형식을 사용하면 MySQL 환경변수 "long_query_time"에 초단위로 지정된 시간보다 초과하는 쿼리문만을 기록한다.

* 텍스트파일의 데이터를 MySQL의 특정 데이터베이스로 입력하기
사용형식 : /usr/local/mysql/bin/mysqlimport -u MySQL사용자 -p 데이터베이스명 텍스트파일명
           이 형식으로 실행하면 "텍스트파일명"에 저장되어 있는 데이터가 "데이터베이스명"의 특정 "테이블"의 데이터로 입력된다.
    위의 형식에서 데이터가 저장될 테이블이름은 "텍스트파일명"과 동일한 테이블이 된다.
    위의 형식에서 "텍스트파일명"은 "테이블명"과 동일한 이름이어야 한다.
    또한 저장될 테이블은 이미 생성되어 있어야 한다.
# cat addressbook
PARKSUNGSOO 011-111-2222 SEOUL A+
JUNGWOOYOUNG 011-222-3333 SEOUL B+
LEEJAESUK 016-222-1111 BUSAN C+
CHOYUEJIN 019-333-4444 BUSAN D+
# /usr/local/mysql/bin/mysqlimport -u root -p user_db2 addressbook
Enter password: ********
user_db2.addressbook: Records: 4 Deleted: 0 Skipped: 0 Warning: 0

* MySQL 데이터베이스 스키마 확인
사용형식 : /usr/local/mysql/bin/mysqlshow [옵션] [데이터베이스 [테이블 [컬럼]]]
           1. 위의 형식에서 특정 데이터베이스명이 주어지지 않는다면 MySQL내에 존재하는 모든 데이터베이스들을 나열한다.
    2. 위의 형식에서 특정 테이블명이 주어지지 않는다면 지정된 데이터베이스내의 모든 테이블들을 나열한다.
    3. 위의 형식에서 특정 컬럼이 주어지지 않는다면 지정된 테이블내에 존재하는 모든 컬럼들과 컬럼타입들을 나열한다.
- MySQL에 존재하는 모든 데이터베이스들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p
mysql> show databases;
- 특정 데이터베이스의 테이블들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db
mysql> use user_db;
mysql> show tables;
- 특정 테이블의 컬럼정보들 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook
mysql> use user_db;
mysql> show columns from addressbook;
mysql> desc addressbook;
- 특정 테이블의 하나의 컬럼만 확인하기
# /usr/local/mysql/bin/mysqlshow -u root -p user_db addressbook name

* MySQL 데이터베이스 데이터 백업과 복구
- /usr/local/mysql 디렉토리 전체를 압축백업하기
# cd /usr/local
# tar cvfpz /backup/mysql.tar.gz mysql
- MySQL 데이터 백업하기
사용형식1 : /usr/local/mysql/bin/mysqldump [옵션] DB [TABLES ..] > 파일명
            DB는 백업대상이 되는 데이터베이스명이고 TABLES는 지정한 백업대상 데이터베이스내에 존재하는 테이블명이다.
     이 백업의 의미는 DB의 데이터베이스내에 존재하는 테이블의 내용을 백업해서 "파일명"에 저장하라는 의미이다.
사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --databases [옵션] DB1 [DB2 ..] > 파일명
            --databases라는 옵션에 의해 DB1 DB2 의 데이터베이스들을 백업하여 "파일명"에 저장한다.
     즉 백업대상이 되는 데이터베이스가 2개 이상이 될 때에는 --databases 옵션을 사용하고 그 뒤에 백업할 데이터베이스를 지정한다.
사용형식2 : /usr/local/mysql/bin/mysqldump [옵션] --all-databases [옵션] > 파일명
            --all-databases라는 옵션은 MySQL내에 존재하는 모든 데이터베이스를 백어밷상으로 한다는 의미이다.
- 특정 데이터베이스 데이터 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 백업대상_데이터베이스명 > 저장할_파일명
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 복구할_데이터베이스명 < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u root -p mysql > mysql.sql
# /usr/local/mysql/bin/mysql -u root -p mysql < mysql.sql
# /usr/local/mysql/bin/mysqldump -u user -p user_db > user_db.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
- 특정 데이터베이스의 특정 테이블의 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p 데이터베이스명 테이블명 > 저장할_파일명
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p 데이터베이스명 < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u user -p user_db addressbook > addressbook.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < addressbook.sql
- 여러 개의 데이터베이스 한번에 백업과 복구
백업형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --databases [옵션] DB1 [DB2 ..] > 저장할_파일명
          CREATE DATABASE문과 USE문이 추가되어 있다.
복구형식 : /usr/local/mysql/bin/mysql -u DB계정명 -p < 저장한_파일명
# /usr/local/mysql/bin/mysqldump -u user -p --databases user_db user_db2 > user_dbs.sql
# /usr/local/mysql/bin/mysql -u user -p < user_dbs.sql
-- MySQL 전체 데이터베이스 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u DB계정명 -p --all-databases > 저장할_파일명
# /usr/local/mysql/bin/mysqldump -u root -p --all-databases > all_dbs.sql
- 기존 테이블을 삭제후 백업된 파일로 복구하기 위한 백업방법
  mysqldump문으로 데이터베이스 백업시에 각각의  CRETE TABLE문 앞에 DROP TABLE문 삽입하기
# /usr/local/mysql/bin/mysqldump -u user -p --add-drop-table user_db > user_db.sql
# /usr/local/mysql/bin/mysql -u user -p user_db < user_db.sql
- 데이터베이스 백업시 에러발생율 무시하고 계속 진행하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -f DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -f user_db > user_db.sql
- 원격서버의 MySQL 데이터베이스 백업하기 #1(기본포트 사용)
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 user_db > user_db.sql
- 원격서버의 MySQL 데이터베이스 백업하기 #2(특정 포트번호 지정)
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -h 호스트명(IP주소) -P 포트번호 DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -h 192.168.0.111 -P 22222 user_db > user_db.sql
- 데이터 백업시 CREATE DATABASE 문을 생략하여 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -n [옵션] DB명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-create-db [옵션] DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -n --databases user_db user_db2 > user_dbs.sql
# /usr/local/mysql/bin/mysqldump -u root -p -n --all-databases > all_dbs.sql
-- 데이터 백업시에 CREATE TABLE문을 생략하여 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -t DB명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-crate-info DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -t user_db > user_db.sql
- 데이터는 백업하지않고 테이블 스키마만 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -d DB명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --no-data DB명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -d user_db > user_db.sql
-- 특정 데이터베이스의 조건에 맞는 데이터만 백업하기
사용형식 : /usr/local/mysql/bin/mysqldump -u 사용자명 -p -w="WHERE 조건문" DB명 테이블명 > 파일명
           /usr/local/mysql/bin/mysqldump -u 사용자명 -p --where="WHERE 조건문" DB명 테이블명 > 파일명
# /usr/local/mysql/bin/mysqldump -u user -p -w="admin_id = 'admin'" user_db addressbook > admin_id.sql
- select문을 이용한 데이터 백업 및 복구
mysql> select * into outfile './backup.sql' from addressbook;
mysql> load data infile './backup.sql' into table addressbook;

* 데이터베이스의 깨진 테이블파일 복구
- 데이터파일 구성
테이블 하나에 아래의 파일형식을 가진 파일이 3개씩 생성되어 그 테이블의 데이터를 실제로 저장하는 용도로 사용된다.
*.MYD: 해당 테이블의 데이터가 저장되는 테이블 데이터파일이다.
*.MYI: 해당 테이블의 인덱스정보가 저장되는 테이블 인덱스파일이다.
*.frm: 해당 테이블의 테이블구조가 저장되는 테이블 스키마파일이다.
- myisamchk
사용형식 : myisamchk [옵션] 점검복구새상테이블인덱스파일(*.MYI)
           주의할 것은 myisamchk의 복구 대상파일은 반드시 MySQL의 인덱스파일이라는 것이다.
           또한 반드시 MySQL을 종료한 후에 사용하라.
- MySQL 테이블파일의 이상유무 점검
# /usr/local/mysql/bin/myisamchk /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk -c /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --check /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL 테이블 점검시 이상발견시만 알려주기
# /usr/local/mysql/bin/myisamchk -s /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --silent /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL의 테이블 점검(복구)시 가능한 상세하게 메시지 출력하기
# /usr/local/mysql/bin/myisamchk -v /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --verbose /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL의 테이블 이상유무 점검시 결과를 상세히 종합하여 보여주기
# /usr/local/mysql/bin/myisamchk -i /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --information /usr/local/mysql/var/user_db/addressbook.MYI
-- MySQL의 특정테이블 이상유무를 가장 정밀하게 점검하기
# /usr/local/mysql/bin/myisamchk -ev /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --extend-check --verbose /usr/local/mysql/var/user_db/addressbook.MYI
- 정형적인 방법으로 MySQL의 깨진 테이블파일 복구하기
# /usr/local/mysql/bin/myisamchk -rv /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --recover --verbose /usr/local/mysql/var/user_db/addressbook.MYI
-- MySQL의 깨진 테이블파일 안전모드로 복구하기
# /usr/local/mysql/bin/myisamchk -o /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk --safe-recover /usr/local/mysql/var/user_db/addressbook.MYI
  -r옵션을 사용하여 테이블파일을 복구하는 것은 MySQL의 테이블 복구 방법 가운데 가장 정형적인 방법이다.
  하지만 데이터의 안전성을 고려한다면 -o옵션을 사용하라.
  깨진 테이블파일의 오류를 복구할 때에 시간이 좀 더 소요되더라도 데이터의 안전성이 걱정이 된다면 -o옵션을 사용하라.
  -o옵션을 사용하면 전통적인 방법으로 복구를 하며 -r옵션을 사용하는 것보다 속도는 좀 떨어지지만 -r옵션으로 복구하지 못하는 데이터파일을 복구할 수 있다.
- MySQL 테이블이 완전히 깨졌을 때의 최후의 복구방법
# /usr/local/mysql/bin/myisamchk -re /usr/local/mysql/var/user_db/addressbook.MYI
# /usr/local/mysql/bin/myisamchk -oe /usr/local/mysql/var/user_db/addressbook.MYI
- MySQL 내부명령어 사용
사용형식 : repair table 테이블명;
mysql> repair table addressbook;

***********************************************************
* 리눅스 호스팅서버 관리
***********************************************************

* 호스팅서비스에 필요한 것들
- 리눅스 운영체제
- 아파치 웹서버
- MySQL 데이터베이스
- PHP, Perl 등과 같은 웹프로그래밍언어
- 메일서비스 지원을 위한 Sendmail, Qmail, POP, IMAP
- Webalizer와 accesswatch 등을 이용한 웹로그분석 제공
- Proftpd, vsftpd를 이용한 FTP서비스
- BIND를 이용한 DNS서비스
- 여러가지 라이브러리 및 어플리케이션들
- 백업서버 구축

* 신규 호스팅가입자 서버셋팅
1. 사용자 ID, 패스워드 생성
# useradd bible
# passwd bible
2. 사용자 호스팅용 홈디렉토리 구성하기
# mkdir /home/bible/www
# mkdir /home/bible/www_log
# mkdir /home/bible/www/weblog
# mkdir /home/bible/ftp
# mkdir /home/bible/ftp_log
# cp index.html /home/bible/www
# chmod 701 /home/bible
# chown -R bible:bible /home/bible
3. DNS에 사용자 도메인 설정하기
# vi /etc/named.conf
zone "bible.co.kr" {
 type master;
 file "bible.co.kr.zone";
};
# vi /var/named/bible.co.kr.one
$TTL 86400
@  IN SOA ns.dns.co.kr. root.bible.co.kr. (
  2006040101 ; serial number
  28800  ; secondaries refresh every 8 hours
  14400  ; if refresh fails, retry every 4 hours
  2419200  ; if cannot refresh, expire IN 30 days
  86400  ; default ttl
)

  IN NS 192.168.0.2
  IN MX 10 bible.co.kr.
  IN A 192.168.0.101
www  IN A 192.168.0.101
ftp  IN A 192.168.0.101
4. 아파치에 가상호스트 설정하기
# vi /usr/local/apache2/conf/httpd.conf
#<VirtualHost *:80>
<VirtualHost 192.168.0.2>
    ServerAdmin webmaster@bible.co.kr
    DocumentRoot /home/bible/www
    ServerName bible.co.kr
    ServerAlias http://www.bible.co.kr/
    ErrorLog /home/bible/www_log/error_log
    CustomLog /home/bible/www_log/access_log common
    Alias /bible/ "/home/bible/www/"
    <Directory /home/bible/www>
        Options ExecCGI
        AllowOverride AuthConfig
    </Directory>
</VirtualHost>
5. 일hit수와 일트랙픽량 제한 설정하기
# vi /usr/local/apache2/conf/httpd.conf
#<VirtualHost *:80>
<VirtualHost 192.168.0.2>
    ServerAdmin webmaster@bible.co.kr
    DocumentRoot /home/bible/www
    ServerName bible.co.kr
    ServerAlias http://www.bible.co.kr/
    ErrorLog /home/bible/www_log/error_log
    CustomLog /home/bible/www_log/access_log common
    Alias /bible/ "/home/bible/www/"
    ThrottlePolicy Volume  2048M 1d
    ThrottlePolicy Request 20000 1d
    <Directory /home/bible/www>
        Options ExecCGI
        AllowOverride AuthConfig
    </Directory>
</VirtualHost>
6. 메일사용을 위한 메일설정하기
# vi /etc/mail/access
bible.co.kr RELAY
# makemap hash /etc/mail/access.db < /etc/mail/access
# vi /etc/mail/local-host-names
bible.co.kr
# vi /etc/mail/virtusertable
webmaster@bible.co.kr bible
# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable
7. 데이터베이스 사용을 위한 MySQL 설정하기
# /usr/local/mysql/bin/mysql -u root -p mysql
Enter password: ********
mysql> create database bible;
mysql> grant all on bible.* to bible@'localhost' identified by '1234';
8. 웹로그분석서비스를 위한 webalizer 설정하기
# cp /etc/webalizer.conf.sample bible.co.kr.conf
# bible.co.kr.conf
LogFile  /home/bible/www_log/access_log
OutputDir /home/bible/www/weblog
HistoryName bible.co.kr
ReportTilte bible.co.kr WebSite
HostName http://www.bible.co.kr/
9. 디스크사용량 제한을 위한 Quota 설정하기
# edquota -u bible
Disk quotas for user bible (uid 600):
Filesytem blocks soft hard inodes soft hard
/dev/sda2 1200 307200 358400 34 0 0
10. 가상 FTP호스팅을 위한 proftpd의 가상호스트 설정하기
# vi /usr/local/proftpd/etc/proftpd.conf
<VirtualHost ftp://ftp.bible.co.kr/>
ServerName  "ftp://ftp.bible.co.kr/ FTP Server"
ServerAdmin  webmaster@bible.co.kr
Port   40001
TranferLog  /home/bible/ftp_log/xferlog
MaxClients  10
MaxClientPerHost 3
11. 아파치, FTP, MySQL, DNS, 메일서비스 재시작하기
# /usr/local/apache2/bin/apachectl restart
# /usr/local/mysql/bin/mysqladmin -u root -p reload
# killall -9 proftpd
# /usr/local/proftpd/sbin/proftpd
# /etc/init.d/sendmail restart
# /etc/init.d/named restart

* 메일포워딩 서비스 설정
.forwar 파일에 포워딩할 이메일주소를 등록한다.

* 도메인포워딩 설정
<meta http-equiv="Refresh" content="0; url=http://soback.kornet.net/~bible">

***********************************************************
* 리눅스 백업서버 구축
***********************************************************

* cron을 이용한 로컬 백업
- 백업 스크립트 작성
# cat backup.sh
#!/bin/sh
tar cvfpz /backup/etc.tar.g /etc
tar cvfpz /backup/usr.tar.g /usr
tar cvfpz /backup/var.tar.g /var
tar cvfpz /backup/home.tar.g /home
# chmod 755 backup.sh
- cron에 등록
# crontab -l
00 04 * * * su - root -c '/root/backup.sh' >& /dev/null

* ncftpget으로 원격자동 백업 구축
A서버 : 백업대상서버
        92.168.0.202
        로컬백업이 구현되어 있음(/backup 에 백업데이터가 매일 백업되고 있음)
B서버 : 백업서버
        192.168.0.211
        /backup 디렉토리에 백업대상서버에서 가져온 데이터를 매일 백업함
A서버의 데이터가 B서버로 매일 자동 백업됨
# cat login.cfg
host 19.168.0.202
user bible
pass 12345678
# cat remotebackup.sh
#!/bin/sh
ncftpget -R -f login.cfg /backup /backup
    -R : 서브디렉토리의 파일들까지 모두 포함하기 위한 옵션
    -f : 로그인설정파일을 지정하기 위한 옵션
    login.cfg : 로그인설정파일
# crontab -l
00 05 * * * su - root -c '/root/remotebackup.sh' >& /dev/null

* DAT테잎으로 백업과 복구하기
- DDS 테잎의 종류
  DDS1 타입 : 비압축으로 2GB까지 저장가능.
  DDS2 타입 : 비압축으로 4GB까지 저장가능. 압축하면 8GB까지 저장가능.
  DDS3 타입 : 비압축으로 12GB까지 저장가능. 압축하면 24GB까지 저장가능.
  DDS4 타입 : 비압축으로 20GB까지 저장가능. 압축하면 40GB까지 저장가능.
- 일반적으로 백업은 DAT라는 테입에 dump형식으로 저장하여 다시 원상복구하기 위하여 restore하는 것을 의미한다.
1. 먼저 imsi디렉토리를 만든다.
   imsi디렉토리는 테잎으로부터 restore되는 파일을 일시적으로 저장하기 위한 것이다.
2. ufsrestore를 실행한다.
   i : interactive모드로 restore를 하겠다느 ㄴ의미, 즉 원하는 파일들만 복구하기 위해 파일을 지정할 수 있는 모드
   v : verbose 지정(자세한 메시지 출력)
   h : hierarchical디렉토리를 생성하며 복구, 즉 백업된 경로대로 디렉토리도 생성하게됨.
# ufsrestore ivh /dev/rmt/0
3. 원하는 파일 찾기
   restore명령어는 다음과 같은 것들이 있다.
   ls      : 현재디렉토리에서 백업테잎에 저장된 파일들 보기
   cd      : 디렉토리 이동
   delete  : 복구할 파일에서 제외
   add     : 복구할 파일 선택
   extract : 복구하기
   pwd     : 현재위치를 절대경로로 표시하기
   quit    : 종료
4. 원하는 파일 선택(add)
5. 파일생성 extract하기
6. 빠져나오기
7. 복구한 파일 확인
8. 파일내용 확인
9. 복구한 파일을 원하는 위치에 복사

* rsync를 이용한 원격네트워크백업서버 구축 실무
- rsync 설치
# wget http://rsync.samba.org/ftp/rsync/rsync-2.6.3.tar.gz
# tar xvfz rsync-2.6.3.tar.gz
# cd rsync-2.6.3
# ./configure
# make
# make install
- 873번 포트를 통한 rsync 네트워크백업 개론
환경:
      백업 대상서버들(백업할 데이터가 있는 서버들)
        SU1: 211.220.1.1
        SU1: 211.220.1.2
        SU1: 211.220.1.3
      백업서버(백업데이터를 가져와 보관할 백업서버)
        BS: 211.220.1.4
1. SU1, SU2, SU3 서버들 자체적으로 cron에 의한 백업을 수행하여 각각의 디렉토리에 저장이 외더 있다.
   이 작업은 각각의 로컬서버에 주기적으로(일별, 주별) 자동백업되어 특정한 디렉토리(backup)에 저장이 된다.
2. BS에서 SU1, SU2, SU3서버에 백업되어 있는 데이터들을 네트워크를 통해 가져오게 된다.
   이 작업은 BS서버의 cron에 의해 수행되며 주기적인(일별, 주별, 월별 등) 작업수행이 가능하며 여기서는 매일 새벽 6시에 데이터를 자뎌오도록 설정한다.
3. 백업대상 서버(SU1, SU2, SU3)의 설정내용
# grep 873 /etc/services
rsync           873/tcp                         # rsync
rsync           873/udp                         # rsync
# grep rsync /etc/hosts.allow
rsync : 211.220.1.4
# cat /etc/xinetd.d/rsync
service rsync
{
 disable   = no
# port   = 873
 socket_type  = stream
# protocol  = tcp
 wait   = no
 user   = root
 server   = /usr/bin/rsync
 server_args  = --daemon
 log_on_failuer  += USERID
}
# /etc/init.d/xinetd restart
# cat /etc/rsyncd.conf
[SU3]    서비스이름. 일반적으로 서버의 이름
path = /host6/backup  백업대상 데이터가 저장된 절대경로
comment = SU3   설명문. 서버이름이나 컨텐츠의 이름 입력
uid = nobody   데이터를 전송할 user명
gid = nobody   데이터를 전송할 group명
user chroot = yes  path에서 설정한 경로를 루트경로로 사용함. 보안을 위해 꼭 yes 로 설정할 것을 권함.
read only = yes   백업대상서버에 wrie할 경우에는 no로 설정. 즉, 백업서버에서 백업대상서버로 데이터를 가져가기만하므로 일반적으로 read only만 설정함.
hosts allow = 211.220.1.4 접근허용할 서버의 IP. 백업서버의 IP입력
max connections = 3  동시에 접속할 수 있는 동시접속자 수. 무제한으로 설정하려면 0을 설정함.
timeout 600   깁ㄴ값은 60초이며 백업서버에서 접근하여 타임아웃될 시간을 설정함.
4. 백업서버(BS)의 서정내용
# grep 873 /etc/services
rsync           873/tcp                         # rsync
rsync           873/udp                         # rsync
# cat /home/hansoo2/backup.sh
#!/bin/sh
rsync -avz 211.220.1.1::SU1/ /home/hansoo2/backup/SU1
rsync -avz 211.220.1.2::SU1/ /home/hansoo2/backup/SU2
rsync -avz 211.220.1.3::SU1/ /home/hansoo2/backup/SU3
  -a : achive mode로서 기존의 속성 및 퍼미션, 소유권 등의 설정내용을 그대로 유지.
  -v : verbose mode로서 작업내용을 상세하게 보여줌.
  -z : 전송속도를 높이기 위해 압축수행 후 전송을 함.
# crontab -l | grep backup
# network backup system
0 6 * * * su - root -c '/home/hansoo2/backup.sh'
- 백업수행시 에러 대책
1. 압축파일상태에러(inflate returned -3에러)
   이 에러는 백업대상이 되는 파일이 gzip으로 압축되어 있을 경우에 rsync의 실행옵션 중 z라는 옵션을 사용했기 때문에 발생하는 에러이디ㅏ.
   압축된 파일을 다시 압축해서 전송하려고 하는 도중에 발생하는 에러로서 자주 발생하는 에러 중 하나다.
   rsync에서 z옵션을 뺀 후에 실행하면 해결할 수 있다.
2. Timeout 관련 에러
   이 에러는 백업대상서버에 있는 /etc/rsyncd.conf 파일내의 timeout값이 너무 작게 설정되어 있어서 발생하는 에러이다.
   /etc/rsyncd.conf파일내의 timeout값을 조금 높게 설정해 준다.
3. Max Connections 관련 에러
   이 에러는 백업대상서버에 있는 /etc/rsyncd.conf파일내의 max connections에 설정된 값 이상의 연결이 시도되었기 때문에 발생한 에러이다.
   백업대상서버의 /etc/rsyncd.conf 파일내의 max connections 항목값을 적당하게 높여주거나 조절해 준다.
4. 전송대상파일 크기에서(out of memory)
   메모리에 관련된 에러로서 해결방법이 꽤 까다로운 에러 중 하나이다.
   전송대상 파일크기가 너무 커서 rsync에서 전송해야할 파일의 체크섬에서 발생하는 에러이다.
   전송대상 파일들의 크기를 점검해서 너무 클 경우에는 파일을 2-3개로 쪼개어서 다시 실행보시면 해결할 수 있다.

* rsync를 이용한 자동 미러링서버 구축
환경 : 원본소스서버의 데이터가 계속 바뀌어도 미러링서버에서 주기적으로 자동 동기화되므로 모두 동일한 데이터를 갖게된다.
       원본소스서버 : 192.168.0.202
                      원본소스가 보관된 서버이며 /var/ftp/pub 디렉토리에 FTP서비스다운로드파일들이 존재하고 있다.
       미러링 서버  : 192.168.0.211
                      주기적으로 원본소스서버의 /var/ftp/pub 디렉토리내의 소스파일들을 가져와서 미러링서버의 /var/ftp/pub 디렉토리에 저장한다.
- 원본소스서버의 설정사항 및 소스데이터 확인
# cat /etc/hosts.allow | grep rsync
rsync : 192.168.0.211
# cat /etc/rsyncd.conf
[SUPERUSER]
path = /var/ftp/pub
comment = SUPERUSER
uid = nobody
gid = nobody
user chroot = yes
read only = yes
hosts allow = 192.168.0.211
max connections = 3
timeout 600
# cat /etc/xinetd.d/rsync
service rsync
{
 disable   = no
 socket_type  = stream
 wait   = no
 user   = root
 server   = /usr/bin/rsync
 server_args  = --daemon
 log_on_failuer  += USERID
}
- 미러링서버의 설정사항
# rsync -avz 192.168.0.202::SUPERUSER /var/ftp/pub
# cat ftp_mirror.sh
#!/bin/sh
rsync -avz 192.168.0.202::SUPERUSER /var/ftp/pub
# crontab -l | grep rsync
00,10,20,30,40,50 * * * * su - root -c '/root/ftp_mirror.s' >& /dev/null

***********************************************************
* 리눅스 커널 컴파일
***********************************************************

* 커널 컴파일 전체 작업 공정표
1. 시스템 데이터 및 중요 파일들 모두 백업하기
2. 커널컴파일 작업위치로 이동하기
# cd /usr/src
3. 컴파일할 리눅스 커널소스 가져오기
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.gz
4. 커널소스 압축 해제하기
# tar xvfz linux-2.6.10.tar.gz
# ln -s linux-2.6.10 linux
# cd linux
5. 커널컴파일을 위한 작업장 청소작업
# make mrproper
6. 커널컴파일 옵션 설정작업
# make menuconfig -> or make config or make xconfig
7. 커널이미지파일 생성을 위한 컴파일 작업
# make bzImage  -> or make zImage or make zdisk or make zlilo
8. 커널모듈생성을 위한 컴파일
# make modules
9. 커널모듈파일 설치하기
# make modules_install
10. 커널이미지파일 및 관련파일복사, grub.conf파일 수정하기
# make install
# ls -l /boot/vmlinu-2.6.10
# ls -l /boot/vmlinuz
# ls -l /boot/initrd-2.6.10.img
# ls -l /boot/System.map-2.6.10
# ls -l /boot/System.map
# ls -l /boot/grub/grub.conf
11. 재부팅
# reboot
12. 새로운 커널버전확인 및 시스템서비스 확인
# uname -r
# uname -a

***********************************************************
* 리눅스서버 보안관리
***********************************************************

* 리눅스서버 기본 보안설정하기(설치직후 초기보안셋팅하기)
1. 중요한 시스템 파일들 퍼미션과 속성 재설정
2. 중요한 시스템파일들 별도 압축보관하기
3. 시스템디스크와 데이터디스크를 가능한 구분하라.
4. 백업데이터 자정공간을 별도의 파티션이나 별도의 디스크를 이용
5. root의 crontab에 로컬백업설정해 두기
6. /etc/xinetd.d/ 에서 불필요한 서비스 파일들 삭제
7. /etc/rc.d/init.d/에서 불필요한 초기화 파일들 삭제
8. /etc/services에서 사용하지 않는 포트정보 주석처리
9. /etc/hosts.allow, /etc/hosts.deny 파일에서 접근허용 설정
10. ssh에서 root의 원격접속 금지설정
# vi /etc/ssh/sshd_config
PermitRootLogin yes -> root 로그인 허용
PermitRootLogin no -> root 로그인 허용하지 않음
11. FTP서비스에서 root의 원격접속 금지설정
# vi proftpd.conf
RootLogin off
12. 일반사용자의 FTP접속에서 상위디렉토리 이동제한 설정하기
# vi proftpd.conf
DefaultRoot ~
DefaultRoot ~ !wheel
13. FTP 익명(anonymous) 접속금지 설정
14. su 명령어 사용제한설정 및 중요한 관리자 명령어 사용제한 설정하기
# chmod 4750 /bin/su
# chown root:wheel /bin/su
# chattr +i /bin/su
# grep wheel /etc/group
wheel:x:10:root,bible,admin
# chmod 750 /usr/sbin/useradd
# chmod 750 /usr/bin/top
# chmod 750 /sbin/fdisk
# chmod 750 /sbin/mkfs
# chmod 750 /sbin/fsck
# chown root:wheel /usr/sbin/useradd
# chown root:wheel /usr/bin/top
# chown root:wheel /sbin/fdisk
# chown root:wheel /sbin/mkfs
# chown root:wheel /sbin/fsck
# chattr +i /usr/sbin/useradd
# chattr +i /usr/bin/top
# chattr +i /sbin/fdisk
# chattr +i /sbin/mkfs
# chattr +i /sbin/fsck
15. root소유의 setuid, setgid 파일 찾아서 조치하기
# find / -user root -perm -4000 -print
16. 기본 실행되는 불필요한 프로세스를 죽이기
17. ntsysv에서 초기 실행할 서비스데몬 내리기
18. 리눅스서버 설치직후 파일시스템의 badblock 점검하기
19. 시스템 정보유출파일 삭제 및 수정하기
    /etc/issue  콘솔에서 로그인 시도시에 보여줄 메시지 저장
    /etc/issue.net 원격에서 로그인 시도시에 보여줄 메시지 저장
    /etc/redhat-release 원격에서 로그인 시도시에 리눅스 배포판 정보를 보여주는 메시지
    /etc/motd  로그인 이후에 보여줄 공지사항 저장
20. rootkit점검을 위한 chkrootkit 설치 및 실행결과 확인
21. 파일 무결성을 위한 tripwire 설치 및 초기화 설정
22. /etc/sysctl.conf파일에서 커널 옵션값 설정하기
23. 로그보안을 위한 원격로그서버 설정
24. /etc/rc.d/rc.local내에 부팅시 실행할 내용 등록
25. 서버의 정확한 시간을 위한 설정
# crontab -l | grep rdate
00 01 * * * su - root /usr/bin/rdate -s time.bora.net && /sbin/clock -w
26. 아파치 설정파일(httpd.conf) 보안설정하기

* setuid, setgid, stickybit 다루기
- 4XXX : setuid 비트를 의미함
- 2XXX : setgid 비트를 의미함
- 1XXX : sticky-bit 비트를 의미함

* 보안을 위한 find
- 지정된 일자 이후에 변경된 모든 파일 찾기
# find / -used 2 -exec ls -l {} \;
  -> 2일전부터 현재까지 변경된 적이 있는 파일들을 검색
- 지정된 파일보다 이후에 생성된 파일 찾기
# find / -newer /root/file1.txt -exec ls -l {} \;
  -> /root/file1.txt라는 파일이 생성된 날짜 이후에 생성된 파일들만을 검색
- root 소유의 setuid파일 찾기
# find / -user root -perm -000 -print
  -> 소유자가 root이고 setuid가 설정되어 있는 파일을 검색
# find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -lg {}\;
  -> 퍼미션에 setuid가 있거나 setgid가 있는 파일들을 모두 검색
- 서버내의 백도어파일 찾기
# find /dev -type f -exec ls -l {} \;
  -> /dev 내에 존재하는 파이들 중 일반적인 보통파일을 검색
- 서버내부의 .rhosts 파일 찾아서 확인
# find / -name .rhosts -exec ls -l {} \;
- 서버내부에 .bash_history파일을 모두 찾아서 확인
# find / -name .bash_history -exec ls -l {} \;
  -> 시스템전체를 대상으로 .bash_history파일을 찾아서 보여달라는 의미.
- 소유자가 없는 파일 또는 소유그룹이 없는 무적파일을 찾기
# find / -nouser -o -nogroup -print
  -> 소유자가 없거나 소유그룹이 없는 파일을 검색한다.

* 파일속성설정으로 리눅스파일 보안 구현(chattr, lsattr)
chattr 사용법 : # chattr [-RV] [-v 설정버전] [+-=설정모드] 대상파일들
  -R : 서브디렉토리이하까지 그 속성을 변경할 수 있다.
  -V : 자세한 출력모드를 제공한다.
  -v version : 지정된 파일에 버전을 설정할 수 있다.
                [설정모드]
    + : 지정한 속성을 부여한다.
    - : 지정한 속성을 해제한다.
    = : 원래 파일이 가지고 있던 그 속성만을 유지하게 한다.
    -a : 해당 파일을 추가만 할 수 있다.
    -c : 이 속성이 설정된 파일은 커널에 의해 디스크상에 자동적으로 압축된 상태로 저장이 된다.
    -d : 이 속성이 설정된 파일은 dump로 백업이 되지 않는다.
    -i : 이 속성이 지정되어 있다면 해당파일의 변경, 삭제, 이름변경뿐 아니라 파일추가 및 리으파일도 만들수 없게 된다.
    -s : 이 속성이 설정된 파일은 파일삭제가 될 경우에 해당블럭이 모두 0으로 되어버리고 디스크에 다시 쓰기가 발생하나.
    -S : 이 속성이 설정된 파일은 변경이 될 경우에 디스크동기화가 일어나는 효과를 그대로 누릴 수 있다.
    -u : 이 속성을 가진 파일이 삭제가 되었을 경우에는 그 내용이 저장이 되며 삭제되기 전의 데이터로 복구가 가능해진다.
lsattr 사용법 : # lsattr [-RVadv] [대상파일들]
- 파일의 삭제, 변경, 추가등을 불가능하게 하는 속성 설정
# lsattr rc.local
------------- rc.local
# chattr +i rc.local
# lsattr rc.local
----i-------- rc.local
# rm -f rc.local
rm: cannot remove `rc.local': 명령이 허용되지 않음
- 파일의 삭제, 변경, 추가 등을 불가능하게 하는 i속성 제거
# chattr -i rc.local
# lsattr rc.local
------------- rc.local
# rm -f rc.local
#
- 파일의 삭제는 불가능하지만 내용추가는 가능하도록 하는 속성 설정하기
# chattr +a messages
# lsattr messages
-----a------- messages
# rm -f messages
rm: cannot remove `messages': 명령이 허용되지 않음
# chattr -a messages
# lsattr messages
------------- messages
# rm -f messages
#
- 특정 디렉토리내의 모든 파일과 디렉토리에 대하여 한번에 속성부여하고 확인하기
# chattr -R +i directory
- 특정 디렉토리내의 모든 파일과 디렉토리에 부여되어 있는 속성을 동시에 제거하기
# chattr -R -i directory

* nmap
사용형식 : nmap [스캔타입] [옵션] <대상서버[네트워크|IP주소]>
           스캔옵션
    -sS                          : TCP SYN 스캔
    -sT                          : TCP 연결을 스캔
    -sF -sX -sN                  : Stealth FIN, Xmas Tree, 또는 NUll 스캔모드
    -sP                          : Ping 스캐닝
    -sU                          : UDP 스캐닝
    -sO                          : IP 프로토ㅗㄹ 스캔
    -sI <zombi host[:probeport]> : Idle scan
    -sA                          : ACK 스캔
    -sW                          : Window 스캔
    -sR                          : RPC 스캔
    -sL                          : LIST 스캔
- nmap 설치
# wget http://download.insecure.org/nmap/dist/nmap-3.75.tgz
# tar xvf nmap-3.75.tgz
# cd nmap-3.75
# ./configure
# make
# make install
- nmap으로 로컬서버 스캔하기
# nmap -sT -O -v localhost
  -sT : TCP conect에 대한 스캔을 한다.
  -O  : TCP/IP fingerprinting을 통하여 지정한 서버를 확인한다.
  -v : 스캔별과를 자세히 보여준다.
- 원격지의 특정 서버에 대한 스캔작업하기
# nmap -sT -O -v 192.168.0.101
- 원격서버의 UPD 사용포트 스캔작업하기
# nmap -sU -O -v 192.168.0.101

* root의 원격접속제한
# grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin no
# grep RootLogin /etc/proftpd/conf/proftpd.conf
RootLogin off

* 포트번호를 바꾸어서 서비스하는 서버보안
# grep telnet /etc/services
telnet          30023/tcp
# /etc/init.d/xinetd restart

* PortSentry를 이용한 실시간 해킹방어 구현
원격지에서 스ㅐㄴ하는 것을 실시간으로 차단할 수 있는 도구이다.
portsentry는 ping이나 기타 다른 도구들을 이용하여 불법적인 스캔을 이지하고 이를 차단하려고 할 때 /etc/hosts.deny파일에 실시간으로 추가되어 서버접근 및 포트스탬을 막는 막강한 보안툴이다.
portsentry는 다음과 같은 프로톸ㄹ의 스캔을 실시간으로 차단할 수 있다.
tcp  프로토콜 스캔차단(basic port-bound TCP mode)
stcp 프로토콜 스캔차단(Stealth TCP scan detection)
atcp 프로토콜 스캔차단(Advanced Stealth TCP scan detection)
udp  프로토콜 스캔차단(basic port-bound UDP mode)
sudp 프로토콜 스캔차단(Stealth UDP scan detection)
audp 프로토콜 스캔차단(Advanced Stealth UDP scan detection)
- 설치
# wget ftp://ftp.superuser.co.kr/secureity/portsentry/portsentry-1.0.tar.gz
# tar xvfz portsentry-1.0.tar.gz
# cd portsentry-1.0
# make linux
# make install
# ls -l /usr/local/psionic/portsentry/
# cat /etc/rc.d/rc.local
#!/bin/sh
/usr/local/psionic/portsentry/portsentry -tcp # tcp  프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -stcp # stcp 프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -atcp # atcp 프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -udp # udp  프로토콜 스캔차단
/usr/local/psionic/portsentry/portsentry -sudp # sudp 포트토콜 스캔차단

* tripwire를 이용한 파일무결성 구현
tripwire는 파일시스템무결성 점검을 하는 서버보안도구로서 파일들의 변경사항유무를 검사할 수 있는 대표적인 보안툴이다.
이 툴을 이용하면 파일들의 추가/삭제/변경유무를 확인할 수 있다.
- 설치
# wget ftp://ftp.superuser.co.kr/security/tripwire/tripwire-2.3-47.bin.tar.gz
# tar xvfz tripwire-2.3-47.bin.tar.gz
# cd tripwire-2.3
# ./install.sh
- 파일확인
/usr/sbin/tripwire  tripwire의 주된 실행파일
/usr/tripwire/*   tripwire에 관련된 설정파일과 key파일 및 정책파일들이 저장될 디렉토리
/var/lib/tripwire/report tripwire실행결과 보고서가 저장될 디렉토리
/var/libtripwire  tripwire DB파일이 저장될 디렉토리
- tripwire 데이터베이스 생성하기(tripwire 초기화)
tripwire 초기화는 점검했던 파일들의 무결성 점검결과를 저장하고있던 DB를 초기화 하다는 것이다.
즉, 초기화시키기 전의 변공사항은 이후에는 적용되지 않는다.
# tripwire --init
- tripwire 실행으로 파일 생성/변조/삭제유무 점거마기
# tripwire --check
- tripwire 설정파일확인 및 변경
twcfg.txt 파일은 tripwire의 주설정파일로서 /etc/tripwire/twcfg.txt 에 존재한다.
이 파일은 tripwire가 어떤 환경으로 실행될 것인가를 정의해둔 파일이다.
즉, tripwire실행파일의 위치, 정책파일(tw.pol)의 위치, tripwire 데이터베이스파일의 위치등을 모두 이 파일에서 정의하고 있다.
- tripwire정책파일 수정 및 변경
tripwire는 /etc/tripwire/twcfg.txt파일을 이용하여 점검할 대상파일을 결정한다.
이 파일을 수정해서 점검할 파일을 추가/삭제할 수 있다.
이 파일에 등록된 파일들은 tw.pol파일(바이너리로 되어있음)에 적용되어 tripwire에서 사용하게 된다.

* chkrootkit을 이용한 rootkit 탐지
백도가 설치되어 있는가를 검사하는 툴이다.
chkrootkit을 이용해서 다음과 같은 검색이 가능하다.
  rootkit의 흔적 및 설치여부를 검색(chkrootkit)
  NIC으 promisc모드 설정여부 검색(ifpromisc)
  lastlog의 변조 및 삭제여부 검색(chklastlog)
  wtmp의 변조 및 삭제여부 검색(chkwtmp)
  기타 파일벼조여부를 검색
chkrootkit툴에는 다음가 같은 파일들이 존재하며 이 파일들은 다음과 같은 역할을 한다.
  ifpromisc.c 랜카드가 promiscuous mode로 설정되어 있는가를 검사
  chklastlog.c /var/log/lastlog의 삭제유무 검사
  chkwtmp.c /var/log/wtmp의 삭제유무 검사
  check_wtmpx.c wtmpx파일의 삭제유무검사(Solaris의 경우만 해당됨)
  chkproc.c LKM트로이목가 검사
  strings.c 점검되는 파일들의 변조여부 검사
- 설치
# chkroot.tar.gz다운로드
# tar xvfz chkrootkit.tar.gz
# cd chkrootkit-0.44
# 컴파일 전 로그파일위치 확인 및 수정하기
  모든 파일을 열어서 로그파일의 정확한 위치를 확인한다.
  chklastlog.c 파일에 리눅스에 대한 설정부분을 추가해 준다.
  #ifdef _LINUX_
  #define WTMP_FILENAME  "/var/log/wtmp"
  #define LASTLOG_FILENAME "/var/log/lastlog"
  #endif
# make sense
- chkrootkit으로 rootkit설치여부 및 서버점검하기
# ./chkrootkit

***********************************************************
* 리눅스 서버관리를 위한 쉘스크립트
***********************************************************

* 쉘프로그램에서 실행상태 반환하는 true와 false
쉘프로그램내에서 실행한 명령의 결과가 정상적으로 종료되었다는 의미로 true를 실행하여 실행이 정상적으로 완료되었음을 알려주는 역할을 한다.
이 때 true가 반한하는 종료상태값은 실행성공을 의미하는 0이다.
그리고 false는 쉘프로그램내에서 특정 명령수행이 항상 실패햤음을 의미하는 1을 반환한다.

* 쉘프로그램에서 사용자 입력값 받아서 처리하기
- 사용자 입력값 처리하는 read문 기본 사용법
read -p "Select Number(1, 2, 3 or 4): " MENU1
화면에 "Select Number(1, 2, 3 or 4): "가 출력이 된 후에 사용자의 입력을 대기한다. 사용자가 입력한 내용을 MENU1에 저장한다.
- 쉘프로그램내에서 read 문에서 배열로 받아서 처리하기
입력내용을 받아들일 지정된 변수를 배열변수로 사용하려면 -a 옵션을 사용해야 한다.
쉘프로그램에서도 C와 마찬가지로 배열인자는 0부터 시작한다.
배열변수를 출력하려면 ${변수명[인자]}와 같은 형식을 사용한다.

* 쉘프로그램 실행시 발생되는 메시지 처리하기
logger는 로그메시지를 시스템로그파일(/var/log/messages 등)에 기록할 수 있는 로그리고기이다.
logger명령어를 사용하여 원하는 로그를 기록하면 지정된 메시지가 시간표시와 함께 시스템로그파일(/var/log/messages)에 기록된다.
사용형식 : logger [-is] [-f file] [-p pri] [-t tag] [메시지]
# logger SystemCheck
# tail -1 /var/log/messages
Apr  3 00:55:03 rh9  4월  3 00:55:03 widemail: SystemCheck

* 반복메뉴방식의 쉘프로그램 만들기
select문은 반복되는 메뉴방식의 쉘프로그램을 만들 때에 최적이다.
사용형식 :
 select 변수 in 메뉴리스트
 do
  실행될 명령문들
 done
select문으로 반복메뉴방식의 쉘프로그램을 작성할 때에는 PS3라는 쉘변수를 사요하는 것이 일반적이다.
즉, PS3쉘변수를 사용하면 PS3에 지정된 메시지를 화면으로 출력하고 사용자의 입력을 기다린다.
select문이 실행되면 in 다음의 메뉴리스트에 번호를 붙여서 화면으로 출력한다.
그리고 선택된 번호가 지정되면 변수에 메뉴리스트에서 선택된 해당리스트를 저장한 다음 "do ~ done"의 내용이 실행된다.

* 동종류 프로세스 한번에 죽이는 쉘명령어 직접만들기
# cat prokill.sh
#!/bin/sh
ps -ef | grep $1 | awk '{ print $2 }' | xargs kill -9 {}

* superuse 사이트에 있는 스크립트를 이용하자.

***********************************************************
* 리눅스서버 응급복구와 삭제파일 복구
***********************************************************

[1] 다운된 리눅스서버 응급복구

* 복구보다는 백업을 우선하라.

* 파일시스템이 깨졌을 때 부팅안되는 상황 조치
# fdisk -l    -> 깨진 파일시스템 확인
# e2fsck -j ext3 /dev/sda3 -> 파일시스템 점검

* 리눅스CD linux rescue 모드로 보구하기
파일시스템이 깨졌을 때 : e2fsck로 파일시스템 복구
비밀번호 및 로그인장애 : /etc/passwd 파일 점검
grub정보로 부팅장애    : /boot/grub/grub.conf 파일 점검
부팅시 마운트정보 장애 : /etc/fstab 점검

* 리눅스CD linux rescue nomount 로 복구하기
현재 상태에서는 장치파일명이 생성되어있지 않으며 마운트도 되어있지 않기 때문에 현재 시스템의 어떠한 수정작업도 할 수 없는 상황이다.
먼저 필요할 것 같은 장치명들을 임의대로 생성한다.
# mknod /dev/sda -> /dev/sda  장치명 생성
# mknod /dev/sda1 -> /dev/sda1 장치명 생성
# mknod /dev/sda2 -> /dev/sda2 장치명 생성
생성한 장치와 마운트할 마운트포인트(디렉토리)를 생성한다.
# mkdir /temp
# mkdir /temp1
# mkdir /temp2
위에서 생성한 각 장치명과 각 디렉토리들을 마운트한다.
# mount /dev/sda1 /temp1
# mount /dev/sda2 /temp2

* 리눅스 시스템업그레이드 방법으로 복구하기

* 시스템 서버 다운시 매직키를 이용한 응급조치
- ALT + SysRq + S : Alt키와 SysRq키와 S키를 동시에 누른다. sync 작업
- ALT + SysRq + E : Alt키와 SysRq키와 E키를 동시에 누른다. tem SIG 작업
- ALT + SysRq + U : Alt키와 SysRq키와 U키를 동시에 누른다. umount 작업
- ALT + SysRq + B : Alt키와 SysRq키와 B키를 동시에 누른다. reboot 작업

[3] 삭제된 파일 복구하기

* 리눅스 휴지통(safedelete)을 이용한 삭제파일 복구하기
safedelete라는 명령어는 파일을 삭제하는 명령어이다.
단 rm과는 달리 safedelete라는 명령어로 파일을 삭제하면 특정한 디렉토리에 삭제된 파일을 보관하게 된다.
그리고 삭제된 사용자의 홈디렉토리에 삭제 파일리스트를 저장하고 있는 로그파일에 그 파일정보들을 보관한다.
그리고 safedelete명령어로 삭제된 파일은 undelete라는 명령어로 복구가 가능하다.
따라서, 이 툴로서 삭제된 파일을 복구하려면 파일삭제시에 사용하는 명령어를 rm 대신에 safedelete 명령어를 사용해야한다.
이 툴의 이름은 safedelete이며 삭제와 복구시에 사용되는 명령어는 다음과 같다.
    safedelete : rm 대신에 사용하게 될 파일보구가 가능한 삭제명령어
    undelete   : safedelete로 삭제한 파일을 복구하는 명령어
    safecnvt   : safedelete 로그파일(.safedelete.log)을 컨버전하는 명령어
    safedelchk : 지정한 일자 이후의 safedelete로 삭제한 파일을 완전 삭제함
- safedelete 설치
# wget ftp://ftp.nuri.net/pub/RedHat/redhat/redhat-7.1-en/powertools/i386/RedHat/RPMS/saedelete-1.3-0.i386.rpm
# rpm -Uvh saedelete-1.3-0.i386.rpm
- rm 명령어를 safedelete로 대체하기
# grep safedelete ~/.bashrc
alias rm='safedelete'

* tct의 unrm으로 삭제파일 복구하기
- 설치
http://www.fish.com/tct 에서 다운로드한다.
# tar xvfpz tct-.09.tar.gz
# cd tct-1.09
# make
# cd bin
# cp rnrm /usr/local/bin
# cp lazarus /usr/local/bin
- 삭제파일 복구
# /usr/local/bin/unrm /dev/sda1 > /tmp_dir/dump_temp
# /usr/local/bin/lazarus -h /tmp_dir/dump_temp

* e2fsck 파일시스템 점검복구유틸리티
- e2fsck 종료코드
  0 - 에러없이 정상적인 종료를 의미함
  1 - 파일시스템을 복구하였음을 의미함
  2 - 파일시스템이 복구되어 시스템이 재부팅되어야함을 의미함.
  4 - 작업대상 파일시스템에 문제가 있으나 복구하지 않고 그대로 두었음을 의미함.
  8 - 실행에러를 의미함
  16 - 사용법 또는 문법에러를 의미함
  32 - e2fsck작업이 사용자에 의해서 취소되었음을 의미함.
  128 - 공유 라이브러리에러를 의미함
- e2fsck작업에서 기본적으로 점검하는 항목
  inode 점검
  blocks 점검
  sizes 점검
  디렉토리구조 점검
  디렉토리 연결성점검
  파일링크 정보
  전체파일갯수 점검
  전체블록수중 사용중인 블록 정검
- 사용형식
  e2fsck [-pacnyrdfvtFV] [-b 수퍼블록] [-B 블록크기] [-l|-L 배드블록목록화일] 장치명
  마운트되어 있는 상태에서 e2fsck실행을 자제한다.
- e2fsck 명령어로 특정 파일시스템의 점검 및 복구하기
# e2fsck /dev/hda1
- e2fsck로 특정 파일시스템 강제 점검 및 복구하기
# e2fsck -f /dev/hda1
- ext3(저널링)파일시스템 점검 및 복구하기
# e2fsck -j ext3 /dev/hda1
- e2fsck로 특정 파일시스템 강제 점검 및 상세 작업내역보기
# e2fsck -fv /dev/hda1
- 파일시스템의 수퍼블록을 이용한 파일시스템 복구
       -b superblock
              Instead  of  using  the  normal  superblock,  use an alternative
              superblock specified by superblock.   This  option  is  normally
              used  when the primary superblock has been corrupted.  The loca-
              tion of the backup superblock is dependent on  the  filesystem's
              blocksize.    For  filesystems  with  1k  blocksizes,  a  backup
              superblock can be found at block 8193; for filesystems  with  2k
              blocksizes,  at  block  16384;  and  for 4k blocksizes, at block
              32768.

              Additional backup superblocks can be  determined  by  using  the
              mke2fs  program  using  the  -n  option  to  print out where the
              superblocks were created.   The -b option to mke2fs, which spec-
              ifies blocksize of the filesystem must be specified in order for
              the superblock locations that are printed out to be accurate.

              If an alternative superblock is specified and the filesystem  is
              not  opened  read-only,  e2fsck  will make sure that the primary
              superblock is  updated  appropriately  upon  completion  of  the
              filesystem check.
# e2fsck -b 8193 /dev/hda1
# e2fsck -b 16385 /dev/sda1
- e2fsck로 파일시스템 점검시 버퍼캐쉬의 내용을 디스크에 저장하기
-F옵션을 사용하면 e2fsck를 수행하기 이전에 sync작업을 수행한다.
# e2fsck -F /dev/sda1
- e2fsck로 특정 파일시스템 점검시 오류 자동수정하기
# e2fsck -p /dev/sda1
- e2fsck로 파일시스템 점검시 모든 질문항목에 yes라고 자동입력하기
# e2fsck -y /dev/sda1
- e2fsck로 파일시스템 점검시 모든 질문항목에 no라고 자동입력하기
# e2fsck -n /dev/sda1





***********************************************************
* 리눅스서버 NFS와 NIS
***********************************************************

* NFS 서버와 NFS 클라이언트의 필요한 데몬들
- rpc.nfsd : NFS 데몬
- rpc.mountd : rpc 기반하에서 NFS 사용을 위한 마운트를 가능하게 하는 데몬
- portmap : NFS가 원래 RPC기반하에서 작동되는 깃이기 때문에 rpcbind를 필요로 하면, rpcbind의 매핑을 위해 필요한 데몬이 portmap이다.
- /etc/exports : 마운트를 허용한 디렉토리와 사용옵션 nfs 설정파일

* NFS 서버와 클라이언트의 데몬 시작, 종료 및 재시작
- NFS 데몬
# /etc/init.d/nfs start
# /etc/init.d/nfs stop
# /etc/init.d/nfs restart
- portmap 데몬
# /etc/init.d/portmap start
# /etc/init.d/portmap stop
# /etc/init.d/portmap restart

* NFS 관련 데몬들의 실행점검
"rpcinfo -p"라고 하면 현재 NFS서버에서 구동중인 NFS관련 데몬들을 점검해 볼 수 있다.
관련된 데몬은  portmapper, mountd, nfs, nlockmgr, rquotad, status 가 있다.
# rpcinfo -p
   프로그램 버전 원형   포트
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    736  rquotad
    100011    2   udp    736  rquotad
    100011    1   tcp    739  rquotad
    100011    2   tcp    739  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100021    1   udp  32780  nlockmgr
    100021    3   udp  32780  nlockmgr
    100021    4   udp  32780  nlockmgr
    100005    1   udp  32781  mountd
    100005    1   tcp  33434  mountd
    100005    2   udp  32781  mountd
    100005    2   tcp  33434  mountd
    100005    3   udp  32781  mountd
    100005    3   tcp  33434  mountd
# rpcinfo -p 192.168.0.102
   프로그램 버전 원형   포트
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    736  rquotad
    100011    2   udp    736  rquotad
    100011    1   tcp    739  rquotad
    100011    2   tcp    739  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100021    1   udp  32780  nlockmgr
    100021    3   udp  32780  nlockmgr
    100021    4   udp  32780  nlockmgr
    100005    1   udp  32781  mountd
    100005    1   tcp  33434  mountd
    100005    2   udp  32781  mountd
    100005    2   tcp  33434  mountd
    100005    3   udp  32781  mountd
    100005    3   tcp  33434  mountd

* NFS설정파일(/etc/exports)
설정형식 : [마운트할 디렉토리] [허용할 NFS크라리언트](설정옵션들)
# cat /etc/exports
/web_data 192.168.0.101(rw)  # 192.168.0.101 NFS 클라이언트에서 NFS 서버의 /web_data 로 read와 write가 가능하도록 마운트를 허용한다.
/db_data 192.168.0.101(rw)
/data  192.168.0.109(ro)  # NFS서버의 /data 디렉토리를 NFS클라이언트에서 read 만 가능하도록 마운트 허용
/home  192.168.0.109(rw)  # NFS서버의 /home 디렉토리 전체를 NFS 클라이언트가 마운트하도록 허용
/home/sspark 192.168.0.109(noaccess)  # /home/sspark 은 NFS마운트를 허용하지 않는다.
/var/log 192.168.0.109(rw,root_squash) # NFS클라이언트에서 NFS서버로 root권한으로 마운트를 할 경우에 NFS서버에서 root권한을 부여하는 것이 아니라 nfsnobody권한을 부여한다.
        NFS클라이언트에서 NFS서버의 마운트시에 root를 일치시키려면 no_root_squash 옵션을 사용한다.(기본값은 root_squash)
/var/log 192.168.0.109(rw,no_root_squash)# NFS클라이언트그의 root는 NFS서버로 마운트 할 때 NFS서버에서의 root와 일치한다. 가능한 이 설정은 보안을 위해 사요하지 마라.
/home  192.168.0.109(rw,all_squash) # root사용자와는 반대로 일반사용자으 경우에는 no_all_squash가 기본값이다.
        NFS클라이언트에서 NFS서버로 마운트할 때 동일사용자가 존재한다면 root를 제외한 일반사용자는 도일한 사용자로 매핑이 된다.
        all_squash라는 옵션을 사용했기 때문에 일반사용자의 경우에도 모두 nfsnobody로 매핑이 된다.

* NFS마운트 방법
설정형식 : mount -t nfs NFS서버_IP주소_또는_호스트명:/NFS서버_마운트포인트 /NFS클라이언트_마운트포인트
           -t nfs   파일시스템형식을 nfs로 지정
    NFS서버_IP주소_또는_호스트명 NFS서버의 IP주소 또는 호스트명
    NFS서버_마운트포인트  NFS서버에서 NFS클라이언트의 마운트가 허용되어 있는 위치를 지정
    NFS클라이언트_마운트포인트 NFS클라이언트의 마운트포인트 지정
# mount -t nfs 192.168.0.102:/web_data /web_data
# mount -t nfs 192.168.0.103:/db_data /db_data

* 부팅시 NFS 자동마운트 설정
/etc/fstab 에서 사용가능한 NFS 마운트 옵션들
- rsize=n 지정된 NFS서버로부터 읽어오는 바이트수를 지정. 기본값은 1024
- wsize=n 지정된 NFS서버에 쓰기를 할 때 사용하는 바이트수를 지정. 기본값은 1024
- timeo=n RPC타임아웃이 발생되고 나서 첫번째 재전송요구를 보낼 때 사용되는 시간
- retrans=n timeout이 발생시 재전송시도 횟수를 제한한 것임. 기본값은 3
- port=n 지정된 NFS서버와 연결할 때의 포트번호 지정
- fg  첫번째 마운트시도하여 timeout되면 바로 중단됨. default값
- intr  timeout발생시 신호를 보내는 NFS호추를 인터럽트함.
- hard  timeout이 발생하면 "server not responding"이라는 메시지를 출력한 후에 계속 재시도 함
- soft  timeout이 발생하면 I/O에러가 발생하였을을 알려줌.
# cat /etc/fstab | grep nfs
192.168.0.100:/home/bible /bible nfs timeo=10,intr


***********************************************************
* 리눅스 서버이전
***********************************************************

* 서버이전시 고려할 사항들
- 서버 네트워크환경문제
- 일반사용잘의 ID와 패스워드문제
- 사용자들의 도메인문제
- 서버내의 홈페이지 데이터들의 문제
- 아파치웹서버 이전문제
- MySQL 데이터베이스 이전문제

* 서버이전 계획표 작성
구분   이전하기전 서버(A)  이전후 서버(B)
작업자   김길동
작업일시  2006년 4월 5일 새벽 04시부터 06시까지
지역   용산구    구로구
IDC(업체)명  A-IDC    B-IDC
IDC(업체)담당자명 박길동    이길동
IDC(업체)연락번호 111-1111   222-2222
서버모델명(서버명) SU-S2001(A서버)   SU-2002(B서버)
서버IP주소  192.168.0.101   192.168.1.211
네트워크주소  192.168.0.0   192.168.1.0
브로드캐스트주소 192.168.0.255   192.168.1.255
넷마스크주소  255.255.255.0   255.255.255.0
웹서버(위치)  APACHE(/usr/local/apace2) APACHE(/usr/local/apace2)
DB서버(위치)  MySQL(/usr/local/mysql)  MySQL(/usr/local/mysql)
FTP서버   Proftpd(/usr/local/proftpd) Proftpd(/usr/local/proftpd)
DNS서버   BIND9    BIND9
메일서버  SENDMAIL, Qpopper  SENDMAIL, Qpopper
사용자수  10명    10명
기타   gd,libpng,freetype,zlib 등 gd,libpng,freetype,zlib 등
주의사항  이전하기전 사용 도메인 TTL값 최소화
   cron설정주의
   로그파일들 이전주의(/var/log)
   이전후 홈페이지로딩테스트 및 게시판업로드테스트
   작업 7일전 작업관련 홈페이지 공지사항 등록
   각 사용자에게 작업관련 메일발송

* 서버에서 서비스하던 도메인들의 TTL값 변경하기
서버이전 작업을 시작하기 쵯 몇일전에 각 도메인들의 DNS정보가 세팅된 네임서버에서 각 도메인들의 zone파일들에 설정된 TTL값을 0또는 1로 설정한다.
즉, 도메인의 IP주소를 변경하기 전에 DNS의 TTL값을 0 또는 1로 설정해 둔다.

* 서버의 서비스데몬들 중지하기
- 웹서비스 중지
- 메일서비스 중지
- 데이터베이스 서버 중지
서비스를 중지하는 이유는 서버이전을 하는 도중에 계속 서비스를 하게 되면 작업하는 동안에 업데이트된 데이터들은 유실되기 때문이다.

* 이전대상서버에서 네트워크 설정작업
다음과 같이 네트워크 설정명령어들과 파일들을 통하여 새로운 네트워크 환경을 설정한다.
- route      서버라우팅 설정 명령어
- ifconfig     네트워크 인터페이스 설정 명령어
- netconfig     네트워크 설정 명령어
- /etc/resolv.conf    DNS설정 파일
- /etc/sysconfig/network   기본게이트웨이 설정파일
- /etc/sysconfig/network-scripts/ifcfg-eth0 첫번째 NIC 네트워크 설정파일
- /etc/sysconfig/network-scripts/ifcfg-eth1 두번째 NIC 네트워크 설정파일
- /etc/init.d/network    설정된 네트워크 start|stop|restart

* 사용자 계정정보 이전하기
- /etc/passwd파일내의 사용자계정부분 이전하기
  A서버의 /etc/passwd 파일에서 일반사용자들의 계정정보만을 복사해서 B서버의 /etc/passwd에 복사한다.
- /etc/group파일내의 사용자 그룹설정 부분 이전하기
  A서버의 /etc/group파일에서 시스템사용 그룹설정 부분을 제외한 나머지 그룹부분들을 그대로 복사하여 B서버의 /etc/group파일에 그대로 추가한다.
- /etc/shadow 파일내의 사용자 설정부분 이전하기
  /etc/shadow파일에서 사용자들의 정보만을 복사해서 B서버의 /etc/shadow에 복사한다.

* 일반사용자 홈디렉토리 파일들 이전하기
- A서버에서 home을 모두 압축한다.
# cd /
# tar cvfpz home.tar.gz home
- B서버에서 home.tar.gz 파일을 가져온다.
# cd /
# ncftp -u bible 192.168.0.101
ncftp / > get /home.tar.gz
- B서버에서 가져온 home.tar.gz 압축을 해제한다.
# tar xvfpz home.tar.gz -C /

* APACHE 웹서버 이전하기
아파치를 이전할 때에는 다음과 같은 주의사항이 있다.
1. httpd.conf파일 내에 설정되어 있는 가상호스트정보 수정
2. httpd.conf파일 내의 DocumentRoot정보의 확인 및 수정
3. httpd.conf파일 내의 ServerName정보의 확인 및 수정
4. httpd.conf파일 내의 UserDir정보의 확인 및 수정
- A서버에서 APACHE 디렉토리를 압축한다.
# cd /usr/local
# tar cvfp apache2.tar.gz apache2
- B서버에서 A서버에 있는 apache2.tar.gz 파일을 가져오고 압축을 해제한다.
# cd /usr/local
# ncftp -u bible 192.168.0.101
ncftp /usr/local > get /usr/local/apache2.tar.gz
# tar xvfpz apche2.tar.gz
- httpd.conf 파일 수정
  NameVirtualHost 값 수정
  VirutalHost 부분 수정
  DocumentRoot 저옵 수정
  ServerName 정보 수정
- php와 Zend 이전

* MySQL 데이터베이스 이전하기
- A서버에서 MySQL을 압축한다.
# cd /usr/local
# tar xvfpz mysql.tar.gz mysql
- A서버에서 압축한 파일을 B서버로 가져오고 압축을 해제한다.
# cd /usr/local
# ncftp -u bible 192.168.0.101
ncftp /usr/local > get /usr/local/mysql.tar.gz
# tar xvfpz mysql.tar.gz
- MySQL 실행에러문제 해결하기
  호스트명 인식불능문제
  /usr/local/mysql/var/호스트명.pid
  /usr/local/mysql/var/호스트명.err
  /usr/local/mysql/var 소유자 계정확인

* 메일서버 이전하기
- A서버에서 /etc/mail 디렉토리를 압축하여 B서버로 가져온 후에 원래위치에 압축해제한다.
- A서버의 /usr/local/lib/popper파일을 B서버로 가져와서 원래위치에 넣어둔다.
- A서버의 /var/spool/mail 디렉토리내용과 /var/spool/mqueue 디렉토리의 내요을 그대로 가져와서 B서버에 넣어둔다.
- A서버의 /etc/xinetd.d 디렉토리내에 있는 pop3파일을 B서버로 가져와서 넣어둔다.
- A서버의 /usr/sbin/sendmail 파일과 /etc/aliases 파일을 B서버로 가져와서 각자 위치에 넣어둔다.
- 이와 같이 작업한 후에 B서버에서 /etc/init.d/sendmail 스크립트를 이용하여 sendmail을 재시작하고 /etc/init.d/xinetd 스크립트를 재시작하여 /etc/xinetd.d/pop3 파일이 적용되도록 한다.

* 기타 서버이전시 작업해야할 사항들
- A서버의 /etc/hosts파일의 정보를 확인하고 필요한 정보는 B서버의 /etc/hosts파일에 등록한다.
- A서버의 /etc/hosts.allow파일과 /etc/hosts.deny파일의 내용을 B서버에 그대로 설정한다.
- A서버의 /var/spool/cron 디렉토리내의 파일들을 B서버로 그대로 가져와서 설정한다.
- A서버의 /var/log 디렉토리내에 존재하는 필요한 로그파일들(특히 wtmp, secure 파일)을 B서버로 가져와서 /var/log에 저장한다.
- A서버의 /etc/sysctl.conf 파일의 내용을 B서버의 서버사양에 맞도록 수정하여 적용한다.
- A서버의 /etc/motd, /etc/issue, /etc/issue.net 파일들의 니용을 B서버로 가져와서 해당 파일들에 저장한다.
- A서버의 /etc/rc.d/rc.local 파일을 그대로 가져와서 B서버에 복사한다.

* DNS 서버에서 해당 도메인들의 IP주소 변경작업
도메인들의 DNS서버에서 각 도메인들의 IP주소를 B서버의 IP주소(192.168.1.211)ㄹ 변경한다.
TTL값을 원래의 값으로 복원한다.

* 서버이전후 확인할 사항들
1. 홈페이지가 정상로딩 테스트
2. 홈페이지의 게시판 및 업로드 테스트하기
3. 사용자계정 정보확인 및 로그인 테스트
4. 메일수발신 테스트와 MySQL접속 테스트
5. B서버에서 응용프로그램들의 경로 확인하기

***********************************************************
* PROC 파일시스템을 이용한 커널최적화 및 시스템튜팅
***********************************************************

* /proc파일시스템에 존재하는 커널파라미터 변경하는 방법들
1. /etc/sysctl.conf 파일에 등록한다.
   지속적으로 적용하려면 이 파일에 넣어둔다.
2. sysctl 명령어를 이용한다.
   "sysctl -w 파라미터변수=값"의 형식으로 변경이 가능하다.
3. /proc/sys 디렉토리내에 존재하는 각가의 파일들을 vi로 열어서 직접 변경한다.
   좋지않은 방법으로 추천하지 않는다.
4. echo 명령어를 이용한다.
   "echo 1 > 파일위치"와 같은 방법으로 간편하게 수정할 수 있다.
5. redhat-config-proc을 이용한다.

* sysctl을 이용한 커널 옵션 설정 및 확인
- sysclt
  configure kernel parameters at runtime 으로서 커널 파라미터를 설정하는 명령어이다.
- 커널옵션값 전체 확인하기
# sysctl -a
- 특정커널옵션값의 설정
# sysctl -w net.ipv4.tcp_syncookies=1

* /proc/sys/kernel에서 획득할 수 있는 몇가지 커널 정보들
- 서버의 호스트네임 확인
# cat /proc/sys/kernel/hostname
- 커널버전 확인
# cat /proc/sys/kernel/osrelease
- 운영체제명 확인
# cat /proc/sys/kernel/ostype
- 커널 매직키(Magic Key)사용가능 확인
# cat /proc/sys/kernel/sysrq

* /proc/sys/net/ipv4에서 설정 가능한 서버보안
- 외부의 ping 막기
# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
- smurf 공격방지를 위한 broadcast 패킷방지하기
# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
0
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
- 세션 종료시간 조정
  tcp_fin_timeout은 TCP 세션이 종료된 후에 얼마나 오랫동안 세션연결을 유지하고 있을 것인가를 설정한다.
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
# echo 20 > /proc/sys/net/ipv4/tcp_fin_timeout
- tcp keepalive time 설정
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# echo 1200 > /proc/sys/net/ipv4/tcp_keepalive_time
- 서버에서 로컬 포트사용범위 설정
# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
- IP 포워딩(forwarding)기능 막기
# cat /proc/sys/net/ipv4/ip_forward
0
- 서버의 날짜정보 유출막기
# cat /proc/sys/net/ipv4/tcp_timestamps
1
# echo 0 > /proc/sys/net/ipv4/tcp_timestamps
- SYN_Flooding 공격 막기
  일종의 서비스거부공격(DoS: Denial of Service)의 일종이다.
  TCP세션을 맺기 위해서는 패킷을 보낼 서버와 받을 서버간에 몇단계 확인작업을 거치게 되는데 SYN과 ACK패킷을 이용하여 송수신 준비확인을 한다.
  SYN패킷을 박은 목적지 서버는 SYN과 ACK패킷을 보낸 후에 소스서버에서 ACK패킷을 보내기를 기다리게 된다.
  이 때에 계속적으로 기다리는 것이 아니라 백로그큐(Backlog Queue)가 허용하는 공간에 연결정보를 보관한다.
  이런 상태가 숟없이 쌓이게 되면 복적지 서버의 특정 서비스가 정상적으로 이루어 지지않는 서비스다운상태가 된다.
  해결방법은 백로그큐를 늘려주거나 tcp_syncookies값을 로 설정하는 것이다.
# cat /proc/sys/net/ipv4/tcp_syncookies
0
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1024

* /proc/sys/net/ipv4/conf 에서 가능한 네트워크 설정
- ICMP redirect의 변조된 패킷 차단(accept패킷 차단설정)
# cat /proc/sys/net/ipv4/conf/default/accept_redirects
1
# echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects
- ICMP redirect 의 변조된 패킷 차단(send 패킷 차단설정)
# cat /proc/sys/net/ipv4/conf/default/send_redirects
1
# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
- DoS공격 source로 사용 차단(IP 스푸핑 방지하기)
# cat /proc/sys/net/ipv4/conf/default/rp_filter
1
# echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
- 스푸핑등의 패킷에 대한 로그를 남기자
# cat /proc/sys/net/ipv4/conf/default/log_martians
0
# echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
- source route 패킷허용 막기(신뢰받는 호스트로 위장하는 것 막기)
# cat /proc/sys/net/ipv4/conf/default/accept_source_route
0
# echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route

* /proc/sys/fs 에서의 옵션설정
- 커널에서 사용할 수 있는 푀대파일 수 설정하기
# cat /proc/sys/fs/file-max
102709
- 현재 활동중인 파일 수 확인
# cat /proc/sys/fs/file-nr
834     0       102709

* /proc에서 커널정보 확인하기
- cpu 정보 확인
# cat /proc/cpuinfo
- 사용중이거나 사용가능한 장치(device)파일 확인
# cat /proc/devices
- 현재 커널에서 인식되어 있는 파일시스템 타입 확인
# cat /proc/filesystems
- 현재 사용되고 있는 메모리 번지별 사용내역 확인
# cat /proc/iomem
- 입출력포트의 번지별 사용내역
# cat /proc/ioports
- 서버 펴윤부하율 정보 확인
# cat /proc/loadavg
- 메모리 일반정보 확인
# cat /proc/meminfo
- 커널에 로드ㅗ디어 있는 모듈확인
# cat /proc/modules
- 현재 마운트되어 있는 정보확인
# cat /proc/mouts
- 현재 설정된 파티션정보 확인
# cat /proc/partitions
- 커널버전 정보확인
# cat /proc/version
- IRQ값 정보확인
# cat /proc/interrupts

***********************************************************
* SAMBA 서버
***********************************************************

* 설치
삼바서버패키지 : samba-3.0.8-0.pre1.3
삼바클라이언트 패키지 : samba-client-3.0.8-0.pre1.3
삼바서버와 클라이언트에서 모두 사용하는 파일들 패키지 : samba-common-3.0.8-0.pre1.3
삼바서버 웹관리 패키지 : samb-swat-3.0.8-0.pre1.3
삼바서버 설정툴 패키지 : system-config-samba-1..21-1
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-client-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samba-common-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/samb-swat-3.0.8-0.pre1.3.rpm
# wget http://ftp.superuser.co.kr/pub/fedora/core3/RPMS/system-config-samba-1..21-1.rpm
# rpm -Uvh --nodeps samba-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps samba-client-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps samba-common-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps samb-swat-3.0.8-0.pre1.3.rpm
# rpm -Uvh --nodeps system-config-samba-1..21-1.rpm
설치된 주요 파일들
/etc/logrotate.d/samba : 삼바로그를 관리하기 위한 삼바로그 로테이트 스크립트 파일
/etc/init.d/smb : 삼바데몬(nmbd, smbd)을 실행(종료, 재시작)하기 위한 스크립트파일
/etc/sysconfig/samba :삼바 제어판 설정파일
/usr/bin/smbstatus : 삼바서버에 로그인한 정보를 확인하기 위한 유틸리티
/usr/sbin/nmbd : 삼바 NetBIOS 데몬
/usr/sbin/smbd : 윈도우서버와 파일 및 프린터공유를 위한 삼바 주데몬
/usr/bin/smbclient : 삼바 클라이언트 유틸리티로서 삼바서버로 접속이 가능하도록 제공함.
/usr/bin/smbmount : 삼바 원격마운트 유틸리티
/usr/bin/smbumount : 삼바 원격마운트 해제 유틸리티
/etc/samba : 삼바의 주된 디렉토리
/etc/samba/lmhosts : 삼바서버 NetBIOS 호스트파일(삼바서버에서 사용하는 호스트정보파일)
/etc/samba/smb.conf : 삼바서버의 주설정파일
/usr/bin/smbpasswd : 삼바사용자 생성, 삭제 및 삼바사용자 패스워드 설정, 변경 유틸리티
/usr/bin/testparm : 삼바서버 설정파일(smb.conf)점검 유틸리티
/etc/xinetd.d/swat : 삼바서버의 웹관리를 위한 xinetd환경의 삼바설정파일
/usr/sbin/swat : 삼바서버 웹관리툴
/usr/bin/system-config-samba : X환경에서의 삼바설정 유틸리티
/var/log/samba/ : 삼바로그 저장 디렉토리
/etc/samba/smbusers : 리눅스ID와 삼바ID가 다를 경우에 이를 매칭하기 위한 매칭 테이블파일

* 삼바서비스 데몬
- 삼바데몬 시작
# /etc/init.d/smb start
# /usr/sbin/smbd -D
# /usr/sbin/nmbd -D

* 삼바 설정파일 smb.conf 다루기
/etc/samba/smb.conf 파일의 설정에는 다음과 같이 기본적으로 세부분으로 나뉘어져 있습니다.
  1. 글로벌 설정: 이 설정은 삼바서버가 공유하는 자원들에 공통적으로 적용할 기본값을 설정하는 곳이다.
                  이 글로벌설정은 [global]이라는 선언으로 시작하는 부분이다.
  2. 자동홈디렉토리 : 리눅스 사용자들의 홈디렉토리를 로그인홈으로 사용하기 위한 설정으로서 [homes]로 시작하는 부분의 설정이다.
  3. 프린터설정 : 네트워크 공유프린트에 대한 설정부분으로서 [printers]로 시작하는 부분의 설정이다.
- unix charset = cp949
  dos charset = cp949
  display charset = cp949
  리눅스(유닉스) 문자셋, 도스문자셋, 그리고 디스플레이 문자셋을 각각 설정한다.
- workgroup = superuser
  workgroup옵션에는 NT도메인명 또는 워크그룹명을 지정하면 된다.
  작업그룹명이므로 윈도우에서 Workgroup으로 사용하는 이름을 입력한다.
- server string = SUPERUSER File Server
  삼바서버의 이름쯤으오 생각하면 된다.
- hosts allow = 192.168.1. 192.168.2. 127.
  이 옵션은 삼바서버의 보안을 위하여 매우 중요한 옵션이다.
  이 옵션은 삼바서버로의 접근을 허용하기 위한 설정이다.
- load printers = yes
  자동프린트 목록을 사용하기 위한 값으로 yes를 주면 된다.
  네트워크 프린터를 삼바서버에서 관리하도록 하려면 반드시 yes로 설정한다.
- printcap name = /etc/printcap
  printcap파일의 위치가 다른 곳에 있다면 그곳을 지정한다.
- printing = bsd
  사용하는 프린터가 표준이 아니라면 주석처리를 하는 것이 좋다.
  현재 지원되는 프린터시스템의 종류로는 bsd, sysv, plp, lprng, aix, hpux, qnx 등이 있다.
- guest account =pcguest
  삼바서버의 guest사용자를 허용하고자 할 때에는 이 주석을 제거한다.
  이 옵션은 삼바서버에 손님권한으로 접속할 때 어떤 권한을 부여할 것인가를 설정한다.
  가능한 시스템에 특별한 권한이 없는 nobody와 같은 권한으로 설정한다.
- log file = /var/log/samba/log.%m
  이 설정은 삼바서버로 접속하는 개별 사용자들의 호스트정보를 %m 으로 받아서 개별 로그파일을 생성하도록 한다.
- log file = /var/log/samba/smbd.log
  접속한 호스트별로 로그파일을 사용하지 않는다면 하나의 로그파일을 사용할 수도 있다.
- max log size = 50
  로그파일의 용량크기를 KB단위로 제한하기 위한 옵션이다.
  제한하지 않으려면 0을 입력한다.
- security = share
  보안모드를 설정하는 것으로서 대부분의 삼바접속자들에게는 user레벨이 가장 알맞다.
  user레벨을 설정하면 삼바서버에 접속하는 사용자는 반드시 윈도우에서 사용하는 로그인ID와 동일해야 한다.
  만약 위의 설정과 같이 share레벨은 공유디렉토리등에 설정하는 것으로서 ID와 패스워드의 인증엇이 접속하는 것을 허용하는 레벨이다.
  또한 server레벨은 별도의 인증서버에서 ID와 패스워드인증을 받도록하는 레벨이다.
  가능하면 삼바서버보안을 위하여 user레벨을 사용하는 것이 좋다.
- password server = <NT-Server-Name>
  위의 security 옵션값이 server로 설정되었을 때에만 설정할 수 있는 옵션으로서 인증서버로 사용할 서버를 지정하는 옵션이다.
- password level = 8
  패스워드 문자로 대소문자를 조합하여 사용할 문자의 개수를 지정한 옵션이다.
- username level = 8
  삼바사용자명을 대소문자 조합하여 사용할 문자의 개수를 지정한 옵션이다.
- encrypt passwords = yes
  패스워드를 암호화하여 사용하려면 "encrypt passwords" 옵션값을 yes로 설정한다.
- smb passwd file = /etc/samba/smbpasswd
  이 옵션은 삼바사용자들의 암호파일의 위치를 지정한 것이다.
- unix password sync = Yes
  passwd program = /usr/bin/passwd %u
  passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authenticateion*tokens*updated*successfully*
  삼바사용자가 원격지에서 삼바패스워드를 변경할 수 있도록 하기위한 설정이다.
  이 설정을 사용하여 원격에서 패스워드를 변경하도록 허용하려면 앞의 encrypt passwords옵션값에 yes라고 해야하고 smb passwd file옵션에 반드시 삼바사용자패스워드파일의 경로를 지정한다.
- username map = /etc/samba/smbusers
  대부분 삼바에서 사용하는 ID와 리눅스계정ID는 동일하게 사용한다.
  만약 삼바사용자명과 리눅스 계정사용자명을 다르게 사용할 경우에 이를 매칭할 수 있도록 하기 위한 옵션이다.
  매칭테이블 파일을 /etc/samba/smbusers 파일로 사용하는 설정이다.
- include = /etc/samba/smb.conf.%m
  이 옵션은 삼바접속자의 플랫폼에 따라서 각기 다른 설정파일을 적용할 수 있도록 지원하기 위해 사용하는 옵션이다.
  %m 은 접속자 시스템의 NetBIOS이름으로 대체되어 접속한 사용자의 플랫폼종류에 따라서 각기 다른 삼바설정파일을 적용할 수 있다.
- socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
  삼바서비스 성능향상을 위한 옵션이다. speed.txt 파일을 참조하라.
- interfaces = 192.168.12.2/24 192.168.13.2/24
  삼바서버에서 두개 이상의 네트워크 인터페이스(NIC)를 사용하도록 지원하기 위한 옵션이다.
- remote browse sync = 192.168.3.25 92.168.5.255
  remote annouce = 192.168.1.255 192.168.2.44
  지역서브넷에서 삼바서버를 잘 인식하도록 하기 위하여 자기자신을 알리도록 한다.
- local master = no
  이 옵션은 특정 서브네트워크내에서 삼바서버가 로컬마스트브라우즈가 되도록 하는 옵션이다.
- os level = 33
  이 옵션은 마스터브라우즈 선거(master browser elections)에서 이 서버의 우선구너을 가질 수 있도록 허용한다.
- domain master = yes
  삼바서버가 Domain Master Browser가 되도록 한다.
  삼바가 Domain Master Browser가 되면 서브네트워크들로부터 브라우즈 목록을 수집하는 역할을 한다.
- domain logons = yes
  삼바서버를 윈도우95기반의 워크스테이션에 대한 도메인로그인서버 역할을 하도록 하려면 이 옵션을 사용하라.
- logon script = %m.bat
  각 플랫폼별 또는 각 사용자별로 로그온스크립트(login script)를 구분하여 사용할 수 있도록 한다.
- logon path = file://%25L/Profiles/%25U
  오직 윈도우95 또는 윈도우NT에서 로우빙프로파일(roving profile)을 어디에 저장해 둘것인가를 지정하는 설정이다.
- wins support = yes
  윈도우 인터넷네임서비스인 WINS를 지우너하기 위한 섹션이다.
- wins server = w.x.y.z
  WINS 서버를 지정한다.
- wins proxy = yes
  WINS프락시 : WINS기능이 없는 클라이언트 대신 질의에 답하도록 하기위한 옵션이다.
- dns proxy = no
  DNS의 nslookup을 사용하여 NetBIOS이름을 찾을 것인가 아닌가를 지정하는 옵션이다.
- preserve case = no
  short preserve case = no
  대소문자를 유지보존할 것인가를 지정하는 옵션이다.
- default case = lower
  DOS파일들의 기본 문자는 대문자로 인식한다.
  만약 lower로 설정하면 소문자로 인식한다.
- case sensitive = no
  대소문자의 구분을 할것인가 말것인가를 지정하는 옵션이다.
- [homes]
  comment = Home Directories
  browseable = no
  writable = yes
  사용자들의 홈디렉토리서버스에서 사용하는 기본적인 설정값이다.
- [netlogon]
  comment = Network Logon Service
  path = /home/netlogon
  guest ok = yes
  writable = no
  share modes = no
  도메인로그온 기능을 사용하기 위한 netlogin을 위한 설정이다.
- [Profiles]
  path = /home/profiles
  browseable = no
  guest ok = yes
  로우빙프로파일(roving profile)을 지정하려면 주석을 제거한다.
- [printers]
  comment = All Printers
  path = /var/spool/samba
  browseable = no
  guest ok = no
  writable = no
  printable = yes
  BSD타이의 프린트시스템을 가지고 있다면 개별 설정없이 바로 사용할 수 있다.
- [tmp]
  comment = Temporary file space
  path = /tmp
  read only = no
  public = yes
  삼바사용자들의 임시공유 디렉토리로 사용하기 위한 설정이다.
- [public]
  comment = Public Stuff
  path = /home/samba/public
  public = yes
  read only = no
  write list = @staff
  삼바사용자라면 누구나 접근이 가능한 공유디렉토로서 staff그룹에 등록된 사용자들을 제외한 일반사용잗ㄹ은 읽기전용으로만 사용할 수 있다.

* 삼바클라이언트 유틸리티 smbclient
사용형식 : smbclient '\\서버\서비스' [-U 삼바사용자] [패스워드] [옵션]
# smbclient -L localhost  -> 리눅스서버에 설치되어 있는 삼바서버의 접속 및 운용상태 확인
# smbclient '\\files\papa' -U papa -> 원격지의 file이라는 로스트로 papa라는 계정을 이용하여 삼바서버로 접속
  서버명으로 file이라는 호스트명을 사용하려면 /etc/samba/lmhosts파일에 호스트정보가 등록되어 있어야 한다.
# smbclient -L 192.168.0.100
# smbclient -U papa -L 192.168.0.100

* 삼바 원격마운트를 위한 smbmount와 smbumount
사용형식 : smbmount //호스트명(또는 IP)/서비스 /마운트포인트
           smbumount /마운트포인트
# smbmount //192.168.0.100 /tmp/share
# smbumount /tmp/share

* 삼바 사용자 관리
- 새로운 삼바사용자 생성과 패스워드 설정하기
  삼바서버에서 사용자를 드록하기 위해서는 smbpasswd라는 명령어를 사용한다.
  삼바사용자의 삼바패스워드 또는 smbpasswd라는 명령어를 사용한다.
  삼바사용자를 새로 생성하기 전에 리눅스 계정생성을 먼저해야 한다.
# useradd dhan
# passwd dhan
# smbpasswd -a dhan
- 삼바사용자 패스워드 변경하기
  root 사용자일 경우 : smbpasswd [options] [username]
  root 사용자가 아닌 경우 : smbpasswd [options]
- 삼바사용자 사용하지 못하도록 사용중지 설정하기
# smbpasswd -d dhan -> 사용 중지
# smbpasswd -e dhan -> 사용 재개
- 삼바사용자 삭제하기
# smbpasswd -x dhan

* 삼바서버의 로그인정보 확인을 위한 smbstatus
사용형식 : smbstatus [-P] [-b] [-d] [-L] [-p] [-S] [-s <설정파일>] [-u 삼바계정]
# smbstatus  -> 현재 삼바서버로 로그인되어 있는 사용자들을 확인
# smbstatus -b  -> 삼바서버로 로그인한 삼바사용자염을 간단하게 확인
# smbstatus -u papa -> 특정 계정의 삼바사용자의 로그인 정보만을 확인

* 삼바서버의 NetBIOS 호스트 파일 lmhosts
이 파일의 주된 목적은 삼바에서 사용할 호스트명정보(주로 IP주소)를 쉽게 찾을 수 있돍 하기위한 것이다.
이 파일에 등록된 호스트정보를 이용하여 smbclient와 같은 삼바유틸리티에서 등록된 호스트의 삼바서버로 접속할 때에 호스트명만으로 사용할 수 있다.

* 삼바설정파일 점검하기 위한 testparm
사용형식 : testparm [-s] [-h] [-x] [-L <서버명>] 설정파일명 [호스트 IP]
# testparm
# testparm -l 192.168.0.100

* 삼바서버를 이용한 웹폴더 구축
- 웹폴더 사용을 위한 삼바서버 설정
# useradd dhan
# passwd dhan
Changing password for user dhan.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
# smbpasswd -a dhan
New SMB password:
Retype new password:
Added user dhan.
# vi /etc/samba/smb.conf
[dhan]
comment dhan web folder
path = /home/dhan
valid users = dhan
read only = no
writable = yes
public = no
browseable = yes
printable = no
crate mask = 0750
# /etc/init.d/smb restart
- 개인 PC의 탐색기에서 운격삼바디스크 사용하기
- 웹브라우즈에서 웹폴더 형식으로 사용하기

***********************************************************
* DHCP 서버
***********************************************************

* 설치
- dhcp서버 rpm으로 설치 및 dhcp서비스 파일들
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/dhcp-3.0pl1-23.i386.rpm  DHCP서버와 중계 에이전트
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/dhcp-devel-3.0pl1-23.i386.rpm DHCP서버와 접속시키기 위한 개발용 헤더 파일들과 라이브러리들
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/dhclient-3.0pl1-23.i386.rpm  DHCP서버와 접속시키기 위한 클라이언트
# rpm -Uvh dhcp-3.0pl1-23.i386.rpm
# rpm -Uvh dhcp-devel-3.0pl1-23.i386.rpm
# rpm -Uvh dhclient-3.0pl1-23.i386.rpm
- dhcp 서버 소스로 컴파일하여 설치하기
1. dhcp 소스가져오기
# wget ftp://ftp.isc.org/isc/dcp/dhcp-3.0.1.tar.gz
2. dhcp 소스 압축풀기
# tar xvfz dhcp-3.0.1.tar.gz
3. configure하기
# ./configure
4. 컴파일하기(make)
# make
5. 컴파일된 파일 설치하기
# make install

* 환경파일들
- DHCP 데몬파일
  dhcp 서버데몬 : /usr/sbin/dhcpd
  dhcp 릴레이에이전트 데몬 : /usr/sbin/dhcrelay
- DHCP 메인설정파일
  dhcp서버의 설정파일 : /etc/dhcpd.conf
- DHCP IP할당로그파일
  dhcp IP할당ㄹ그파일 : /var/lib/dhcp/dhcpd.leases
- DHCP서버 실행과 종료 및 재시작
# /etc/init.d/dhcpd start
# /etc/init.d/dhcpd restart
# /etc/init.d/dhcpd stop

* DHCP 서버 설정파일 dhcpd.conf
이 파일은 /usr/share/doc/dhcp-3.0pl1/ 디렉토리에 존재하는 dhcpd.conf.sample 파일을
/etc/dhcpd.conf 파일로 복사하여 편집한다.
subnet 192.168.0.0 netmask 255.255.255.0 {
  -> 192.168.0.0/255.255.255.0 네트워크의 범위에 해당하는 IP주소 가운데 아래 reage항목에 나오는 바와 같이 192.168.0.128부터 192.168.0.255까지의 IP주소를 DHCP클라이언트 컴퓨터에 유동사설IP주소를 할당하기 위한 설정이다.

# -- default gateway
  option routers 192.168.0.1;
  -> DHCP클라이언트들이 사용할 기본게이트웨이이다.

  options subnet-mask 255.255.255.0;
  -> IP주소를 할당받은 DHCP클라이언트가 사용할 Subnet Mask를 의미한다.

  option nis-domain "domain.org";
  option domain-name "domain.org";
  -> DHCP 서버의 자체 도메인이름을 의미한다.

  option domain-name-servers 192.168.1.1;
  -> IP주소를 할당받은 DHCP클라이언트가 사용할 DNS서버를 설정한다.

  option time-offset -18000;
# option ntp-servers 19.168.1.1;
# option netbios-name-servers 192.168.1.1;
# - Select point-to-point node(default is hybrid). Don't change this unless you understand NetBIOS very well
# option netios-node-type 2;

  range dynamic-bootp 192.168.0.128 192.168.0.254;
  -> DHCP클라이언트에게 할당할 수 있는 IP주소의 범위이다.

  default-lease-time 21600;
  -> 할당시간이 설정되어 있지 않은 DHCP클라이언트가 할당받은 IP주소를 가지고 있을 수 있는 시간을 의미한다.

  max-lease-time 43200;
  -> 할당된 IP주소를 DHCP클라이언트가 임대할 수 있는 최대 시간을 의미한다.

  # We want the nameserver to apperar at a fixed address
  host ns {
    -> DHCP서버를 이용하여 통신을 하는 많은 DHCP클라이언트들 가운데 특정 호스트에게만 항상 고정IP를 사용할 수 있도록 하기 위한 설정이다.

    next-server marvin.redhat.com;
    hardware ethernet 12:34:56:78:AB:CD;
    -> 고정IP주소를 할당할 DHCP클라이언트의 MAC주소를 설정한다.
    fixed-address 207.176.4.254;
    -> 위의 MAC주소를 가진 DHCP클라이언트에게 할당할 고정 IP주소
  }
}

* DHCP서버의 네트워크 설정
DHCP서버로 사용되기 위해서는 DHCP서버의 ethernet에 멀티캐스트가 가능하도록 설정되어 있어야 한다.

* DHCP서버를 사용하는 DHCP클라이언트 설정
- 리눅스에서 자동 IP할당 받기 위한 DHCP 클라이언트 설정
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
# /etc/init.d/network restart
- 윈도우에서 자동 IP할당받기 위한 DHCP클라이언트 설정

***********************************************************
* PROXY 서버
***********************************************************


***********************************************************
* MRTG 트랙픽서버
***********************************************************

* SNMP
# wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/net-snmp-5.0.6-17.i386.rpm
# rpm -Uvh net-snmp-5.0.6-17.i386.rpm
# /etc/init.d/snmpd start
SNMP패키지를 설치하면 /etc/snmp/snmpd.conf 라는 SNMP설정파일이 있다.
이 설정파일에서 SNMP커뮤니티네임(community name)과 시큐리티네임(security name)을 각각 설정한다.
com2sec notConfigUser default bible
group notConfigGroup v1 bible
group notConfigGroup vc bible

* MRTG 트랙픽서버 구축
- 필요한 프로그램들 설치하기
  perl
  zlib
  libpng
  freetype
  jpeg
  gd
  apache
- MRTG 설치
# wget ftp://ftp.ntua.gr/pub/net/monitoring/mrtg/mrtg-2.11.1.tar.gz
# tar xvf mrtg-2.11.1.tar.gz
# cd mrtg-2.11.1
# ./configure --with-gd=/usr/local/gd --wit-z=/usr/local/zlib --wit-png=/usr/local/libpng
# make
# make install
# cd /usr/local/mrtg
# mkdir conf
- MRTG설정파일 생성하기
# CFGMAKE --GLOBAL 'WorkDir: /home/mrtg/www/kebia_1' --global 'Options[_]: bits,growright' --output /home/mrtg/conf/bible.cfg bible@192.168.0.5
  WorkDir: 옵션은 MRTG의 실행결과 파일들을 저장할 위치를 지정
  Options에 설정한 부분은 그래프의 단위와 어느쪽으로 그릴 것인가를 지정
  /home/mrtg/conf/bible.cfg는 생성될 결과파일을 지정
  bible@192.168.0.5에서 192.168.0.5는 MRTG의 분석대상이며 bible은 대상서버에 설치된 snmp의 커뮤니티네임(community name)이다.
- cfg파일 분석
- MRTG 실행
# /usr/local/mrtg/bin/mrtg /home/mrtg/conf/kebia_1.cfg

<<Scrap url : http://gilgal.co.kr>>

2007/07/04 21:21 2007/07/04 21:21
이 글에는 트랙백을 보낼 수 없습니다

SSH 기타 세팅 및 scp, sftp 사용


SSH 기타 세팅 및 scp, sftp 사용에대해 알아보자

특정 사용자 및 그룹의 로그인 제한

]# man sshd
AllowGroups
            This keyword can be followed by a list of group name patterns, separated by spaces.  
            If specified, login is allowed only for users whose primary group or supplementary group
            list matches one of the patterns.  `*' and `'?  can be used as wildcards in the patterns.  
            Only group names are valid; a numerical group ID is not recognized.  
             By default, login is allowed for all groups.
            (지정된 그룹에 포함된 사용자만이 SSH 로그인을 할 수 있다.
             그룹명은 공백으로 구분하여 와일드 문자(*, ?)를 사용 할 수 있다.)

AllowUsers
            This keyword can be followed by a list of user name patterns, separated by spaces.  If specified,
            login is allowed only for users names that match one of the patterns.  `*' and `'?  can be
            used as wildcards in the patterns.  Only user names are valid; a numerical user ID is not
            recognized.  By default, login is allowed for all users.  If the pattern takes the form USER@HOST
            then USER and HOST are separately checked, restricting logins to particular users from particular
            hosts. (지정된 사용자만이 SSH 로그인을 할 수있다.. 사용법은 AllowGroups과 같다.)

DenyGroups
            This keyword can be followed by a list of group name patterns, separated by spaces.  Login is
            disallowed for users whose primary group or supplementary group list matches one of the
            patterns. `*' and `'?  can be used as wildcards in the patterns.  Only group names are valid; a
            numerical group ID is not recognized. By default, login is allowed for all groups.
            (지정된 그룹에 대한 로그인을 거부한다.)

DenyUsers
            This keyword can be followed by a list of user name patterns, separated by spaces.  Login is
            disallowed for user names that match one of the patterns.  `*' and `'?  can be used as wildcards
            in the patterns.  Only user names are valid; a numerical user ID is not recognized.  By default,
            login is allowed for all users. If the pattern takes the form USER@HOST then USER and HOST are
            separately checked, restricting logins to particular users from particular hosts.
            (지정된 사용자에 대한 로그인을 거부한다.)

6. 원격지 호스트로의 로그인


[in4mania@ilinuxbay in4mania]$ ssh in4mania@192.168.1.154
in4mania@192.168.1.154's password:
Last login: Sun Sep  7 18:36:21 2003 from ns.ilinuxbay.net

7. Allowusers, Denyusers 옵션을 적용한 원격지 로그인 실습
/etc/ssh/sshd_config 파일에 Allowusers와 Denyusers 두개의 옵션을 이용해 각각의 유저를 추가 한 후
원격지에서 ssh 서버에 접근이 가능한지 테스트 해본다.

8. scp 사용법
scp는 자신의 컴퓨터에서 원격의 컴퓨터로 또는 원격의 컴퓨터에서 자신의 컴퓨터로 간단하게
파일을 전송할 수 있는 프로그램이다.
다음은 현재 디렉토리에 있는 sshd.txt 라는 파일을 IP가 192.168.1.154 인 컴퓨터에 root 라는 계정으로
접속하여 /usr/local/src/ 디렉토리 밑에 복사해 넣는 명령이다.


[root@in4nux root]# scp ./sshd.txt root@192.168.1.154:/usr/local/src/

다음은 IP가 192.168.1.154 인 컴퓨터에 root 라는 계정으로 접속하여 /usr/local/src/ 디렉토리 밑에 있는
sshd.txt 라는 이름의 파일을 자신의 컴퓨터로 현재 위치한 디렉토리에 복사하는 명령이다.


[root@in4nux root]# scp root@192.168.1.154:/usr/local/src/sshd.txt ./

9. sftp 사용법

sftp는 대화식의 파일전송 프로그램으로 ftp와 비슷하며, 모든 작동은 암호화된 ssh 전송상에서 실행이 된다.


[root@in4nux ssh]# sftp in4mania@192.168.1.152
Connecting to 192.168.1.152...
in4mania@192.168.1.152's password:
sftp>

10. 윈도우용 ssh
http://www.ssh.com => download => Evaluation Versions => SSH Secure Shell for Workstations

2006/11/14 13:48 2006/11/14 13:48
이 글에는 트랙백을 보낼 수 없습니다
Linux/SHELL  2006/10/08 17:17
3-4. path(find 명령어 다음의 path)
  .
현재 디렉토리(기본값이므로 생략해도 됨)
  `pwd`
현재 디렉토리와 결합(?) `은 ~문자가 있는 자판
  $(pwd)
위의 `pwd`와 같거나 비슷함
  /
최상위 루트 디렉토리에서 하위 모든 디렉토리
  /home
특정 /home 디렉토리에서 하위 모든 디렉토리
  /{usr,home/{aaa,san2},var}
/usr, /usr/home/aaa /usr/home/san2 /var

3-5. 표현식-연산자

  \( 표현식 \)
'표현식'을 우선적으로 먼저 수행
(와 )앞에 \를 넣어야 하며, '표현식'과 공백을 각각 둔다.
\( A + B \) * \( C + D \) 와 같이 \(, \)안을 우선적으로 수행
  ! 표현식 , -not 표현식
'표현식'을 부정
  표현식1 -a 표현식2, 표현식1 -and 표현식2
표현식1과 표현식2의 AND 연산
  표현식1 -o 표현식2, 표현식1 -or 표현식2
표현식1과 표현식2의 OR 연산


3. 예제

3-1. 다른 명령어와 결합 형태(ls,xargs)

찾는 것 그 차체 만으로 만족(?) 할 수 도 있지만 그 결과에 대해서
어떤 행동(Actions)을 취할 필요가 있습니다.

  형태1. -exec 이용시

# find ..... -exec COMMAND {} \;

  형태2. xargs 명령어로 표준 입력받아 COMMAND 수행

# find ..... | xargs COMMAND

  형태3. ls 명령어로 최종 결과 출력

# ls -l `find .....[COMMAND]`
또는
# find .... ls
(ls는 ls -dils와 같음)

  xargs
xargs rpm 정보보기
# rpm -qi `rpm -qf $(which xargs)`
또는
# rpm -qf `which xargs` | xargs rpm -qi

즉, find 결과에 대해서,

형태1은 -exec를 사용하여 그 인자를 {}로 사용하고,

형태2는 xargs 명령어로 find에서 넘어온 결과(표준출력)에 대해서 COMMAND를 실행하고,

형태3은 오른쪽의 find 결과물에 대해서 ls 명령어를 실행합니다.
간혹 '/bin/ls Argument list too long'이라는 에러를 낸 경우도 있습니다.
이는 검색조건에 너무 많은 와일드카드 문자로 찾을 경우에 그렇습니다.
이를 테면 /*/*/*.*/.*,

`은 ~문자가 있는 자판(역인용부호).

ls -l 명령어를 사용할 경우, 찾는 결과가 없다면 모두 출력됩니다.
(ls -l와 같기 때문에)
ls 명령어와 마찬가지로 다른 명령어(chmod, chmod)를 결합하여 사용할 경우 그 찾는
결과가 없다면 명령어에 대한 에러를 내겠죠.
(chmod 'null')과 같은 예..........

# find /{home,usr/{src,local/src}} -nouser -o -nogroup -exec ls -l {} \; -print | more
# find /{home,usr/{src,local/src}} -nouser -o -nogroup -print | xargs ls -l | more

위의 2개의 명령어 대해서 직접 테스트 해보세요...

전자의 경우, 아마 아무것도 출력되지 않을 겁니다.

# find /{home,usr/{src,local/src}} \( -nouser -o -nogroup \) -exec ls -l {} \; -print | more

위와 같이 해야 맞겠죠...(우선순위)

후자의 경우도 마찬가지로 다음과 같이 우선순위를 정해놓아야 겠지요..
아마 원하는 출력이 이 경우일 것 같군요.

# find /{home,usr/{src,local/src}} \( -nouser -o -nogroup \) -print | xargs ls -l | more


3-2. 퍼미션 관련 예제

othesrs에 쓰기(w:2) 권한이 있는 모든(-기호를 붙임) 파일 리스트를 찾을려면?

# find `pwd` -perm -2 -print | xargs ls -l

여기에서 2는
퍼미션이 -------w- 와 일치하는 파일이며 -의 의미는 rwx-중 하나.

왜 2인가요?
만약 퍼미션이 755 이라면,

  700 : rwx------ : user
  50 : ---r-x--- : group
    5 : ------r-x : others
  ------------------------
  755 : rwxr-xr-x : others는 읽기와 실행 권한

따라서 others의 권한은 8진수로 5(r+x)이다.

그렇다면, others가 쓰기(w:2) 권한은 당연히 -------w-

그룹이나 others에게 쓰기 권한이 있는 파일일 경우

-perm -20 -o -perm -2

그룹과 others에게 모두 쓰기 권한이 있는 파일일 경우

-perm -22

[others에게 w 권한이 있는 파일에 w 권한 없애기]

방법1)
  1. others에게 w 권한이 있는 파일 리스트 출력

# find `pwd` -perm -2 -print | xargs ls -l | more
(만약 매치되는 리스트가 없다면 전부 출력함)

  2. others에게 w 권한을 없애기

# find `pwd` -perm -2 -print | xargs chmod o-w
(만약 매치되는 리스트가 없다면 chmod에 에러를 냄)

방법2) 방법1)의 과정을 한꺼번에 할 경우

  # find `pwd` -perm -2 -exec chmod o-w {} \; -print | xargs ls -l
  또는
  # ls -l `find $(pwd) -perm -2 -print | xargs chmod o-rwx` | more

  이 경우는 퍼미션이 조정된 결과를 출력함.


3-3. 유저와 관련된 예제

UID와 GID에 대한 유저가 없는 파일을 root.root로 바꾸어 보죠.

1) 먼저 리스트를 출력해 보자.(확인해야하니깐)

  # find . \( -nouser -o -nogroup \) -print | xargs ls -l | more

2) 확인했으면, chown root.root 명령을 내리자.

  # find . \( -nouser -o -nogroup \) -print | xargs chown root.root | more
  또는
  # find . \( -nouser -o -nogroup \) -exec chown root.root {} \; -print | xargs ls -l
  (chown root.root 의 결과를 ls -l)


3-4. 유용한 팁

*주의) ***********************************************
  -a'xxxx'
'xxxx'에 대한 Access(접근), 읽기
  -c'xxxx'
'xxxx'에 대한 Changes(변경), 마지막으로 Access한 경우에도 변경됨
  -m'xxxx'
'xxxx'에 대한 Modify(수정), 파일내용 자체 수정한 경우
*****************************************************

  - 최근 하루(1) 동안(-)에 변경(change)된 파일을 찾을려면(-ctime)?

# find / -ctime -1 -a -type f | xargs ls -l | more

  - 오래된 파일을 찾을려면(30일 이상 수정(modify))되지 않은)?

# find / -mtime +30 -print | more

  - 최근 30일(30) 안에(-) 접근(access)하지 않은 파일과 디렉토리를 리스트로 만들려면(-atime)?

# find / ! \( -atime -30 -a \( -type d -o -type f \) \) | xargs ls -l > not_access.list

  - 자신의 홈디렉토리에서 만 검색하려면?

# find $HOM ...
또는
# find ~root ...

  - 서브 디렉토리로 내려가지 않고 현재 디렉토리에서만 검색하려면?

# find . -prune ...

  - 특정 유저(foobar) 소유의 파일을 찾을려면?

# find / -user foobar -print | more

  - 퍼미션이 777인 파일을 찾을려면 ?

# find / -perm 777 -print | xargs ls -l | more

  - others에게 쓰기 권한이 있는 파일을 찾을려면?

# find / -perm -2 -print | xargs ls -l | more

  - others에게 쓰기 권한이 있는 파일을 찾아 쓰기 권한을 없애려면?

# find / -perm -2 -print | xargs chmod o-w
또는
# find / -perm -2 -exec chmod o-w {} \; -print | xargs ls -l | more

  - 유저이름과 그룹이름이 없는 파일을 찾을려면?

# find / \( -nouser -o -nogroup \) -print | more

  - 빈 파일을 찾을려면?

# find / -empty -print | more
또는
# find / -size 0 -print | more

  - 파일크기가 100M 이상된 파일을 찾을려면?

# find / -size +102400k -print | xargs ls -hl

  - *.bak 파일을 찾아 지울려면?

# find / -name "*.bak" -exec rm -rf {} \;

  - *.bak 파일을 찾아 특정 디렉토리로 옮길려면?

# mv `find . -name "*.bak"` /home/bak/

  - 디렉토리 만 찾을려면?

# find . -type d ...

  - root권한으로 실행되는 파일을 찾을려면?

# find / \( -user root -a -perm +4000 \) -print | xargs ls -l | more

  - 다른 파일시스템을 검색하지 않을려면?

# find / -xdev ...

  - 파일이름에 공백이 들어간 파일을 찾을려면?

# find / -name "* *" -print

  - 숨겨진(hidden) 파일을 찾을려면?

# find / -name ".*" -print | more

  - 같은 이름을 가진 디렉토리를 찾을려면?

# find / -type d -print | awk -F/ '{printf("%s\t%s\n",$NF,$0);}' | sort| more
*주)'O'Reilly Unix Power Tools' 참고

  - 잘못된 링크를 찾을려면?

# find . -type l -print | perl -nle '-e || print' | xargs ls -l
*주)'O'Reilly Unix Power Tools' 참고
2006/10/08 17:17 2006/10/08 17:17
이 글에는 트랙백을 보낼 수 없습니다
Linux/SHELL  2006/09/29 15:06

2 부 쉘 프로그래밍

1장. 쉘 내장 명령들
2장. 정규식과 유틸리티들
3장. 쉘 프로그래밍 문법

1장.       쉘 내장 명령들

학습목표 : 쉘 내장 명령들을 이해하고 활용한다

1. 쉘 내장 명령들


1) export Command

Command: export [ name [ =value ] ] ...
Function: 지정된 names을 이후에 실행될 명령어의 환경에 자동적으로 넣기위해 사용한다.
Examples:

$ AA=100 <- 현재 쉘에서 변수 AA에 100을 할당한다
$ echo $AA <- 현재 쉘에서 변수 AA의 값을 출력한다
100
$ ksh <- 자식 쉘을 생성한다
$ echo $AA
    <- 변수 AA의 값을 출력한다. 아무값도 출력하지 않는다

$ exit <- 다시 현재 쉘로 돌아 온다
$ export AA <- AA 변수를 전역 변수로 설정한다
$ ksh <- 자식 쉘을 생성한다
$ echo $AA <- 변수 AA의 값을 출력한다
100 <- 변수 AA의 값을 출력한다

$

2) readonly Command

Command: readonly [ name [ =value ] ] ...
Function: 지정하는 변수를 읽기 전용 변수로 설정하는 명령이다. 그 변수에 값을 배정하려고 시도한다면 쉘은 에러메세지를 출력한다. readonly변수는 사용자가 변수의 값을 너무 많이 쓰지 않도록 하는데 유용하다. 또한 쉘 프로그램을 사용하는 사람들이 특수변수(예를 들면 HOME 디렉토리나 PATH)의 값을 바꿀수 없도록 하는데도 유용하며 판독 전용의 성질이 서브쉘로 전달된다. 인수가 없는 readonly는 판독 전용 변수들의 리스트를 출력한다.

Examples:

$ DB=/usr/dgk/database
$ readonly DB
$ DB=foo
DB: is read-only
$ echo $DB
/usr/dgk/database
$


3) unset Command

Command: unset [ -f ] name ...
Function: 각각 name에 대해서 해당하는 변수 또는 함수를 제거한다. 변수 PATH, PS1, PS2, MAILCHECK, IFS와 같은 환경변수에 대해 unset을 실행할 수 없다.

Examples:
$ a=10
$ set
HOME=/home/kys
:
:
TERM=vt100
PS1=$
PS2=>
:
a=10
$ unset a
$


4) set Command

command: set -o korn_shell_mode
Function: 사용자 환경을 설정하는 명령이다
Options: korn_shell_mode

allexport   선언되는 모든 변수는 자동적으로 export 된다
bgnice      우선권이 낮은 상태에서 백그라운드 작업 실행
errexit     에러가 발생하면 exit가 실행된다
ignoreoof   쉘을 종료하기 위해 반드시 exit명령을 실행한다
markdirs    디렉토리명들은 / 로 표시된다
noclobber   출력방향의 재지정시 기존 파일의 존재 여부를 체크하고난 뒤 실행하도록 지정
noexec      명령어를 읽어 들이지만 실행 하지는 않는다
nounset     변수값 치환시에 설정되어 있지 않은 변수는 오류로 취급한다
trackall    실행하는 명령어들을 alias table에 등록한다


5) eval Command

Command: eval [ arg ... ]
Function: 쉘이 명령어 라인을 한번 해석한 후 대치와 확장을 끝내고 나서 명령어 라인을 한번 더 해석하도록할 때 사용한다.

Examples:
$ x = 'abc def'
$ y = '$x'
$ echo $y
$x
$ eval echo $y
abc def


6) exec Command

Command: exec [ command ] [ arg ... ]
Function: exec명령을 실행하면, 그 쉘이 지시된 인수들을 가진 지정된 명령을 실행한다. 보통 명령을 실행하면 쉘은 새로운 프로세스번호를 할당받아서 실행하지만 exec는 실행시키는 쉘의 프로세스번호를 지정한 명령에게 넘겨주므로 실행이 종료되면 명령어를 실행시켰던 쉘로 돌아가지 않는다.

Examples:
$ exec /usr/lbin/ksh <-- Replace current process with ksh
$
$ exec < datafile <-- Reassign stndard input to datafile $ exec 2> /tmp/errlog
<-- 표준에러출력전환 : 모든 에러출력은 /tmp/errlog로
$ exec ls <-- ls를 수행하고 나면 logout


7) trap Command

Command: trap [ action ] [ condition ... ]
Function: 이 명령은 셀이 signals의 신호 중 하나를 수신할 때마다 명령을 실행하도록 한다. 인수가 없는 trap은 현재 설정되어 있는 trap 의 리스트를 출력한다.

trap "" signals
signals에 있는 신호들을 수신하였을 때 그 신호는 무시된다.

trap signals
signals에 리스트 된 각 신호들의 처리과정이 디폴트 동작으로 고정된다.

Examples:
$ trap <-- 모든 trap과 action 을 출력한다
$ trap '$HOME/.logout' EXIT
<- 쉘이 EXIT 신호를 수신하여 끝나게 되면 $HOME 디렉토리에

$HOME 있는 .logout을 실행한다.
$ trap "echo hangup >> $ERRFILE; exit " 2
<- interrupt 신호가 수신되면 hangup를 지정한 파일에 출력하고 현행 프로세스를 종료한다

$ trap "rm $TMPFILE; exit " 1 2 15
$ trap "" 2
$ trap INT QUIT TERM EXIT
-> INT QUIT TERM EXIT 의 trap을 unset한다. 각 신호의 디폴트 action으로 재설정한다
$ trap "echo $count line processed >> $LOGFILE; exit" 1 2 15
-> 1, 2, 15 신호중의 하나를 수신 받았을 때 count값을 $LOGFILE가 지정하는 파일로 출력

trap을 위해 사용되는 신호번호

신호              내 용

1     HUP   hangup
2     INT   interrupt
3     QUIT   quit
4     ILL   불법 명령어
5     TRAP   추적 트랩
6     IOT   IOT명령
7     EMT   EMT명령
8     FPE   부동소숫점 예외
9     KILL   종료
10    BUS   버스 에러
11    SEGV   세그먼테이션 위반
12    SYS   시스템 호출에 대한 불량 인수
13    PIPE   기록한것이 없는 파이프상에서 판독
14    ALRM   경보 클락
15    TERM   종료(kill)로부터 소프트웨어 종료신호
16    USR1   사용자 정의 신호1
17    USR2   사용자 정의 신호2
18    CLD   서브 쉘삭제

8) echo Command

Command: echo [ arg ... ]
Function: 나열되는 아규먼트의 값들을 표준 출력으로 출력하는 명령이다. 이스케이프 문자를 사용하여 출력 특수 문자를 지정할 수 있다.

이스케이프 문자:

\a Bell 문자
\b Backspace
\c 종료개행 없는 라인
\f 폼피드(formfeed)
\n Newline
\r Return
\t Tab
\\ Back-slash
\nnn ACSII값이 nnn인 문자
(nnn은 0으로부터 시작하는 0-3자리의 8진수임)

Examples:
$ echo "test escape character \a\a\a\t hear me??\nThanks\n"
test escape character hear me?
Thanks
$

9) print Command

Command: print [ -options [ n ] ] [ arg ... ]
Function: 아규먼트 리스트를 표준 출력응로 출력하는 명령이다.

Options:
-     다음에 오는 모든 옵션들은 무시
-n    라인의 끝에 개행문자를 두지 않음
-r    echo의 이스케이프 시퀀스( \ ) 무시
-R    -n 옵션외에 모든 옵션들을 무시
-s    기록( history )화일에 args를 저장
-un   화일 디스크립터 n에 출력 기록(디폴트 1)
-p    |& 으로 생성된 프로세스에 출력을 기록

Ecamples:
$ print -r 'hi\\\\there'
hi\\\\there
$
$ print 'hi\\\\there'
hi\\there
$
$ print -s "vi echo.c"
vi echo.c
$

10) read command

Command: read -options var1?prompt var2 . . .
Function: 쉘이 표준입력으로 부터 라인을 읽어 들이도록하는 명령이다. 라인에서 계속적으로 공백문자로 구분된 단어들을 변수 vars에 배정하고 라인의 단어보다 변수의 수가 적으면 마지막 변수에 초과한 단어들을 전부 저장한다.

?prompt가 지정되어 있으면 지정한 prompt가 데이타를 읽어 들이기위한 프롬트로 화면이 출력된다. 리스트된 변수명이 없는 경우 읽어들인 데이타는 쉘 내장 변수인 REPLY에 저장된다.

Options:

-r    라인의 연속으로 끝에 붙어있는 \ 을 처리하지 않는다
-s    기록화일(history)에 입력라인을 기록
-un   화일디스크립터 n으로부터 데이타를 읽는다(디폴트 0)
-p    |& 으로 생성된 프로세스 출력으로 읽어들인다.

Examples:
$ read hours mins
10 19
$ echo "$hours:$mins"
10:19
$ read file?"Which file: "
Which file: edit.c
$ echo $file
edit.c
$
$ read -r raw
abc\ndef\t
$ echo $raw
abc\ndef\t
$ read
this is a test
$
$ echo $REPLY
this is a test
$ cat read1
while read -r
do print -r "$REPLY"
done <<!
My Home directory is $HOME
!
$


11) ulimit Command

Command: ulimit [ -acdfmst ] [ n ]
Functions: 쉘에서 실행하는 프로세스에 최대 한계를 정하도록 한다.

Options:
-a    모든 한계를 디스플레이한다.
-c    코어 덤프를 n blocks으로 제한한다.
-d    데이타의 크기를 n Kbytes로 제한한다.
-f    차일드 프로세스에 의해 기록될수 있는 파일의 크기를 n blocks으로 제한한다.
-m    프로세스나 차일드 프로세스가 사용할수 있는 물리적인 메모리 크기를 n Kbytes로 제한한다.
-s    스택영역의 크기를 n Kbytes 로 제한한다.
-t    각 프로세스가 사용할수 있는 시간을 n seconds로 제한한다.

Examples:
$ ulimit -f 1000
$ ulimit -f
1000


12) umask Command

Command: umask [ mask ]
Function: 사용자 화일의 생성시 permission mode를 지정한다. 디렉토리 생성시에는 777(rwxrwxrwx) 에 대한 보수값& mask 을, 화일생성시에는 666(rw-rw-rw-)에 대한 보수값& mask을 permission mode 값으로 설정한다. mask값을 설정하지 않으면 현재 설정된 umask값을 출력한다.

예제:

$ umask 022 # 디렉토리인 경우 755모드로 생성 , 화일인 경우 644모드로 생성
$ umask 055 # 디렉토리인 경우 722모드로 생성 . 화일인 경우 622모드로 생성
$ umask
0055
$


15) '.' , ':' Command

Command: . filename
Function: 지정하는 filename 파일로부터 쉘 스크립트를 읽어서 현행 쉘에서 실행시킨다.

Command: :
Function: 필수적인 널 명령이다. : 명령은 명령이 나타내는 요구를 만족시키기 위해 자주 사용된다.

Examples:
if who | grep dgk > /dev/null
then
:
else
echo "dgk's not logged in"
fi


16) let Command

Command: let arg ...
Function: let명령은 정수 연산 수식을 평가한다. 수식은 상수, 쉘변수, 그리고 연산자들을 포함할 수 있다. let은 let "expression" 또는 (( expression )) 의 형식으로 사용할 수 있다. 마지막 수식이 0값이 아니면 참, 0값이면 거짓이다. 수식안에 공백이 있으면 인용부호로 묶어서 사용한다. ( )를 이용하여 연산자의 우선 실행에 사용한다.

Examples:
$ cat let1
let x=x+1 y=x%4+2
integer n=${1-20}
while (( (n=n-1) >= 0 )) && read -r line
do
print -r - "$line"
done
$ cat let2
let y=22*33
let "z = y * y / (y -1)" "x = y + 1"
if let "y % 12"
then echo "y mod 12 != 0"
else echo "y mod 12 == 0"
fi

"); // :badtag -->
2006/09/29 15:06 2006/09/29 15:06
이 글에는 트랙백을 보낼 수 없습니다
Linux/SHELL  2006/09/08 23:25
grep 계열 명령어

grep 명령어

grep의 의미

grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.
fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정         규표현식의 메타문자도 일반 문자로 취급한다.

3.1.2 grep의 동작 방법

grep에서 사용하는 정규표현식 메타문자
메타문자
기    능
사용 예
사용 예 설명
^
행의 시작 지시자
'^love'
love로 시작하는 모든 행과 대응
$
행의 끝 지시자
'love$'
love로 끝나는 모든 행과 대응
.
하나의 문자와 대응
'l..e'
l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응
*
선행문자와 같은 문자의 0개 혹은 임의개수와 대응
' *love'
0개 혹은 임의 개수의 공백 문자 후에 love로 끝나는 문자열을 포함한 행과 대응
[]
[] 사이의 문자 집합중 하나와 대응
'[Ll]ove'
love나 Love를 포함하는 행과 대응
[^ ]
문자집합에 속하지 않는 한 문자와 대응
'[^A-K]love'
A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응
\<
단어의 시작 지시자
'\<love'
love로 시작하는 단어를 포함하는 행과 대응(vi,grep에서 지원)
\>
단어의 끝 지시자
'love\>'
love로 끝나는 단어를 포함하는 행과 대응
(vi,grep에서 지원)
\(..\)
다음 사용을 위해 태그를 붙인다.
'\(lov\)ing'
지정된 부분을 태크1에 저장한다. 나중에 태그값을 참고하려면 \1을 쓴다. 맨 왼쪽부터 시작해 태그를 9개가지 쓸 수 있다. 왼쪽 예에서는 lov가 레지스터1에 저장되고 나중에 \1로 참고할 수 있다.
x\{m\}
문자 x를 m번 반복한다.
'o\{5\}'
문자 o가 5회 연속적으로 나오는 모든 행과 대응
x\{m,\}
적어도 m번 반복한다.
'o\{5,\}'
문자 o가 최소한 5회 반복되는 모든 행과 대응
x\{m,n\}
m회 이상 n회 이하 반복한다.
o\{5,10\}'
문자 o가 5회에서 10회 사이의 횟수로 연속적으로 나타나는 문자열과 대응

grep의 옵션
옵션
동작 설명
-b
검색 결과의 각 행 앞에 검색된 위치의 블록 번호를 표시한다. 검색 내용이 디스크의 어디쯤 있는지 위치를 알아내는데 유용하다.
-c
검색 결과를 출력하는 대신, 찾아낸 행의 총수를 출력한다.
-h
파일 이름을 출력하지 않는다.
-i
대소문자를 구분 하지 않는다.(대문자와 소문자를 동일하게 취급).
-l
패턴이 존재하는 파일의 이름만 출력한다.(개행문자로 구분)
-n
파일 내에서 행 번호를 함께 출력한다.
-s
에러 메시지 외에는 출력하지 않는다. 종료상태를 검사할 때 유용하게 쓸 수 있다.
-v
패턴이 존재하지 않는 행만 출력한다.
-w
패턴 표현식을 하나의 단어로 취급하여 검색한다.

# grep -n '^jack:' /etc/passwd
(/etc/passwd 파일에서 jack을 찾는다. jack이 행의 맨 앞에 있으면 행 번호를 화면으로 출력한다.)

3.1.3 grep과 종료 상태
grep은 파일 검색의 성공 여부를 종료 상태값으로 되돌려준다.
패턴을 찾으면 0, 패턴을 찾을 수 없으면 1, 팡리이 존재하지 않을 경우 2
sed,a자 등은 검색의 성공 여부에 대한 종료 상태값을 반환하지 않는다. 다만 구문 에러가 있을 경우에만 에러를 보고한다.

3.2 정규표현식을 사용하는 grep의 예제
# grep NW datafile
# grep NW d*
(d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)
# grep '^n' datafile
(n으로 시작하는 모든 행을 출력한다.)
# grep '4$' datafile
(4로 끝나는 모든 행을 출력한다.)
# grep TB Savage datafile
(TB만 인자이고 Savage와 datafile은 파일 이름이다.)
# grep 'TB Savage' datafile
(TB Savage를 포함하는 모든 행을 출력한다.)
# grep '5\.' datafile
(숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)
# grep '\.5' datafile
(.5가 나오는 모든 행을 출력한다.)
# grep '^[we]' datafile
(w나 e로 시작하는 모든 행을 출력한다.)
# grep '[^0-9]' datafile
(숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)
# grep '[A-Z][A-Z] [A-Z]' datafile
(대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
# grep 'ss* ' datafile
(s가 한 번 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)
# grep '[a-z]\{9\}' datafile
(소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
# grep '\(3\)\.[0-9].*\1 *\1' datafile
(숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
# grep '\<north' datafile
(north로 시작하는 단어가 포함된 모든 행을 출력한다.)
# grep '\<north\>' datafile
(north라는 단어가 포함된 모든 행을 출력한다.)
# grep '\<[a-z].*n\>' datafile
(소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)

3.3 grep에 옵션 사용
# grep -n '^south' datafile
(행번호를 함께 출력한다.)
# grep -i 'pat' datafile
(대소문자를 구별하지 않게 한다.)
# grep -v 'Suan Chin' datafile
(문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 이 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
# grep -v 'Suan Chin' datafile > black
# mv black datafile
)
# grep -l 'SE' *
(패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
# grep -w 'north' datafile
(패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
# grep -i "$LOGNAME" datafile
(환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다. 작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)

3.4 egrep
egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원  한다.
                                    grep와 동일한 명령행 옵션을 지원한다.
egrep에서 지원하는 확장 메타문자
메타문자
기능
사용 예
사용 예 설명
+
선행문자와 같은 문자의 1개 혹은 임의 개수와 대응
'[a-z]+ove'
1개 이상의 소문자 뒤에 ove가 붙어있는 문자열과 대응. move,approve,love,behoove 등이 해당된다.
?
선행문자와 같은 문자의0개 혹은 1개와 대응
'lo?ve'
l 다음에 0개의 문자 혹은 하나의 문자가 o가 나오는 문자열과 대응. love,lve 등이 해당된다.
a|b
a 혹은 b와 대응
'love|hate'
love 혹은 hate와 대응.
()
정규표현식을 묶어준다
'love(able|ly)'
lovable 혹은 lovely와 대응.
'(ov)+'
ov가 한 번 이상 등장하는 문자열과 일치.

3.4.1 egrep 예제
# egrep 'NW|EA' datafile
(NW나 EA가 포함된 행을 출력한다.)
# egrep '3+' datafile
(숫자 3이 한 번 이상 등장하는 행을 출력한다.)
# egrep '2\.?[0-9]' datafile
(숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
# egrep ' (no)+' datafile
(패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
# egrep 'S(h|u)' datafile
(문자 S 다음에 h나 u가 나오는 행을 출력한다.)
# egrep 'Sh|u' datafile
(패턴 Sh나 u를 포함한 행을 출력한다.)

3.5 고정 grep 과 빠른 grep
fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지
         않는다.
# fgrep '[A-Z]****[0-9]..$5.00' file
([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만
2006/09/08 23:25 2006/09/08 23:25
이 글에는 트랙백을 보낼 수 없습니다
Linux/SHELL  2006/09/08 23:12
출처 블로그 > 수진오빠 개그소매상
원본 http://blog.naver.com/soojin001/140005615267
- 본 쉘 프로그래밍 -

2001년 1월 13일
written by 허정수(wertyu@nownuri.net)

1. 왜 쉘 프로그래밍을 배워야 하는가?
이 글을 읽는 사람들 중에서는 왜 쉘 프로그래밍을 배워야 하는지 아는 사람도 있고, 모르는 사람도 있을 것이다. 21 세기, 리눅스를 사용하기도 많이 편리해지고, X 윈도를 실행해서 버튼 몇 개만 클릭하면 편하게 사용할 수 있는데 왜 어려운 쉘 프로그래밍을 배워야 하는지 모르는 사람도 있을 것이다.

하지만, 리눅스를 어느 정도 사용해 본 사람이라면, 리눅스를 편하게 사용하기 위해서 쉘의 사용법과 쉘 프로그래밍을 꼭 알아야 하는 것을 알고 있을 것이다. 어느 책에서는 MS Windows와 유닉스/리눅스의 가장 큰 차이점을 바이너리와 텍스트로 설명하고 있다. 즉, MS Windows는 바이너리 유닉스는 텍스트이다. MS Windows는 모든 설정을 바이너리로 관리하여 사용자가 직접 프로그램의 설정을 변경할 수 없고, 설정을 변경하기 위해서는 꼭 설정을 변경하는 프로그램을 통해야만 한다.(regedit 처럼) 하지만 유닉스는 모든 설정을 텍스트 파일로 관리한다. (요즘 MS Windows도 Script를 이용하여 설정을 바꿀 수 있도록 변하고 있는 추세이다. 즉 유닉스의 장점을 MS Windows도 이해하고 따라가고 있다.)

이 극명한 차이가 쉘 프로그래밍을 배워야 하는 이유이다. 예를 들어 설명해 보자. 시스템 교체를 위해 MS Windows와 유닉스의 사용자 1만 명을 다른 시스템으로 옮긴다고 생각해 보자. MS Windows에서는 분명 사용자 추가하는 프로그램을 실행하여 각 1만 명의 아이디와 암호 및 프로필을 손수 입력해야 할 것이다. 아무리 클릭을 빠르게 하고, 타이핑이 아무 빨라고 많은 시간이 필요하다. 하지만, 유닉스에서는 간단하게 스크립트를 짜서 실행하면 된다.

다른 예도 있다. 다음과 같이 현재 디렉터리에 확장자가 gif인 파일이 많이 있다고 하자.

13:28[wertyu@inos test]$ ls
a.gif b.gif c.gif d.gif mmv.sh*

그런데, 여기 있는 gif 파일의 확장자를 모두 jpg로 바꾸려고 한다. 앞의 예에서는 파일이 4개 밖에 안 되지만 만약, 파일이 1000개 라면 당신은 어떻게 할 것인가. 이 때 간단히 스크립트를 짜서 실행하면 쉽게 확장자를 고칠 수 있다. 다음의 스크립트는 확장자가 gif인 파일의 확장자를 jpg로 바꾸는 스크립트이다.(프롬프트 앞의 13:13은 필자의 프롬프트에서 시간을 나타낸다.)

13:31[wertyu@inos test]$ cat mmv.sh
#! /bin/sh

X=`ls *.gif`
for B in $X
do
temp=`basename $B .gif`
mv $B $temp.jpg
done

13:31[wertyu@inos test]$ ls
a.gif b.gif c.gif d.gif mmv.sh*
13:31[wertyu@inos test]$ ./mmv.sh
13:31[wertyu@inos test]$ ls
a.jpg b.jpg c.jpg d.jpg mmv.sh*

어떤가 쉽지 않은가?

2. How the Shell Interpret What You Typed

이번 절에서는 아주 간단히 쉘이 어떻게 작동하는지 알아 보려 한다. 이번 절의 제목을 해석해 보면, "쉘은 당신이 입력한 것을 어떻게 해석하는가"(How the Shell Interpret What You Typed)이다. 쉘이 작동하는 방법을 조금이나마 이해하기 바란다. 다들 알고 있겠지만, 쉘은 리눅스에서 명령을 내리는데 가장 중요한 프로그램이다.(MS Windows에서의 Shell은 Internet Explorer이다. 알고 있었나?). 쉘은 명령을 내리기 위해서는 어쩔 수 없이 거쳐야 하는 프로그램이기 때문에 쉘이 작동 원리를 이해하면 명령을 쉽고 빠르고 간단하게 입력할 수 있다. 또한 쉘이 작동하는 원리를 정확히 이해해야만 쉘 프로그램도 잘 짤 수 있다.

다음의 예를 보자. 다음과 같이 간단한 C로 작성한 프로그램이 있다.

13:42[wertyu@inos test]$ cat how.c
#include <stdio.h>

void main(int argc, char* argv[])
{
int cnt ;

for( cnt = 1 ; cnt < argc ; ++cnt )
{
printf("arguement %d = %s
", cnt , argv[cnt] ) ;
}
}

이 프로그램을 how라는 실행 파일로 컴파일 해 놓자.

문제 1.
다음의 실행 결과는 무었인가?

$ how $HOME

을 실행 시키면 출력 결과는 무었일까? 이 문제는 쉬울 것이다.

답 1.

13:47[wertyu@inos test]$ ./how $HOME
arguement 1 = /home/wertyu
13:47[wertyu@inos test]$

문제 2.

디렉터리에 다음과 같은 파일들이 있다.

13:48[wertyu@inos test]$ ls
a.jpg b.jpg c.jpg d.jpg how* how.c mmv.sh*

다음을 실행하면 무엇이 출력 될까.

13:48[wertyu@inos test]$ ./how *

이건 조금 어렵다. 쉽게 맞출 수 있는 사람도 있겠지만, 대부분의 사람들은 '*'가 출력된다고 답할 것이다. 그러나 답은....

답 2.

13:48[wertyu@inos test]$ ./how *
arguement 1 = a.jpg
arguement 2 = b.jpg
arguement 3 = c.jpg
arguement 4 = d.jpg
arguement 5 = how
arguement 6 = how.c
arguement 7 = mmv.sh
13:49[wertyu@inos test]$

위의 두 문제를 풀어 봄으로서 대충이나마 쉘의 작동 방법을 이해할 수 있었을 것이다.

3. 쉘 스크립트를 작성해 보자.

이제 기본적인 설명은 끝났으므로 실제 쉘 스크립트를 작성해 보자. 쉘 스크립트의 첫 줄은 항상 다음과 같이 시작을 해야 한다.

#! /bin/sh

이 첫 줄은 인터프리터를 지정하는 줄이다. 앞으로 나올 여러 명령들을 인터프리트할 프로그램을 지정한다. 마찬가지로 awk로 스크립트를 작성하기 위해서는 스크립트의 첫 줄은 #! /bin/awk로 시작해야 할 것이다.

쉘 스크립트를 작성하는 방법은 간단한다. 사용하기 편한 에디터로 명령들을 적은 후에 파일의 모드를 '실행' 모드를 주는 것이다. 다음의 예를 보자


14:01[wertyu@inos test]$ cat > echo.sh
#! /bin/sh
echo $1

14:02[wertyu@inos test]$ chmod 775 echo.sh
14:02[wertyu@inos test]$ ./echo.sh Parameter
Parameter
14:02[wertyu@inos test]$

위의 예를 보면 알 수 있듯이 각자 사용하기 편리한 에디터로 스크립트를 작성한 후 chmod 명령으로 파일에 실행 권한을 주어 실행 할 수 있다. 참고로 앞에 나온 echo.sh은 입력받은 parameter 중 첫 번째 parameter를 출력하는 쉘 스크립트이다.

3.1 변수의 선언 및 사용법

쉘 프로그램에서 변수를 선언하는 방법을 알아 보자. 변수는 간단히

변수명=변수값

과 같이 선언할 수 있다. 여기서 중요한 것은 '변수명'과 '=', '변수값' 사이에 공백이 있으면 안 된다는 것이다. 따라서 다음과 같은 쉘 프로그램은 잘못된 것이다.

14:07[wertyu@inos test]$ cat wrong.sh
#! /bin/sh
x = 123
echo $x
14:07[wertyu@inos test]$ ./wrong.sh
./wrong.sh: x: command not found

'x = 123' 부분을 'x=123'과 같이 수정한 후 실행 시키면 123이 출력되는 것을 볼 수 있다.

선언한 변수를 사용하기 위해서는 앞의 예와 같이 변수명 앞에 $를 붙여주면 된다.

3.2 Flow of Control
Flow of Control이란 한글 책에서 흔히 '흐름 제어'로 번역되는 단어로서 '조건 분기문' '루프' 등을 나타낸다. 어떠한 프로그램이든 그 프로그램을 구성하는 프로그램 logic 중 80%는 Flow of Control일 정도로 어떤 language를 배우든 Flow of Control을 익히는 것은 매우 중요하다.

3.2.1 if 문

본 쉘 프로그래밍에서 if문은 다음과 같이 사용된다.

if test_statement_A
then
statement_B
statement_C
else
statement_D
fi

다음의 예를 보자

14:36[wertyu@inos test]$ cat test.sh
#! /bin/sh

if [ $# -eq 0 ]
then
echo "No arguement"
else
echo "There are $# arguement(s)"
fi
14:36[wertyu@inos test]$ ./test.sh
No arguement
14:36[wertyu@inos test]$ ./test.sh a b c d e
There are 5 arguement(s)

여기서도 중요한 것은 '[' 와 조건을 검사하는 부분과 ']' 사이에 공백이 있어서는 안 된다는 것이다.
'$#' 변수는 본쉘 스크립트의 특수 변수로서 인자의 수를 나타내는 변수이고, -eq는 equal의 약자로서 두 수가 같은지 비교하는 연산자 이다.

if [ $# -eq 0 ] 은 다음과 같이 바꾸어 사용해도 된다.

if test $# -eq 0

즉, 앞의 test.sh 스크립트는 다음의 스크립트와 동일하게 동작한다.

14:42[wertyu@inos test]$ cat test.sh
#! /bin/sh

if test $# -eq 0
then
echo "No arguement"
else
echo "There are $# arguement(s)"
fi

test는 외부 명령으로서 주어진 expression을 검사하여 true or false를 return하는 명령이다. 여기서 test를 예로 든 것은 if 의 조건에는 외부 명령이 함께 쓰일 수 있기 때문이다. 즉, 다음 스크립트와 같이 작동하는 스크립트를 작성할 수 있다.

if ls plot.ps
then
lpr plot.ps
else
echo ":::: ERROR FILE DOESN'T EXIST ::::"
fi

앞의 예제 스크립트는 plot.ps라는 파일이 있을 경우에 프린트를 하고, plot.ps라는 파일이 없을 경우에는 에러 메시지를 출력하는 스크립트이다.


3.2.2 숫자의 비교

앞의 예에서 -eq로 두 수의 값이 같은지 비교하는 것을 보았다. -eq 외에도 많은 연산자가 있다.

-eq : equal, 두 수가 같냐?
-ne : not equal, 두 수가 같지 않냐?
-gt : greater than, 왼쪽 변수가 오른쪽 변수보다 크냐?
-lt : less than, 왼쪽 변수가 오른쪽 변수보다 작냐?
-ge : greater than or equal, 왼쪽 변수가 오른쪽 변수보다 크거나 같냐?
-le : less than or equal, 왼쪽 변수가 오른쪽 변수보다 작거나 같냐?

3.2.3 문자열의 비교

문자열을 비교하기 위한 연산자는 다음과 같다.

[ "String1" = "String2" ] : 두 문자열이 같은지
[ "String1" != "String2" ] : 두 문자열이 다른지
[ -z $X ] : $X라는 문자열 변수의 길이가 0이면 참
[ -n $X ] : $X라는 문자열 변수의 길이가 0이 아닐 경우 참

또한 '!'는 NOT을 나타낸다. 따라서 다음의 두 expression은 같은 것이다.

[ -z $X ]
[ ! -n $X ]

3.2.4 File 검사

이번 절에서는 File과 관련된 test를 알아보기로 한다. 파일이 존재하는지 검사하는 스크립트는 프로그램의 설정 파일을 검사할 때 많이 쓰인다. 예를 들어 $HOME/.vimrc가 있을 경우 $HOME/.vimrc 설정 파일을 읽어 들이고 없을 경우 default 설정 파일을 읽어 들이도록 하는데 사용될 수 있다.

[ -b file ] : file이 존재하고 file이 block special file인 경우 참
[ -c file ] : file이 존재하고 file이 character special file인 경우 참
[ -d file ] : file이 존재하고 file이 directory인 경우 참
[ -f file ] : file이 존재하고 file이 일반적인 file인 경우 참
[ -g file ] : file이 존재하고 file에 Set-Group-Id가 set 되어 있는 경우 참
[ -h file ] : file이 존재하고 file이 symbolic link인 경우 참
[ -H file ] : file이 존재하고 file이 hidden directory인 경우 참
[ -k file ] : file이 존재하고 file에 sticky bit가 set되어 있는 경우 참
[ -p file ] : file이 존재하고 file이 named pipe인 경우 참
[ -r file ] : file이 존재하고 file에 읽기 권한이 있는 경우 참
[ -s file ] : file이 존재하고 file의 size가 0이 아닌 경우 참
[ -u file ] : file이 존재하고 file에 Set-User-Id가 set되어 있는 경우 참
[ -x file ] : file이 존재하고 file에 실행 권한이 있는 경우 참
[ -w file ] : file이 존재하고 file에 쓰기 권한이 있는 경우 참

위의 모든 것을 외울 필요는 없지만 쉘 스크립트에서 file과 관련하여 어떤 것을 검사할 수 있는지 정도는 알아두는 것이 좋다.

3.2.5 AND/OR 연산자

C 언어에서는 &&가 logical AND 연산자, ||가 logical OR 연산자인데, 본 쉘 프로그래밍에서는 AND는 -a, OR는 -o 이다.

3.2.6 Loop

본 쉘 프로그래밍에서는 C 언어와 비슷하게 3 개의 Loop 관련 문을 제공한다.

3.2.6.1 for

for문의 문법은 다음과 같다

for VARIABLE in LIST
do
STATEMENT1
STATEMENT2
done

1절에서 잠시 살펴 본 여러 file의 확장자를 동시에 바꾸는 스크립트를 다시 한 번 살펴보자

#! /bin/sh

X=`ls *.gif`
for B in $X
do
temp=`basename $B .gif`
mv $B $temp.jpg
done

X에 ls *.gif의 값이 저장된다. 이 값은 LIST의 형태로 생각하면 된다. 즉, 차례로 확장자가 gif인 파일이 저장된다고 생각하라.
for B in $X를 살펴 보면, 앞의 ls *.gif의 결과 값 각각에 대해서 for 이하의 문을 실행하라는 것이 된다. 그리고 그 각각의 값은 임시로 B에 저장이 된다.

temp=`basename $B .gif`

basename은 $B에서 .gif 부분을 제외한 부분을 리턴하는 프로그램이다. 직접 프롬프트에서 명령을 내려서 결과를 확인할 수도 있다.

23:17[wertyu@inos test]$ basename wertyu.gif .gif
wertyu

여기서 중요한 것은 '가 아니라 `이라는 점이다. 쉘 스크립트에서 변수의 값에 외부 명령을 실행 시킨 결과 값을 저장하기 위해서는 ` command `를 이용하면 된다. 즉

temp=`basename $B .gif`

는 $B에서 .gif 부분을 떼어버리고 남은 문자열을 temp에 저장하는 것이 된다. 나머지는 쉽게 이해할 수 있을 것이라 생각된다.

다음의 스크립트는 grep과 비슷한 스크립트이다. (출처:http://pneuma.phys.ualberta.ca/~gingrich/research/shells/shells.html, 이 글에서 설명한 본 쉘 스크립트의 문법은 앞의 사이트에서 가져온 것도 몇 개 있으니 참고하기 바란다.)

#! /bin/sh
#
# A script to look for the occurence of a string in a file
# Usage: match [string] [file]
#
for word in `cat $2`
do
if [ ``$word'' = ``$1'' ]
then
echo ``Found $1 in file $2''
else
:
fi
done

각자 이해해 보시길.... 근데, ``$word'' = ``$1'' 의 의미는 필자도 잘 모르겠다. 그냥 $word = $1으로 바꿔도 잘 돌아가던데....

3.2.6.2 while

for 문에 대해서는 이해가 되었을테니 이제 while 문을 볼까?

문법)

while condition
do
commands
done

예) 10, 9, 8,...,1을 출력하는 스크립트이다.

number=10
while [ $number -ge 1 ]
do
echo $number
number=`expr $number - 1`
done

while은 condition이 참일 동안 loop를 돈다.

3.2.6.3 until

until은 while과 거의 비슷하다.

문법)

until condition
do
commands
done

단, while과 한 가지 차이점이 있는 것은 while은 condition이 참일 동안 loop를 돌지만, until은 condition이 거짓일 동안 loop를 돈다는 것이다.

다음의 예는 while에서의 예와 같은 일을 하는 스크립트를 until을 이용하여 작성한 것이다.

예)

number=10
until [ $number -lt 1 ]
do
echo $number
number=`expr $number - 1`
done

3.2.7 case 문

이 번 절에서는 case 문에 대해서 알아 보겠다. C 언의 case와 아주 유사하므로 쉽게 이해할 수 있을 것이다. 단, C 에서는 if-elseif를 쉽게 case 문으로 바꿀 수 있지만, 본 쉘 스크립트에서의 case는 if 보다 훨 씬 많은 기능을 제공한다.

다음의 예를 보자.

#!/bin/sh
case $# in
0)
echo ""no parameters"";;
1)
echo "only one parameter." ;;
*)
echo "more than one parameter." ;;
esac

설명 안 해도 이제 이해되겟지? case 다음의 $#의 값에 따라서, 0)이냐 1)이냐에 따라서, 원하는 것을 실행 시킬 수 있다.
위의 예에서는 case의 장점을 살펴 볼 수 없었다. 그러나 다음의 예를 보면, case의 유용함에 대해서 쉽게 알 수 있을 것이다. case의 유용함은 Regular Expression을 사용할 수 있다는 것이다. Regular Expression 까지 설명하려면 글이 길어 지므로, Regular Expression은 필자가 번역한 http://nnr.or.kr/linux/regular.htm을 참고하거나 다른 참고 자료를 살펴 보기 바란다.
그럼 다음의 예를 보자

while :
do
echo "Would you like to continue? c"
read ANS
case $ANS in
[yY] | [yY][eE][sS]) echo "Fine, then we'll continue."
break
;;
[nN] | [nN][oO]) echo "We shall now stop."
exit
;;
*) echo "You must enter a yes or no verdict!"
esac
done
echo "
We are now out of the while loop."

일단 저장해 놓고 실행 해 보자. 돌려 보면 알겠지만, Yes를 입력하든 Y를 입력하든 YES를 입력하든 yEs를 입력하든, [yY] | [yY][eE][sS])는 true가 된다.
참 하나 설명을 안 하고 넘어간 부분이 있다.

while :

은 항상 참을 나타낸다.

아. 또 read도 설명 안 했군. read ANS는 사용자로부터 문자열을 입력받아 ANS에 저장하는 명령이다.

이 정도면 설명이 다 되었을 것이다.

4. 마치면서

아주 간단하게나마 본 쉘 프로그래밍에 대해서 알아 보았다. 너무나 간단하여 복잡한 일은 하기 힘들 것이다. 남은 것은 여러분의 노력 뿐... 아주 간단하게 본 쉘 스크립트를 알아 보았으므로, 다음 시간에는 TIP을 중심으로 본 쉘 스크립트에 대해서 알아 보겠다. 단, 필자도 아직 위의 내용 이외에는 아는 것이 별로 없으므로 공부를 한 후에 나머지 내용을 쓰도록 하겠다.

* 참고 자료 :

http://www.sao.nrc.ca/imsb/rcsg/documents/bourne/bourne.html
http://pneuma.phys.ualberta.ca/~gingrich/research/shells/shells.html

ps. 검색 엔진에서 shell programming이라고 입력하면 수 많은 결과가 나올테니 열심히 공부하기 바란다~~~


-------------------------------------------------------------------------------------------


출처 블로그 > Jay's
원본 http://blog.naver.com/cocktail74/40004597832

특수문자

Match

사용 예

Match

.

임의의 한 문자

*

한 번도 없거나 한번 이상 반복

abcd*

abc, abcd, abcdd 등과 match

.*

모든 문자

^

행의 처음

^X

행의 첫머리의 X

X^

행의 임의의 위치의 X

^/^ or ^^

행의 첫머리의 ^

$

행의 마지막

X$

행의 끝의 X

$X

행의 임의의 위치의 X

\$$ or $$

행의 끝의 $

[]

[,] 안의 아무 문자

c[aeiou]t

cat, cet... 와 match

-를 사용하여 범위 설정 가능

c[a-z0-9]t

두 번째 문자의 임의의 소문자나 숫자

-와의 match를 위해선 [-나 -] 이용

c[-ai]

c-, ca, ci

]와의 match를 위해선 []와 같이 나타냄

c[]ai]

c], ca, ci

^를 [다음에 사용하면 [, ]안의 문자를 제외한 문자들과 match

[A^-Z]

대문자를 제외한 문자

\{n,m\} (ed, sed, grep 에서만 사용 가능)

\{n\}은 바로 앞의 expression이 n번 반복 된 것

[0-9]\{3\}

세 개의 숫자

\{n,\}은 바로 앞의 expression이 n번 또는 그 이상 반복된 것

0\{4,\}

4개 이상의 0

\{n,m\}는 바로 앞의 expression이 n번에서 m번 반복된 것

1\{4,9\}

4개에서 5개의 1

\

특수 문자들의 기능을 수행하지 않고 문자 그대로 받아들임

\*\**

한 개 또는 그 이상의 *

^[ ^I]*$

공백행과 space나 TAB을 포함한 행(겉보기 공백행). 여기서 ^I는 ctrl+I로써 TAB과 같다

^.*$

임의의 행 전체

modifier를 이용하여 변수 값이나 history에 저장된 명령어의 내용을 변환시킬 수 있다.

(단, set A = (/home/user/temp.c), set B = (a.c b.c c.c d.c))

Modifier

기능

사용 예

결과

:h

pathname에서 마지막 부분을 제어하고 앞부분만 남김

echo $A:h

/home/user

:t

pathname에서 마지막 부분만 남기고 pathname을 제거함

echo $A:t

temp.c

:r

pathname에서 끝 부분의 .xxx만 제거

echo $A:r

/home/user/temp

:e

.xxx만 남기고 앞부분 제거

echo $A:e

c

:g

:gh, :gr, :gt, :ge의 형태로 사용되며, array변수에 저장된 모든 값들에 h,r,t,e를 적용시킨다.

echo $B:r

a b c d

:p

명령어를 실행시키지 않고 출력만 시킨다.

!:p

:q

특수 문자들의 기능을 수행하지 않고 단순히 출력만 시킨다.

%echo *
%!:q

*

특수문자

의미

비고

!

history 기능을 시작하기 위한 특수문자

!n

n번째로 사용된 명령 실행

!-n

현재부터 n번째 앞에 사용된 명령 실행

!!

바로 전에 실행되었던 명령 실행

!-1

!string

가장 최근에 string으로 시작되는 명령 실행

!?string[?]

가장 최근에 string을 포함하고 있는 명령 실행

^aa^bb

마지막으로 실행된 명령어에서 aa를 bb로 치환하여 명령 실행

!*

마지막으로 실행된 명령에 사용된 모든 argument

!$ or !!$

마지막 명령의 마지막 argument

!^

마지막 명령의 첫 argument

event:s^aa^bb

event는 앞에서 !로 시작하는 history 명령이다. aa를 bb로 치환한다. 단, ^대신 다른 특수 문자를 사용하여도 된다.

ex) !23:s/aa/bb

!:n or !!:n

마지막 명령의 n번째 argument

!:n*

마지막 명령의 n번째부터 그 이후의 argument

!:n-$

!:0

마지막 명령의 명령어만 나타냄

!:n-m

마지막 명령의 n번째부터 m번째까지의 argument

!:-n

마지막 명령의 명령어부터 n번째 argument까지

!:n-

마지막 명령의 n번째부터 마지막 argument를 제외한 argument

!?string?%

가장 최근에 string을 포함하고 있는 단어를 나타냄

색코드

의미

0

기본 화면색. 흰 글자색. 검정 배경색

1

bold intensity

4

흑백 모드에서는 밑줄

5

반짝임

7

역상

30

검정 (회색) 글자색

31

빨강 (옅은 빨강) 글자색

32

녹색 (옅은 녹색) 글자색

33

갈색 (노랑) 글자색

34

파랑 (옅은 파랑) 글자색

35

보라 (옅은 보라) 글자색

36

cyan (옅은 cyan) 글자색

37

흰색 (밝은 흰색) 글자색

40

검정 (회색) 배경색

41

빨강 (옅은 빨강) 배경색

42

녹색 (옅은 녹색) 배경색

43

갈색 (노랑) 배경색

44

파랑 (옅은 파랑) 배경색

45

보라 (옅은 보라) 배경색

46

cyan (옅은 cyan) 배경색

47

흰색 (밝은 흰색) 배경색

10

기본 font 선택

38

밑줄 사용 가능

39

밑줄 사용 불가능

Escape Sequence

기능

ESCc

화면을 지우고 커서를 1행 1열로 이동시킴

ESC[nA

커서를 현위치에서 위로 n칸 이동

ESC[nB

커서를 현위치에서 아래로 n칸 이동

ESC[nC

커서를 현위치에서 오른쪽으로 n칸 이동

ESC[nD

커서를 현위치에서 왼족으로 n칸 이동

ESC[n;mH 또는 ESC[n;mf

커서를 m열 n행으로 이동시킴

ESC[nJ

n = 0 이면 현위치에서 화면의 끝까지 지움
n = 1 이면 화면의 처음에서 현위치까지 지움
n = 2 이면 화면 전체를 지움

ESC[nK

n = 0 이면 현재 커서의 위치에서 행의 끝까지 지움
n = 1 이면 행의 처음에서 현재의 커서 위치까지 지움
n = 2 이면 현재 커서가 있는 행을 모두 지움

ESC[nL

n 행을 현재 커서 위치에 삽입

ESC[nM

현재 커서 위치에서부터 n행 삭제

ESC[nP

현재 커서 위치의 행의 처음부터 n개 문자 삭제

ESC[nX

현재 커서 위치에서부터 n개 문자 삭제

ESC[nM

화면의 색지정. 여러 가지 색을 지정할 때는 ;를 사용하여 구분한다.

2006/09/08 23:12 2006/09/08 23:12
이 글에는 트랙백을 보낼 수 없습니다
Linux/SHELL  2006/09/08 22:12

아마 MS-DOS를 접해본 분이라면 와일드카드(wildcard, 유닉스에서는 glob pattern이라고 부른다)이라고 부르는 *?와 같은 기호에 익숙할 겁니다. a로 시작하는 모든 GIF 파일을 a*.gif와 같이 비슷한 파일명을 일일이 명시하지 않고 지정할 수 있습니다. 정규표현식(regular express, 줄여서 regexp, regex, re)도 MS-DOS의 *?와 같이 패턴을 기술하는 방식입니다. 그러나 정규표현식은 MS-DOS의 와일드카드와는 달리 파일명 뿐만이 아니라 파일 내용을 포함한 일반적인 용도로 사용이 가능하며, 그 기능도 더 강력합니다.

유닉스는 기본적으로 그래픽보다는 문자 기반 인터페이스를 제공하기 때문에, 문자들을 찾거나 다른 문자로 대체하는 도구인 정규표현식은 매우 중요합니다. 사실, 정규표현식을 모르고 유닉스를 사용하는 것이 가능할까란 의문이 들 정도로 정규표현식은 유닉스 사용과 관리의 많은 부분에 적용이 가능합니다. 우리가 자주 사용하는 편집기인 vi와 emacs, 자주 사용하는 도구인 grep과 sed와 awk, portable shell로 불리는 Perl, 자동으로 메일을 정리하는 procmail 등, 정규표현식은 유닉스의 거의 모든 도구와 관련이 있습니다. 개인적으로 뼈아픈 경험뒤에 "멍청하면 손발이 고생한다"는 격언(?)의 적절한 예로 정규표현식을 꼽습니다.

불행히도 도구마다 정규표현식을 지원하는 정도가 조금 차이가 나지만 몇번 시도해보면 이 차이를 알 수 있습니다. 그러면 기본적이고 광범위하게 쓰이는 정규표현식부터 하나씩 알아봅시다.


2. 정규표현식 기초

기본적으로 정규표현식은 다음 세가지로 구별할 수 있습니다.

  • 문자에 해당되는 부분
  • 앞의 해당되는 부분을 반복하는 부분
  • 문자에 해당되지않고 위치나 결합을 나타내는 부분

이제 MS-DOS의 *와 같이 특수한 의미를 가지는 문자들을 만나게 됩니다. 우리가 정규표현식을 배운다는 것은 이런 특수 문자들과 그들의 의미를 아는 것입니다.

2.1. 문자에 해당되는 부분

우선 보통 알파벳과 숫자 등은 그 문자 그대로를 나타냅니다. 물론 대소문자는 서로 구별됩니다.

$ egrep 'GNU' COPYING GNU GENERAL PUBLIC LICENSE freedom to share and change it. By contrast, the GNU General Public the GNU Library General Public License instead.) You can apply it to ...(생략)... $

위에서 egrep은 파일들에서 원하는 문자들을 찾는 도구입니다. (흔히들 사용하는 grep의 변종으로 grep보다 다양한 정규표현식을 사용할 수 있습니다.) 첫번째 아규먼트로 원하는 문자를 나타내는 정규표현식을 사용합니다. 여기서 GNU는 정규표현식으로 뒤에 나오는 파일들에서 G, N, U 세 문자가 연이어 나오는 경우를 찾습니다. 여기서 사용한 파일인 COPYING은 자유 소프트웨어 소스코드에서 쉽게 찾을 수 있는 GPL 조항입니다. 결과를 명확하게 하기 위해서 찾은 단어를 굵게 표시했습니다.

그런데 왜 GNU 주위에 따옴표를 했을까요? 여기서 따옴표는 정규표현식에서 쓰이는 *, ?, | 등의 문자들이 쉘에서도 특별한 기능을 하기때문에 이들 문자가 쉘에서 처리되지 않게하려고 필요합니다. 또, egrep 'modified work' COPYING와 같이 찾으려는 패턴에 공백이 포함된 경우에도 따옴표는 이들을 한개의 아규먼트로 처리합니다. 사실 위의 GNU에 따옴표는 필요없지만, 항상 규칙처럼 따옴표를 같이 사용하는 것을 권합니다.

어떤 특정한 문자가 아니라 가능한 여러 문자들을 지정할 수도 있습니다.

$ egrep '[Tt]he' COPYING The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public software--to make sure the software is free for all its users. This ...(생략)... $

위에서 [Tt]는 그 자리에 Tt가 나올 수 있음을 의미합니다. 이렇게 []안에 가능한 문자들을 적어줄 수 있습니다.

[a-z]와 같이 [] 안에 -를 사용하여 그 범위 안의 문자들도 지정할 수 있습니다. 예를 들어, [a-zA-Z0-9]는 영문 알파벳 대소문자와 숫자들을 모두 포함합니다. 또, [^a-z]와 같이 [] 처음에 ^를 사용하여 뒤에서 지정된 문자 이외의 문자를 지시할 수도 있습니다. 즉, 이는 영문 알파벳 소문자를 제외한 문자들을 의미합니다.

([a-z]에서 범위는 ASCII 코드값으로 a (97)에서 z (122)까지를 뜻합니다. 만약 [z-a]와 같이 큰 값을 앞에 쓰면 안됩니다. ASCII 코드값은 man ascii로 볼 수 있습니다.)

마지막으로 (보통 행바꿈 문자를 제외한) 어떤 문자에도 대응되는 .이 있습니다. (MS-DOS의 ?와 같습니다.)

$ egrep 'th..' COPYING of this license document, but changing it is not allowed. freedom to share and change it. By contrast, the GNU General Public software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to ...(생략)... $

이는 th 뒤에 두 문자가 나오는 경우를 찾습니다. 세번째 줄 끝에 This는 대소문자를 구별하기 때문에 패턴에 해당되지않고, the 에서 공백도 한 문자로 취급한 것을 주의하길 바랍니다. 위에서 program will individually obtain patent licenses, in effect making the와 같은 줄을 출력하지 않은 이유는 마지막 the에서 th와 그 뒤의 한 문자는 찾았지만 그 뒤에 문자가 줄바꿈 문자이기 때문에 조건이 만족되지않기 때문입니다.

2.2. 앞의 해당되는 부분을 반복하는 부분

여기서는 *, ?, +을 다룹니다.

*는 바로 앞의 문자를 0번 이상 반복해도 됨을 나타냅니다. 예를 들어, abc*

  • abccccccccc
  • abc
  • ab

를 모두 만족합니다. 여기서 주의해서 볼 것은 "0번 이상"이기 때문에 마지막 경우와 같이 앞의 문자가 안나와도 된다는 것입니다. (그래서 MS-DOS의 *은 정규표현식으로 .*입니다.)

*와 비슷하게, ?는 앞의 문자가 없거나 하나 있는 경우를 나타내고, +는 앞의 문자가 1번 이상 반복하는 경우를 나타냅니다. 그래서 a+aa*와 같습니다.

이제 abc 모두를 반복하고 싶다면 어떻게 해야 되는지 의문이 듭니다. 이 경우 (, ) 괄호를 사용하여 문자들을 묶어주면 됩니다. 그래서 (abc)*

  • abcabcabcabc
  • abc

를 모두 만족합니다. 마지막 예는 0번 반복한 경우로 어떤 문자도 없는 빈 경우입니다. 이제 앞에서 말한 "앞의 문자"라는 말을 정정해야 겠습니다. *, ?, +는 "앞의 문자"에 적용되는 것이 아니라 "앞의 단위"에 적용됩니다. 기본적으로 한 문자는 그 자체로 한 단위입니다. 그래서 abc*에서 *는 바로 앞 문자이자 단위인 c에 적용된 것입니다. 그러나 괄호로 문자들을 묶어서 단위를 만들 수 있고, (abc)*의 경우에 *는 앞의 단위인 abc에 적용된 것입니다.

주의
위에서 (abc)*가 0번 반복해서 어떤 문자도 없는 것을 나타낼 수 있음을 주의해야 합니다. 정규표현식에서 이런 경우 대상과 관계없이 패턴이 만족한 것으로 판단하기 때문에 egrep '(abc)*' COPYING와 같은 명령어는 COPYINGabc라는 부분이 없음에도 불구하고 모든 줄을 출력합니다. 즉, egrep '(abc)*' COPYING | wc -lwc -l COPYING은 같습니다.

또, 주의할 점은 정규표현식은 패턴을 만족시키는 가장 긴 부분을 찾는다는 점입니다. 즉, abababab에 대한 정규표현식 (ab)+ababab에 대응되지 않고 abababab 모두에 대응됩니다. 이런 행동은 어떻게보면 당연한 것이지만 주의를 하지않으면 문제가 생길 수도 있습니다. 예를 들어, compiler and interpreter<\B>에 대한 정규표현식 .*<\B>는 (의도했을) compiler을 찾지않고 compiler and interpreter<\B> 전체를 찾게 됩니다. 이를 해결하기 위해 [^<]*<\B>을 사용합니다. . 대신에 [^<]를 사용한 것처럼 찾는 대상을 제한하기 위해서 [^...] 형식을 자주 사용합니다.

2.3. 문자에 해당되지않고 위치나 결합을 나타내는 부분

여기서 다루는 ^, $, |는 앞에서와는 달리 특정 문자에 대응하지는 않지만, 위치나 결합의 중요한 기능을 합니다.

우선 ^는 줄의 처음을 뜻합니다.

$ egrep '^[Tt]he ' COPYING the GNU Library General Public License instead.) You can apply it to the term "modification".) Each licensee is addressed as "you". the scope of this License. The source code for a work means the preferred form of the work for ...(생략)... $

정규표현식의 마지막 문자가 공백임을 주의하길 바랍니다. 만약 이 공백이 없다면 Thesethemselves,로 시작하는 줄들도 찾게됩니다. 이렇듯 정규표현식을 적을 때는 자신이 찾길 원하는 부분을 빼먹거나, 자신이 원하는 부분 이외의 것을 포함하지 않도록 주의해야 합니다. 지금처럼 정규표현식을 입력하고 그 결과를 하나씩 살펴볼때는 문제가 없지만, 많은 경우 정규표현식은 스크립트로 많은 문서를 한꺼번에 처리할때 사용하기때문에 주의해야 합니다. 잘못 쓴 정규표현식때문에 원하는 결과를 얻지 못하는 것은 물론이고 원본까지 망치게 되는 경우가 있습니다.

^는 이렇게 [Tt]와 같이 특정 문자에 대응되지는 않지만 원하는 문자가 선택될 수 있게 도와줍니다. 반대로, $는 줄의 끝을 나타냅니다. 그래서 ^$과 같은 정규표현식은 빈 줄을 찾습니다.

|은 기호 앞뒤의 것 중 하나를 선택한다는 뜻입니다. 즉, 문서에서 this(This)나 that(That)을 찾는다면,

  • this|This|that|That
  • [tT]his|[tT]hat
  • [tT]his|hat - 틀림! 이 정규표현식은 [tT]hishat을 찾음.
  • [tT](his|hat)
  • [tT]h(is|at)

모두 가능합니다. 세번째와 네번째 경우에서 괄호의 기능을 알 수 있습니다.

2.4. 일반문자와 특수문자

아마도 지금쯤 ^이 두가지 의미로 쓰인다는 것이 이상해 보일 수도 있을 겁니다. 정규표현식에서 쓰이는 문자는 크게 일반문자와 특수문자로 나눠볼 수 있습니다. 여기서 특수문자란 앞에서 다룬 (순서대로) [, ], -, ^, ., *, ?, +, (, ), $, |과 같이 정규표현식에서 문자그대로의 의미로 해석되지 않는 문자들입니다. 반대로 특수문자가 아닌 문자는 일반문자로 G, N, U와 같이 문자그대로의 의미를 가집니다.

여기서 특수문자는 쓰이는 곳에 따라 다릅니다. 자세히 말하면, []안이냐 밖이냐에 따라 특수문자가 달라집니다.

우선 [] 밖에서는 -를 제외한, ^, ., *, ?, +, (, ), $, |이 특수문자입니다. 여기서 ^는 줄의 시작을 의미합니다.

그러나 [] 안에서는 -^만이 특수문자이고, 다른 문자들은 일반문자가 됩니다. 즉, [*?+]는 반복이 아니라 문자그대로 *?+ 중 하나를 뜻합니다. [] 안에서 (제일 앞에 나오는) ^는 뒤에나오는 조건을 만족하지 않는 문자를 찾는다는 의미가 됩니다.

2.5. 특수문자에 해당하는 문자 사용하기

그렇다면 찾으려는 부분에 특수문자가 포함되있다면 어떻게 할까요? 예를 들어 what?이라는 물음표로 끝나는 문자를 찾고 싶다고, egrep 'what?' ...이라고 하면 ?이 특수문자이므로 wha를 포함한 whale도 찾게 됩니다. 또, 3.14로 찾을때는 3+14 등도 찾게 됩니다.

특수문자가 [] 안과 밖에서 다르다는 점을 생각하여 각각의 경우를 살펴봅시다. 우선 [] 밖의 경우는,

  • \을 특수문자 앞에 붙이기. 예, what\?, 3\.14
  • []을 사용하기. 예, what[?], 3[.]14

첫번째 방법은 보통 escape라고 부르며, 특수문자 앞에 \을 붙여서 특수문자의 특수한 기능을 제거합니다. 두번째 방법은 [] 밖의 많은 특수문자들이 [] 안에서는 일반문자가 되는 점을 이용한 것입니다. 보통 첫번째 방법을 많이 사용합니다.

주의할 점은 첫번째 방법에서 사용하는 \가 뒤에 나오는 특수문자를 일반문자로 만드는 특수문자이기 때문에, 문자 그대로의 \을 나타내려면 \\을 사용해야 합니다. 물론 [\]도 가능합니다.

[] 안의 특수문자는 위치를 바꿔서 처리합니다. 먼저, ^[^abc]와 같이 처음에 나와야만 의미가 있으므로 [abc^]와 같이 다른 위치에 사용하면 됩니다. -[a-z]와 같이 두 문자 사이에서만 의미가 있으므로 [-abc][abc-]와 같이 제일 처음이나 마지막에 사용합니다.

(grep과 같이 도구에 따라 역으로 일반 문자앞에 \를 붙여서 특수문자를 만드는 경우가 있습니다. 아래 각 도구에 대한 설명 참고.)


3. 정규표현식 고급

고급이라고 제목을 붙였지만 여기서는 도구마다 차이가 나거나 없을 수도 있는 내용을 다룹니다.

3.1. 자세한 반복

반복하는 횟수를 자세히 조정할 수 있습니다.

  • {n} - 정확히 n번 반복. a{3}aaa와 같음.
  • {n,} - n번 이상 반복. a{3,}aaaa*와 같음.
  • {n,m} - n번 이상 m번 이하 반복. a{2,4}aaa?a?와 같음.

물론 (abc){2,4}같이 괄호로 반복할 단위를 지정할 수 있습니다. 여기서 {, }*, ?, +와 같이 특수문자임을 주의하길 바랍니다. (엄밀한 의미에서 }은 특수문자가 아닙니다.)

3.2. 기억하기

앞에서 여러 문자를 묶어서 단위로 만드는 괄호는 정규표현식으로 찾은 부분을 기억하여 다른 곳에서 사용할때도 사용합니다. 예를 들어, HTML 제목 테그는 (egrep에서) <[Hh]([1-6])>.*와 같이 찾을 수 있습니다. 여기서 ([1-6])(, )는 사이에 대응된 부분을 기억하여 (첫번째 기억된 내용을) \1에서 사용합니다. 즉, 2>Conclusion2>에서 외에

등은 만족하지 않습니다.

(...)은 여러번 사용할 수 있고 (심지어 겹쳐서도), \n은 기억된 n번째 부분을 지칭합니다. 순서는 기억이 시작되는 (의 순서입니다.

여기에서는 ()이 특수문자이고, 그냥 \(\)는 일반문자이지만, 도구에 따라 반대인 경우도 있습니다.

이 기능은 또 치환에서 자주 사용됩니다. 아래 vi와 sed 부분을 참고하길 바랍니다.

3.3. 단어 찾기

앞에서 the를 찾으면 the 외에 them 등도 같이 찾는 것을 보았습니다. 그러면 정관사 the만 찾으려면 어떻게 할까요?

간단히 정규표현식 앞뒤에 공백을 추가한 the 를 생각해 볼 수 있습니다. 그러나 이 정규표현식에는 두가지 문제가 있습니다. 첫번째는 탭(tab) 등 다른 공백문자가 있기 때문입니다. 두번째는 이 정규표현식으로 the가 줄 제일 앞이나 제일 뒤에 나오는 경우는 찾지 못하기 때문입니다. 물론 [], ^, $|를 복잡하게 결합하여 이들 경우를 모두 처리할 수 있는 정규표현식을 쓸 수 있지만, 자주 사용하는 표현이기 때문에 간단히 할 수 있는 방법이 마련되있습니다.

그것은 \<\>로, \<은 공백에서 공백이 아닌 문자 사이, \>는 공백이 아닌 문자에서 공백 사이의 위치를 나타냅니다. 즉, ^$와 같이 문자에 해당되지않고 위치만을 나타냅니다. 이제 해답은 \입니다.

3.4. 단축 표현들

정규표현식에는 이외에도 자주 사용되는 표현에 대한 단축된 형식을 제공합니다. 예를 들어, vim에서 \i는 (C 언어 인식자 이름에서 사용하는 문자인) [_a-zA-Z0-9]와 같습니다. 그러나 이런 단축된 형식은 도구에 따라 많은 차이가 나기때문에 관련 문서를 참고하길 바랍니다.

POSIX.2에서 정의한 단축 표현은 다음과 같습니다. (C 언어에서 에 선언된 is*() 함수와 비슷한 것을 알 수 있습니다.) 단축된 형식이 나타내는 정확한 값은 locale에 따라 변합니다. 여기서는 영어권에서 사용하는 값을 보입니다. 독일어의 움라우트(a)와 같이 다른 언어권에서는 다른 값을 가질 수 있습니다.

  • [:alnum:] - 알파벳과 숫자. [a-zA-Z0-9]
  • [:alpha:] - 알파벳. [a-zA-Z]
  • [:cntrl:] - 제어문자. ASCII 값으로 0x00-0x1F와 0x7F
  • [:digit:] - 숫자. [0-9]
  • [:graph:] - 제어문자와 공백을 제외한 문자. ASCII 값으로 0x21-0x7E
  • [:lower:] - 소문자. [a-z]
  • [:print:] - 제어문자를 제외한 문자. ASCII 값으로 0x20-0x7E
  • [:punct:] - [:graph:] 중에 [:alnum:]에 속하지 않은 문자. !, @, #, :, ,
  • [:space:] - space, tab, carriage return, new line, vertical tab, formfeed. ASCII 값으로 0x09-0x0D와 0x20
  • [:upper:] - 대문자. [A-Z]
  • [:xdigit:] - 16진수에 사용하는 문자. [0-9a-fA-F]

3.5. 눈으로 보는 정규표현식

정규표현식이 패턴을 찾는 과정을 시각적으로 보여주는 프로그램들이 있습니다.

4. 정규표현식 사용

이제 이런 정규표현식을 실제로 어떻게 사용하는지 알아봅시다. 평소에 많이 사용하는 vi, grep/egrep/fgrep, sed/awk의 예를 들어보겠습니다.

4.1. vi에서

vi에서 정규표현식은 ':'상태에서 사용합니다. (실제로 이 상태에서 실행하는 명령어는 ed나 ex라는 프로그램이 처리하게 됩니다. 그래서 보통 이 상태를 "ed-모드"라고 합니다.) 문서에서 원하는 패턴을 찾으려면, (커서 다음에서 찾을때) /패턴이나 (커서 전에서 찾을때) ?패턴을 사용합니다.

정규표현식은 문자치환과 결합하여 강력한 기능을 합니다. 문자치환 명령은 다음과 같습니다.

:범위s/변경전/변경후/수정자

"범위"는 명령이 실행될 범위를 나타내며, 보통은 현재 편집하고 있는 문서 전체를 지시하는 (첫번째 줄에서 마지막 줄까지를 뜻하는) 1,$나 줄여서 %를 사용합니다.

뒤에 "s"는 치환(substitute) 명령어입니다.

"변경전"과 "변경후"에 치환할 내용을 입력합니다. "변경전"에 정규표현식을 적습니다. 정규표현식으로 ., *, ^, $, [], \(...\), \<...\>, POSIX.2 단축 표현을 사용할 수 있습니다. 여기서 여러 문자를 묶여서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(, \)임을 주의해야 합니다. 반대로 (, )가 일반문자입니다. vim(VI iMproved)에서는 vi에 추가로 |, +, (?와 같은) =, {n,m}을 사용할 수 있지만, 앞에 \를 붙여야 합니다. 또, vim에는 \i, \k, \p, \s 등의 단축 표현들이 있습니다.

"변경후"에 \n&를 사용할 수 있습니다. \n는 "변경전"에서 n번째 \(...\)에 대응하는 부분이고, &는 "변경전"에 만족한 전체를 나타냅니다. 예를 들어, :%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고, :%s/F[1-9][12]*/&/g는 HTML 문서에서 "F1" ~ "F12"란 단어 모두를 굵은 체로 바꿉니다. (주의! &는 정규표현식의 특수문자는 아니지만 vi의 특수문자이므로, 문자그대로의 &를 사용하려면 대신 \&를 사용해야 한다.) 이외에도 (뒤를 모두 대문자로) \u나 (뒤를 모두 소문자로) \l같은 기능이 있습니다.

"수정자"는 치환 명령의 세부사항을 결정합니다. 필요한 것만 뒤에 적어주면 됩니다.

  • g (global) - 한 줄에서 정규표현식을 만족하는 부분을 여러개 찾았을 때 모두다 치환한다. 이 수정자를 사용하지 않으면 처음 것만 치환한다.
  • c (confirm) - 만족하는 정규표현식을 찾았을때 치환하기 전에 확인한다.
  • i (ignore-case) - 대소문자를 무시하고 찾는다. 즉, :%s/[aA][bB][cC]/XXX/ 대신에 :%s/abc/XXX/i를 사용할 수 있다.

마지막으로 주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야합니다. 필요하다면 / 대신 다른 문자를 사용해도 됩니다. 예를 들어, :%s/\/usr\/local\/bin\//\/usr\/bin\//g 대신 :%s#/usr/local/bin/#/usr/bin/#g가 알아보기 더 쉽습니다.

4.2. grep/egrep/fgrep에서

grep은 Global Regular Expression Print(ed 명령어로 :g/re/p)의 준말로 입력에서 원하는 정규표현식을 찾는 명령어입니다. grep에는 egrep과 fgrep이라는 변종이 있습니다. 전통적으로 egrep은 grep 보다 더 다양한 정규표현식을 지원하고, fgrep은 정규표현식을 지원하지 않고 빨리 검색하기 위한 명령어입니다. GNU grep에서 egrep은 grep -E, fgrep은 grep -F와 같습니다.

grep과 egrep 모두 ., *, ?, +, {n,m}, ^, $, |, [], (...), \n, \<...\>, POSIX.2 단축 표현을 지원합니다. 단, grep은 ?, +, {, |, (, )를 일반문자로 보기때문에 특수문자로 사용하려면 앞에 \를 붙여야 합니다.

2006/09/08 22:12 2006/09/08 22:12
이 글에는 트랙백을 보낼 수 없습니다

thegrendel (at) theriver.com



차례

Part 1. 소개
1. 왜 쉘 프로그래밍을 해야 하죠?
2. #! 으로 시작하기
2.1. 스크립트 실행하기
2.2. 몸풀기 연습문제(Preliminary Exercises)
Part 2. 기초 단계
3. 종료와 종료 상태(Exit and Exit Status)
4. 특수 문자
5. 변수와 매개변수 소개
5.1. 변수 치환(Variable Substitution)
5.2. 변수 할당(Variable Assignment)
5.3. Bash 변수는 타입이 없다(untyped)
5.4. 특수한 변수 타입
6. 쿼우팅(quoting)
7. 테스트
7.1. 테스트(Test Constructs)
7.2. 파일 테스트 연산자
7.3. 비교 연산자(이진)
7.4. 중첩된 if/then 조건 테스트
7.5. 여러분이 테스트문을 얼마나 이해했는지 테스트 해보기
8. 연산자 이야기(Operations and Related Topics)
8.1. 연산자(Operators)
8.2. 숫자 상수(Numerical Constants)
Part 3. 중급 단계(Beyond the Basics)
9. 변수 재검토(Variables Revisited)
9.1. 내부 변수(Internal Variables)
9.2. 문자열 조작
9.3. 매개변수 치환(Parameter Substitution)
9.4. 변수 타입 지정: declaretypeset
9.5. 변수 간접 참조
9.6. $RANDOM: 랜덤한 정수 만들기
9.7. 이중소괄호(The Double Parentheses Construct)
10. 루프와 분기(Loops and Branches)
10.1. 루프
10.2. 중첩된 루프
10.3. 루프 제어
10.4. 테스트와 분기(Testing and Branching)
11. 내부 명령어(Internal Commands and Builtins)
11.1. 작업 제어 명령어
12. 외부 필터, 프로그램, 명령어
12.1. 기본 명령어
12.2. 복잡한 명령어
12.3. 시간/날짜 명령어
12.4. 텍스트 처리 명령어
12.5. 파일, 아카이브(archive) 명령어
12.6. 통신 명령어
12.7. 터미널 제어 명령어
12.8. 수학용 명령어
12.9. 기타 명령어
13. 시스템과 관리자용 명령어
14. 명령어 치환(Command Substitution)
15. 산술 확장(Arithmetic Expansion)
16. I/O 재지향
16.1. exec 쓰기
16.2. 코드 블럭 재지향
16.3. 응용
17. Here Documents
18. 쉬어가기
Part 4. 고급 주제들(Advanced Topics)
19. 정규 표현식(Regular Expressions)
19.1. 정규 표현식의 간략한 소개
19.2. Globbing
20. 서브쉘(Subshells)
21. 제한된 쉘(Restricted Shells)
22. 프로세스 치환(Process Substitution)
23. 함수
23.1. 복잡 함수와 함수의 복잡성(Complex Functions and Function Complexities)
23.2. 지역 변수와 재귀 함수(Local Variables and Recursion)
24. 별칭(Aliases)
25. 리스트(List Constructs)
26. 배열
27. 파일들
28. /dev 와 /proc
28.1. /dev
28.2. /proc
29. 제로와 널(Of Zeros and Nulls)
30. 디버깅
31. 옵션
32. 몇 가지 지저분한 것들(Gotchas)
33. 스타일 있게 스크립트 짜기
33.1. 비공식 쉘 스크립팅 스타일시트
34. 자질구레한 것들
34.1. 대화(interactive)형 모드와 비대화(non-interactive)형 모드 쉘과 스크립트
34.2. 쉘 래퍼(Shell Wrappers)
34.3. 테스트와 비교: 다른 방법
34.4. 최적화
34.5. 팁 모음(Assorted Tips)
34.6. 괴상한 것(Oddities)
34.7. 이식성 문제(Portability Issues)
34.8. 윈도우즈에서의 쉘 스크립팅
35. Bash, 버전 2
36. 후기(Endnotes)
36.1. 저자 후기(Author's Note)
36.2. 저자에 대해서
36.3. 이 책을 만드는데 쓴 도구들
36.3.1. 하드웨어
36.3.2. 소프트웨어와 프린트웨어
36.4. 크레딧
서지사항
A. 여러분들이 보내준 스크립트들(Contributed Scripts)
B. Sed 와 Awk 에 대한 간단한 입문서
B.1. Sed
B.2. Awk
C. 특별한 의미를 갖는 종료 코드
D. I/O와 I/O 재지향에 대한 자세한 소개
E. 지역화(Localization)
F. 샘플 .bashrc 파일
G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환
H. 연습문제
I. Copyright
예 목록
2-1. cleanup: /var/log 에 있는 로그 파일들을 청소하는 스크립트
2-2. cleanup: 위 스크립트의 향상되고 일반화된 버전.
3-1. 종료/종료 상태
3-2. !으로 조건을 부정하기
4-1. 코드 블럭과 I/O 재지향
4-2. 코드 블럭의 결과를 파일로 저장하기
4-3. 최근 하루동안 변경된 파일들을 백업하기
5-1. 변수 할당과 치환
5-2. 평범한 변수 할당
5-3. 평범하고 재미있는 변수 할당
5-4. 정수? 문자열?
5-5. 위치 매개변수
5-6. wh, whois 도메인 네임 룩업
5-7. shift 쓰기
6-1. 이상한 변수를 에코하기
6-2. 이스케이프된 문자들
7-1. 무엇이 참인가?
7-2. [ ]test 의 동일함
7-3. (( ))로 산술식 테스트 하기
7-4. 산술 비교와 문자열 비교
7-5. 문자열이 인지 테스트 하기
7-6. zmost
8-1. 산술 연산자 쓰기
8-2. && 와 || 를 쓴 복합 조건 테스트
8-3. 숫자 상수 표기법:
9-1. $IFS 와 빈 칸
9-2. 타임 아웃 처리 입력
9-3. 타임 아웃 처리 입력, 한 번 더
9-4. 내가 루트인가?
9-5. arglist: $* 과 $@ 로 인자를 나열하기
9-6. 일관성 없는 $*$@의 동작
9-7. $IFS 가 비어 있을 때 $*$@
9-8. 밑줄 변수(underscore variable)
9-9. 그래픽 파일을 다른 포맷 확장자로 이름을 바꾸면서 변환
9-10. 매개변수 치환과 : 쓰기
9-11. 변수의 길이
9-12. 매개변수 치환에서의 패턴 매칭
9-13. 파일 확장자 바꾸기:
9-14. 임의의 문자열을 파싱하기 위해 패턴 매칭 사용하기
9-15. 문자열의 접두, 접미어에서 일치하는 패턴 찾기
9-16. declare를 써서 변수 타입 지정하기
9-17. 간접 참조
9-18. awk에게 간접 참조를 넘기기
9-19. 랜덤한 숫자 만들기
9-20. RANDOM 으로 주사위를 던지기
9-21. RANDOM 에 seed를 다시 지정해 주기
9-22. C 형태의 변수 조작
10-1. 간단한 for 루프
10-2. 각 [list] 항목이 인자를 두 개씩 갖는 for
10-3. Fileinfo: 변수에 들어 있는 파일 목록에 대해 동작
10-4. for 문에서 파일 조작하기
10-5. in [list]가 빠진 for
10-6. for 문의 [list]에 명령어 치환 쓰기
10-7. 이진 파일에 grep 걸기
10-8. 특정 디렉토리의 모든 바이너리 파일에 대해 원저작자(authorship)를 확인 하기
10-9. 디렉토리에 들어 있는 심볼릭 링크들을 나열하기
10-10. 디렉토리에 들어 있는 심볼릭 링크들을 파일로 저장하기
10-11. C 형태의 for 루프
10-12. 배치 모드로 efax 사용하기
10-13. 간단한 while 루프
10-14. 다른 while 루프
10-15. 다중 조건 while 루프
10-16. C 형태의 문법을 쓰는 while 루프
10-17. until 루프
10-18. 중첩된 루프
10-19. 루프에서 breakcontinue의 영향
10-20. 여러 단계의 루프에서 탈출하기
10-21. 더 상위 루프 레벨에서 계속하기(continue)
10-22. case 쓰기
10-23. case로 메뉴 만들기
10-24. case용 변수를 만들기 위해서 명령어 치환 쓰기
10-25. 간단한 문자열 매칭
10-26. 입력이 알파벳인지 확인하기
10-27. select로 메뉴 만들기
10-28. 함수에서 select를 써서 메뉴 만들기
11-1. printf가 실제로 쓰이는 예제
11-2. read로 변수 할당하기
11-3. read로 여러줄의 입력 넣기
11-4. read파일 재지향과 같이 쓰기
11-5. 현재 작업 디렉토리 변경하기
11-6. let으로 몇 가지 산술 연산을 하기.
11-7. eval의 효과 보여주기
11-8. 강제로 로그 아웃 시키기
11-9. "rot13" 버전
11-10. 위치 매개변수와 set 쓰기
11-11. 변수를 "언셋"(unset) 하기
11-12. export를 써서, 내장된 awk 스크립트에 변수를 전달하기
11-13. getopts로 스크립트로 넘어온 옵션과 인자 읽기
11-14. 데이타 파일 "포함하기"
11-15. exec 효과
11-16. 작업을 계속 해 나가기 전에 프로세스가 끝나길 기다리기
12-1. CDR 디스크를 구울 때 ls로 목차 만들기
12-2. Badname, 파일 이름에 일반적이지 않은 문자나 공백 문자를 포함하는 파일을 지우기.
12-3. inode 로 파일을 지우기
12-4. 시스템 로그 모니터링용 xargs 로그 파일
12-5. copydir. xargs로 현재 디렉토리를 다른 곳으로 복사하기
12-6. expr 쓰기
12-7. date 쓰기
12-8. 스크립트에서 두 파일을 비교하기 위해 cmp 쓰기.
12-9. 낱말 빈도수 분석
12-10. 10자리 랜덤한 숫자 만들기
12-11. tail로 시스템 로그를 모니터하기
12-12. 스크립트에서 "grep"을 에뮬레이트 하기
12-13. 목록에 들어 있는 낱말들의 유효성 확인하기
12-14. toupper: 파일 내용을 모두 대문자로 바꿈.
12-15. lowercase: 현재 디렉토리의 모든 파일명을 소문자로 바꿈.
12-16. du: 도스용 텍스트 파일을 UNIX용으로 변환.
12-17. rot13: 초허접(ultra-weak) 암호화, rot13.
12-18. "Crypto-Quote" 퍼즐 만들기
12-19. 파일 목록 형식화.
12-20. column 으로 디렉토리 목록을 형식화 하기
12-21. nl: 자기 자신에게 번호를 붙이는 스크립트.
12-22. cpio로 디렉토리 트리 옮기기
12-23. rpm 아카이브 풀기
12-24. C 소스에서 주석을 제거하기
12-25. /usr/X11R6/bin 둘러보기
12-26. basenamedirname
12-27. 인코드된 파일을 uudecode하기
12-28. 저당에 대한 월 상환액(Monthly Payment on a Mortgage)
12-29. 진법 변환(Base Conversion)
12-30. 다른 방법으로 bc 실행
12-31. seq로 루프에 인자를 만들어 넣기
12-32. 키보드 입력을 갈무리하기
12-33. 파일을 안전하게 지우기
12-34. m4 쓰기
13-1. 지움 글자(erase character) 세팅하기
13-2. 비밀스런 비밀번호: 터미널 에코 끄기
13-3. 키누름 알아내기
13-4. pidof 로 프로세스를 죽이기
13-5. CD 이미지 확인하기
13-6. 한 파일에서 한번에 파일 시스템 만들기
13-7. 새 하드 드라이브 추가하기
13-8. killall, /etc/rc .d/init.d 에서 인용
16-1. exec으로 표준입력을 재지향 하기
16-2. 재지향된 while 루프
16-3. 다른 형태의 재지향된 while 루프
16-4. 재지향된 until 루프
16-5. 재지향된 for 루프
16-6. 재지향된 for 루프(표준입력, 표준출력 모두 재지향됨)
16-7. 재지향된 if/then 테스트
16-8. 이벤트 로깅하기
17-1. dummyfile: 두 줄짜리 더미 파일 만들기
17-2. broadcast: 로그인 해 있는 모든 사람들에게 메세지 보내기
17-3. cat으로 여러 줄의 메세지 만들기
17-4. 탭이 지워진 여러 줄의 메세지
17-5. Here document에서 매개변수 치환하기
17-6. 매개변수 치환 끄기
17-7. upload: "Sunsite" incoming 디렉토리에 파일 한 쌍을 업로드
17-8. "아무개"(anonymous) Here Document
20-1. 서브쉘에서 변수의 통용 범위(variable scope)
20-2. 사용자 프로파일 보기
20-3. 프로세스를 서브쉘에서 병렬로 돌리기
21-1. 제한된 모드로 스크립트 돌리기
23-1. 간단한 함수
23-2. 매개변수를 받는 함수
23-3. 두 숫자중 큰 수 찾기
23-4. 숫자를 로마 숫자로 바꾸기
23-5. 함수에서 큰 값을 리턴하는지 테스트하기
23-6. 큰 두 정수 비교하기
23-7. 사용자 계정 이름에서 실제 이름을 알아내기
23-8. 지역 변수의 영역(Local variable visibility)
23-9. 지역 변수를 쓴 재귀 함수
24-1. 스크립트에서 쓰이는 별칭(alias)
24-2. unalias: 별칭을 설정, 해제하기
25-1. "and list"를 써서 명령어줄 인자 확인하기
25-2. "and list"를 써서 명령어줄 인자를 확인하는 다른 방법
25-3. "or lists""and list"를 같이 쓰기
26-1. 간단한 배열 사용법
26-2. 배열의 특별한 특성 몇 가지
26-3. 빈 배열과 빈 원소
26-4. 아주 오래된 친구: 버블 정렬(Bubble Sort)
26-5. 복잡한 배열 어플리케이션: 에라토스테네스의 체(Sieve of Erastosthenes)
26-6. 복잡한 배열 어플리케이션: 기묘한 수학 급수 탐색(Exploring a weird mathematical series)
26-7. 2차원 배열을 흉내낸 다음, 기울이기(tilting it)
28-1. 특정 PID와 관련있는 프로세스 찾기
28-2. 온라인 연결 상태
29-1. 쿠키 항아리를 숨기기
29-2. /dev/zero로 스왑 파일 세팅하기
29-3. 램디스크 만들기
30-1. 버그 있는 스크립트
30-2. test24, 버그가 있는 다른 스크립트
30-3. "assert"로 조건을 테스트하기
30-4. exit 잡아채기(Trapping at exit)
30-5. Control-C 가 눌렸을 때 깨끗이 청소하기
30-6. 변수 추적하기
32-1. 서브쉘 함정(Subshell Pitfalls)
34-1. 쉘 래퍼(shell wrapper)
34-2. 조금 복잡한 쉘 래퍼(shell wapper)
34-3. awk 스크립트 쉘 래퍼(shell wrapper)
34-4. Bash 스크립트에 내장된 펄
34-5. 하나로 묶인 Bash 스크립트와 펄 스크립트
34-6. 자신을 재귀적으로 부르는 스크립트
35-1. 문자열 확장
35-2. 간접 변수 참조 - 새로운 방법
35-3. 배열과 약간의 트릭을 써서 한 벌의 카드를 4명에게 랜덤하게 돌리기
A-1. manview: 포맷된 맨 페이지를 보는 스크립트
A-2. mailformat: 이메일 메세지를 포맷해서 보기
A-3. rn: 간단한 파일이름 변경 유틸리티
A-4. encryptedpw: 로컬에 암호화 되어 있는 비밀번호로 ftp 사이트에 파일을 업로드하는 스크립트
A-5. copy-cd: 데이타 CD를 복사하는 스크립트
A-6. days-between: 두 날짜 사이의 차이를 계산해 주는 스크립트
A-7. behead: 메일과 뉴스 메세지 헤더를 제거해 주는 스크립트
A-8. ftpget: ftp에서 파일을 다운로드 해 주는 스크립트
A-9. password: 8 글자짜리 랜덤한 비밀번호 생성 스크립트
A-10. fifo: 네임드 파이프를 써서 매일 백업해 주는 스크립트
A-11. 나머지 연산자로 소수 생성하기
A-12. tree: 디렉토리 구조를 트리 형태로 보여주는 스크립트
A-13. 문자열 함수들: C 형태의 문자열 함수
A-14. 객체 지향 데이타 베이스
F-1. 샘플 .bashrc 파일
G-1. VIEWDATA.BAT: 도스용 배치 파일
G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

출처 : http://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/index.html

        http://blog.naver.com/misadamo.do?Redirect=Log&logNo=80001904458

2006/09/08 16:23 2006/09/08 16:23
이 글에는 트랙백을 보낼 수 없습니다
출처 카페 > 컴시스템 / ykc1111
원본 http://cafe.naver.com/comsystem1111/244

shell에서 if문에서 쓰이는것들..

유닉스를 잘 안써서 잘몰랐었다..

if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
  BASEDIR="$CATALINA_HOME"
  . "$CATALINA_HOME"/bin/setclasspath.sh
fi


요런걸쓸때 -r이 몰까 모르겠어서 찾아보았다 아래와 같다고 한다..

유닉스쉘을 지금은쓸기회가 없어서 그다지 -_- 필요없어보이긴하나 알고있으면 뭐~ 쓸모있을지도 몰라서 copy해 보았다..


-b 파일 : 파일이 블럭 장치 파일이면 참
-c 파일 : 파일이 문자 장치 파일이면 참
-d 파일 : 파일이 디렉토리이면 참
-e 파일 : 파일이 존재하면 참
-f 파일 : 파일이 정규 파일이면 참
-L 파일 : 파일이 심볼릭 링크이면 참
-p 파일 : 파일이 네임드(named) 파이프이면 참
-S 파일 : 파일이 소켓이면 참
-r 파일 : 파일이 읽기 가능이면 참
-s 파일 : 파일의 크기가 0보다 크면 참
-w 파일 : 파일이 쓰기 가능이면 참
-x 파일 : 파일이 실행 가능이면 참
파일1 -nt 파일2 : 파일1이 파일2보다 새로운 파일이면 참
파일1 -ot 파일2 : 파일1이 파일2보다 오래된 파일이면 참
파일1 -ef 파일2 : 파일1과 파일2가 같은 파일이면 참

문자열식은 문자열에 대한 비교를 한다.

-z 문자열 : 문자열의 길이가 0이면 참
-n 문자열 : 문자일의 길이가 0이 아니면 참
문자열1 = 문자열2 : 문자열1과 문자열2가 같으면 참
문자열1  != 문자열2 : 문자열1과 문자열2가 다르면 참

-h filename
               True if filename exists and is a  symbolic  link.
               With  all  other primitives (except -L filename),
               the symbolic links are followed by default.



문자열 비교
[ string ] - string이 빈 문자열이 아니라면 참
[ string1 = string2 ] - 두 문자열이 같다면 참
[ string1 != string2 ] - 두 문자열이 다르면 참
[ -n string ] - 문자열이 null(빈 문자열) 이 아니라면 참
[ -z string ] - 문자열이 null(빈 문자열) 이라면 참


산술 비교
`[ expr1 -eq expr2 ]` - 두 표현식 값이 같다면 참 ('EQual')
`[ expr1 -ne expr2 ]` - 두 표현식 갑이 같지 않다면 참 ('Not Equal')
[ expr1 -gt expr2 ] - `expr1 > expr2` 이면 참 ('Greater Then')
[ expr1 -ge expr2 ] - `expr1 >= expr2` 이면 참 ('Greater Equal')
[ expr1 -lt expr2 ] - `expr1 < expr2` 이면 참 ('Less Then')
[ expr1 -le expr2 ] - `expr1 <= expr2` 이면 참 ('Less Equal')
[ ! expr ] - expr 이 참이면 거짓, 거짓이면 참
[ expr1 -a expr2 ] - expr1 AND expr2 의 결과 (둘다 참이면 참, 'And')
[ expr1 -o expr2 ] - expr1 OR expr2 의 결과 (둘중 하나만 참이면 참, 'Or')


파일 조건
[ -b FILE ] - FILE 이 블럭 디바이스 이면 참
[ -c FILE ] - FILE 이 문자 디바이스 이면 참.
[ -d FILE ] - FILE 이 디렉토리이면 참
[ -e FILE ] - FILE 이 존재하면 참
[ -f FILE ] - FILE 이 존재하고 정규파일이면 참
[ -g FILE ] - FILE 이 set-group-id 파일이면 참
[ -h FILE ] - FILE 이 심볼릭 링크이면 참
[ -L FILE ] - FILE 이 심볼릭 링크이면 참
[ -k FILE ] - FILE 이 Sticky bit 가 셋팅되어 있으면 참
[ -p FILE ] - True if file is a named pipe.
[ -r FILE ] - 현재 사용자가 읽을 수 있는 파일이면 참
[ -s FILE ] - 파일이 비어있지 않으면 참
[ -S FILE ] - 소켓 디바이스이면 참
[ -t FD ] - FD 가 열려진 터미널이면 참
[ -u FILE ] - FILE 이 set-user-id 파일이면 참
[ -w FILE ] - 현재 사용자가 쓸 수 있는 파일(writable file) 이면 참
[ -x FILE ] - 현재사용자가 실행할 수 있는 파일(Executable file) 이면 참
[ -O FILE ] - FILE 의 소유자가 현재 사용자이면 참
[ -G FILE ] - FILE 의 그룹이 현재 사용자의 그룹과 같으면 참
[ FILE1 -nt F - : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참
[ FILE1 -ot F - : FILE1이 FILE2 보다 오래된 파일이면 참
[ FILE1 -ef F - : FILE1 이 FILE2의 하드링크 파일이면 참

2006/09/08 15:57 2006/09/08 15:57
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 영혼의 소리...카리스마 그리고 이성
원본 http://blog.naver.com/kill_9/100004874536

#!/bin/bash


# 이 스크립트는 해당 디렉토리 이하, 확장자가 txt인 파일의 문자열을 교체한다.

# 서브사이드 스크립트(Server Side Script)의 일괄적인 문자열 교체에 유용하다.


target_dir="/www/htdocs"

target_files=$(find "$target_dir" -name "*.txt" -type f)


# shell 내부변수 조정, 단, bash 버전 2.xx 이상에선 아래의 코드를 사용하지 않아도 된다.

IFS='

'

from_str='원본 문자열'

to_str='치환할 문자열'


# 루프로 해당 디렉토리내의 모든 파일(/www/htdocs 내의 *.txt 파일)을 조사한다

# 파일에 일치하는 패턴이 있으면 치환, redirection 시켜 새로운 파일(파일명.newfile)을 만든다

# 새로운 파일을 기존의 파일명으로 바꾼다.

# 하나의 파일 실행이 끝나면 특정 메세지를 띄운다.

for file in $target_files ; do

  result=$(grep "$from_str" "$file")

  if [ X"$result" != "X" ] ; then

     sed "s;${from_str};${to_str};g" "$file" > ${file}.newfile

     mv -f "${file}.newfile" "$file"

     echo "Changed String : $file"

  fi

done

exit 0

find 로 문자열 찾아서 치환

* 리눅스에서 파일 검색
- Tips/Linux | 2006/06/10 10:17
문자열찾기 방법 1 - 영어만 주로 가능
grep -rw "찾는문자열" ./

문자열찾기 방법 2 - 대/소문자 구분 안하고 검색
grep -i -l "찾는문자열" * -r 2> /dev/null

문자열찾기 방법 3 - 한글, 영어 모두 가능
find . -exec grep -l "찾는문자열" {} \; 2>/dev/null

문자열찾기 방법 4 - 한글,영어, 대소문자 안가리고 검색
find . -exec grep -i -l "찾을문자열" {} \; 2>/dev/null

문자열찾은 후 치환
find . -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \; 2>/dev/null

파일명 찾기
find / -name 파일명 -type f

파일명 찾기(대소문자 구별없음)
find / -iname 파일명 -type f

디렉토리 찾기
find / -name 파일명 -type d

디렉토리 찾기(대소문자 구별없음)
find / -iname 파일명 -type

xargs - 명령 결과를 다른 명령의 아규먼트로 넣기
find . -name "*py" -print | xargs  -i -t cp {} backup

응용은 요고와 같다
find ./* -exec grep -l '찾는문법' {} \; | xargs -i -t perl -pi -e 's/찾을문자열/바꿀문자열 {}
2006/09/08 14:33 2006/09/08 14:33
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)