Linux/CentOS2013. 9. 15. 01:13

Web Server로 설치 후에

 

KDE를 설치하는 과정을 설명하도록 하겠다.

CentOS 버전은 6.4 이며 진행과정은 root권한을 획득한 후 진행한다.


우선 다음 명령으로 [X Window System] 그룹을 인스톨한다.

$ yum groupinstall "X Window System"


그러면 백 개 넘는 패키지가 설치될 것이라고 알려주고 사용자의 대답을 기다린다. "y"를 입력하여 진행한다.

Total download size: 47 M
Installed size: 139 M
Is this ok [y/N]: y


그리고 [KDE Desktop]을 설치한다.

$ yum groupinstall "KDE Desktop"


마찬가지로 백 몇십 개가 되는 패키지를 설치할 것이라고 메세지를 보여주고 사용자의 대답을 기다린다. 역시 "y"를 입력하여 진행한다.


이제 KDE 데스크탑을 실행해준다.

$ startx


참고사이트 : http://selene0301.tistory.com/266

 

 

GNOME를 설치하는 과정을 설명하도록 하겠다.

CentOS 버전은 6.4 이며 진행과정은 root권한을 획득한 후 진행한다.


다음과 같이 [Desktop]을 설치한다.

$  yum groupinstall "Desktop"

 

부팅시 자동으로 GUI 화면으로 부팅되도록 다음 명령어로 편집기를 연다.

$ vi /etc/inittab


다음과 같이 숫자를 3에서 5로 바꾸어주고 재부팅을 한다.

id:5:initdefault:


재부팅을 하면 GUI화면으로 로그인할 수 있다.


참고사이트 : http://selene0301.tistory.com/267

 

 

한글 키보드 설정

$ yum install ibus ibus-hangul ibus-anthy

System > Preferences > Input Method > 한글 선택 
Ctrl + Alt + Backspace
로그인 후에 System tray 에서 설정(한영 전환: Ctrl+Space(기본))


네트워크 설정
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
--------------------------------------------------------------------------------
:

ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=121.***.225.***
NETMASK=255.255.255.0
GATEWAY=121.***.225.***
DNS1=168.126.63.1
DNS2=168.126.63.2
PREFIX=24
DEFROUTE=yes
:
--------------------------------------------------------------------------------
$ service network stop
$ service network start
$ service network restart

만약, 호스트명(hostname)을 확인하려면,
# hostname
변경하려면,
# vi /etc/sysconfig/network
를 수행하여,
HOSTNAME=myhost
처럼 원하는 호스트명으로 수정하고, 저장한 뒤에 리부팅(# init 6)을 수행한다.
결과는 아래와 같다.
[root@myhost ~]# _


기본 프로그램 설치
adobe 프로그램 설치 요구되면, 해당 rpm 다운로드 후에
$ rpm -Uvh adobe-release-i386-1.0-1.noarch.rpm
Midnight Commander 설치
$ yum install mc
Krusader 설치
$ rpm -Uvh krusader-2.3.0-0.3.beta1.el6.R.x86_64.rpm
Teamviewer 설치
$ rpm -Uvh teamviewer_linux.rpm
설치 시에 전송 중지에 의한 오류가 발생하면, 아래와 같이 전송완료처리 후에 재설치
$ yum-complete-transaction


방화벽 설치
시스템 > 소프트웨어 추가/제거 > firewall
√ IPv6 support for iptables
√ Tools for managing Linux kernel packet filtering capabilities
√ system-config-firewall base components and command line tool
√ A text interface for basic firewall setup
√ A graphical interface for basic firewall setup
[적용] 수행
시스템 > 관리 > 방화벽
- 그 외의 포트
  . 5900, tcp, vnc-server
  . 5901, tcp
  . 5902, tcp
- 포트포워딩
  . 소스: eth0, tcp, 5900
  . 수신지: 로컬포트포워딩, 5901


VNC 설치
기존 VNC 중복설치에 의한 충돌의 경우, 아래와 같이 먼저 삭제
$ cd /usr/bin
$ ls -al vnc*
$ rm vnc*
$ yum -y remove vnc
$ yum -y remove vnc-server
VNC 재설치
$ yum -y install vnc
$ yum -y install vnc-server

필요에 따라 화면크기, 색상수 등을 설정
$ vi /usr/bin/vncserver

접속계정 설정
$ vi /etc/sysconfig/vncservers
--------------------------------------------------------------------------------
:
VNCSERVERS="1:username 2:root"
VNCSERVERARGS[1]="-geometry 1024x768"
VNCSERVERARGS[2]="-geometry 1024x768"
--------------------------------------------------------------------------------
접속 암호 설정(계정별 로그인하여 각각 설정 필요)
$ vncpasswd
만약, 계정 1개만 vnc서비스로 수행을 원하고, service vncserver start 수행 시에 오류 발생의 경우,
service vncserver stop 수행 후에 /etc/sysconfig/vncservers 를 수정하고,
root(su) 계정에서 다시 service vncserver start 수행 필요.
이때, /etc/sysconfig/vncservers 에
VNCSERVERS="1:username"
VNCSERVERARGS[1]="-geometry 1024x768"
 이면, /usr/bin/vncserver 설정의
$vncPort = 5900 + $displayNumber; 내용과 같이, 포트번호 5900+1=5901 이므로
해당 포트 5901을 방화벽에서 오픈처리 필요


서비스 시작 시에 수행될 설정내용을 확인하려면,
$ vi /root/.vnc/xstartup

필요시에 방화벽 환경설정 확인하여 변경 후, 재시작
$ netstat -antp
$ vi /etc/sysconfig/iptables
--------------------------------------------------------------------------------
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i eth0 -p tcp --dport 5900 -j MARK --set-mark 0x64
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i eth0 -p tcp --dport 5900 -m mark --mark 0x64 -j DNAT --to-destination :5901
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -m state --state NEW -m tcp -p tcp --dport 5901 -m mark --mark 0x64 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5900 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5901 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5902 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
--------------------------------------------------------------------------------
$ /etc/rc.d/init.d/iptables restart
방화벽 포트 확인 후에 vncserver 시작
$ iptables -nvL
$ netstat -tpln|grep "5900"
$ service vncserver stop
$ service vncserver start
또는
$ service vncserver restart

시스템 시작 시에 vncserver 구동을 위해 등록
$ chkconfig vncserver on


openSSL 설치
$ yum -y install openssl* (기설치된 상태)
yum install mod_ssl openssl (기설치된 상태)

self-signed certificate 생성

OpenSSL을 이용해 self-signed certificate를 생성한다. 위에서 쓴 글이지만 서비스를 할 예정이라면 verisign과 같은 업체에서 인증서를 사서 써야겠지만 개인 사이트라면 self-signed certificate 라면 충분하다고 한다. 다음과 같이 입력하거나 복사&붙여넣는다.


인증서 생성에 대한 보다 자세한 설명은 아래 링크를 참조한다.

http://dimdim.tistory.com/50


private key 생성

# openssl genrsa -out ca.key 1024


CSR(Certificate Signing Request) 생성

# openssl req -new -key ca.key -out ca.csr

:
[예제] : [자신의정보입력]

Country Name (2 letter code) [XX]:KR
State or Province Name (full name) []:Seoul
Locality Name (eg, city) [Default City]:Seocho-gu
Organization Name (eg, company) [Default Company Ltd]:Company Incorporate
Organizational Unit Name (eg, section) []:Technical Support Dept.
Common Name (eg, your name or your server's hostname) []:company.com
Email Address []:company@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
:

Self signed key 생성

# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt


다음 위치에 files을 복사한다.

# cp ca.crt /etc/pki/tls/certs

# cp ca.key /etc/pki/tls/private/ca.key

# cp ca.csr /etc/pki/tls/private/ca.csr


SELinux 에 의해 Certificate files이 삭제될 수 있다.
이로 인해 삭제된 구문을 원복시키기 위해 다음 명령어를 쓴다.
삭제된 경우, 이 명령어를 통해 복원 된다. 

# restorecon -RvF /etc/pki

/etc/pki/* 하위의 모든 폴더나 파일에서 삭제된 구문을 복원한다.


# vi /etc/httpd/conf.d/ssl.conf

아파치의 ssl 설정을 변경하기 위해 편집기로 열어 아래와 같이 수정한다.


SSLCertificateFile /etc/pki/tls/certs/ca.crt

SSLCertificateKeyFile /etc/pki/tls/private/ca.key


# service httpd restart


3. SSL VirtualHost 추가

SSL은 443 포트를 사용하기 때문에 이를 위한 Virtualhost를 추가한다.


# vi /etc/httpd/conf/httpd.conf

httpd 설정 파일을 편집기로 열어 마지막 위치에 아래 내용을 입력한다. httpd.conf 파일 내에 예제로 적혀있는 내용이 있으니 복사&붙여넣기 하면 된다.


# SSL Virtual host add

NameVirtualHost *:443


# SSL Virtual host add
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/ca.crt
    SSLCertificateKeyFile /etc/pki/tls/private/ca.key
    ServerAdmin starkapin@tistory.com
    DocumentRoot /var/www/html
    ServerName ssl.starkapin.com
    ErrorLog logs/ssl_starkapin_com_error_log
    CustomLog logs/ssl_starkapin_com_error_log common
</VirtualHost>


# service httpd restart


4. 방화벽 설정

443 포트를 방화벽으로 허용시켜준다.


# vi /etc/sysconfig/iptables

편집기로 불러와 아래 내용을 추가한다.


-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT


# service iptables restart


이제 웹으로 접속해서 확인 하면 인증서 경고가 발생하며 접속됨을 확인 할 수 있다.

https://127.0.0.1/



APM 설치
최신 php 버전이 보안관련하여, safe_mode 옵션항목 등이 삭제된 관계로
kcp에서 제공한 실행파일을 php에서 사용이 불가하여, php 5.3.10 설치수행이 필요

@ 설치된 버전 확인

# yum search php

# yum list installed | grep php

# php -v

@ 필수 설치 패키지 확인
# yum list libtool
# yum list libtool-ltdl
# yum list libtool-ltdl-devel

 

@권한 확인: 755이상으로 설정

# ls –al /app
# ls -al /app/ora11g/11g/network/admin/tnsnames.ora

 

@rpm으로 설치된 httpd를 확인 및 삭제

# rpm -qa | grep http
httpd-2.2.15-29.el6.centos.x86_64
httpd-tools-2.2.15-29.el6.centos.x86_64
jakarta-commons-httpclient-3.1-0.7.el6_3.x86_64
httpd-manual-2.2.15-29.el6.centos.noarch
# rpm -e --nodeps httpd-2.2.15-29.el6.centos.x86_64
# rpm -e --nodeps httpd-tools-2.2.15-29.el6.centos.x86_64


@ 패키지 제거 및 설치
# rpm -qa httpd php mysql

mysql-5.1.69-1.el6_4.x86_64
php-5.3.3-23.el6_4.x86_64
# yum remove -y httpd php mysql

:

Dependency Removed:
  akonadi.x86_64 0:1.2.1-2.el6                                                 
  kdepim.x86_64 6:4.3.4-6.el6                                                  
  kdepim-libs.x86_64 6:4.3.4-6.el6                                             
  kdepim-runtime.x86_64 0:4.3.4-5.el6                                          
  kdepim-runtime-libs.x86_64 0:4.3.4-5.el6                                     
  kdepimlibs-akonadi.x86_64 0:4.3.4-4.el6                                      
  mysql-server.x86_64 0:5.1.69-1.el6_4                                         

Complete!
# rm -fR php

# rm /usr/local/lib/php.ini

 

 

@ 서버운영에 필요한 소스 및 라이브러리 추가
설치된 것 외에 210개가 추가로 설치된다.
# yum -y install ORBit2 PyXML a2ps acpid alsa-lib amtu aspell at atk audiofile audit-libs-python autoconf autofs automake avahi avahi-glib bc bind bind-chroot bind-libs bind-utils cairo ccid compat-libstdc++-33 conman cpp cpuspeed crash createrepo crypto-utils cryptsetup-luks cups-libs cvs cyrus-sasl-md5 cyrus-sasl-plain db4-devel dbus-python device-mapper-multipath dhcp dhcp-devel dialog dmraid dos2unix dosfstools dump e2fsprogs-devel ed eject elfutils elfutils-libs enscript expat-devel expect expect-devel expectk fetchmail file finger flex fontconfig fontconfig-devel foomatic freetype freetype-devel ftp gcc gcc-c++ gd gd-devel gd-progs gdb gdbm-devel gettext gfs2-utils glib2-devel glibc-devel glibc-headers gmp-devel gnutls gpm gtk2 hal hdparm hesiod hicolor-icon-theme imake iptraf iptstate ipvsadm irqbalance jwhois kernel-devel kernel-headers keyutils-libs-devel kpartx krb5-devel krb5-workstation ksh lcms lftp libICE libSM libX11 libX11-devel libXau libXau-devel libXcursor libXdmcp libXdmcp-devel libXext libXfixes libXft libXi libXinerama libXpm libXpm-devel libXrandr libXrender libXt libXxf86vm libaio libaio-devel libart_lgpl libbonobo libc-client libcurl-devel libdaemon libevent libfontenc libgomp libgssglue libhugetlbfs libhugetlbfs-devel libidn-devel libjpeg libjpeg-devel libmng libnl libnl-devel libpcap libpng libpng-devel libselinux-devel libselinux-python libsepol-devel libsmi libstdc++-devel libsysfs libtiff libtool libtool-ltdl libwvstreams libxml2-devel libxml2-python libxslt libxslt-python lksctp-tools logwatch lrzsz lsof m2crypto mailcap mailx make man man-pages man-pages-ko mc mcstrans mdadm memtest86+ mesa-libGL mesa-libGL-devel mgetty microcode_ctl mkbootdisk mlocate mrtg mt-st mtools mtr mutt nc ncurses-devel net-snmp-libs netpbm nfs-utils nfs-utils-lib nmap nscd nss_db ntp ntsysv numactl oddjob openssh-clients openssl-devel pam-devel pam_krb5 pam_passwdqc pam_pkcs11 pango parted parted-devel patch pax pciutils pcsc-lite perl perl-Archive-Tar perl-BSD-Resource perl-Compress-Zlib perl-DBI perl-Digest-HMAC perl-Digest-SHA1 perl-HTML-Parser perl-HTML-Tagset perl-IO-Socket-INET6 perl-IO-Socket-SSL perl-IO-Zlib perl-Net-IP perl-Net-SSLeay perl-Newt perl-Socket6 perl-String-CRC32 perl-URI perl-libwww-perl pkgconfig pm-utils postgresql-libs prelink procmail psacct psutils pulseaudio-esound-compat pyOpenSSL pykickstart pyorbit pyparted python-pyblock pyxf86config quota rdate rdist readahead rmt rpcbind rpm-build rsh rsync rusers rwho samba samba-client samba-common samba-swat sendmail sendmail-cf setools setserial setuptool shared-mime-info sip sos spamassassin squashfs-tools strace stunnel symlinks sysfsutils syslinux sysstat system-config-date system-config-firewall talk tcl tcp_wrappers tcpdump tcsh telnet telnet-server time tk tmpwatch traceroute tree ttmkfdir unix2dos unixODBC unzip usbutils usermode vconfig vim-common vim-enhanced vsftpd wget wireless-tools words xfsprogs xfsprogs-devel xinetd xorg-x11-proto-devel yp-tools ypbind ypserv zip zlib-devel GConf2 ImageMagick ImageMagick-perl avahi-libs bwidget cloog-ppl crda cryptsetup-luks-libs cups db4-cxx deltarpm desktop-file-utils device-mapper-multipath-libs dmidecode dmraid-events docbook-dtds flac foomatic-db foomatic-db-filesystem foomatic-db-ppds ghostscript ghostscript-fonts gnome-doc-utils-stylesheets gnome-python2 gnome-python2-canvas gnome-user-docs gnome-vfs2 gpm-libs groff-perl gstreamer gstreamer-tools hal-info hal-libs html2ps hunspell iw jasper-libs kpathsea lcms-libs libIDL libX11-common libXcomposite libXdamage libXdamage-devel libXext-devel libXfixes-devel libXfont libXres libXtst libXxf86vm-devel libasyncns libcanberra libcanberra-gtk2 libcom_err-devel libcroco libdrm-devel libedit libglade2 libgnomecanvas libgsf libnetfilter_conntrack libnfnetlink libnotify libogg libpaper librsvg2 libsamplerate libsndfile libtalloc libtasn1 libtdb libthai libtirpc libusb1 libvorbis libwmf-lite libwnck libxcb libxcb-devel lm_sensors-libs mesa-dri-drivers mozilla-filesystem mpfr mrtg-libs netpbm-progs notification-daemon ntpdate openjpeg-libs pcsc-lite-libs perl-Compress-Raw-Zlib perl-Crypt-OpenSSL-Bignum perl-Crypt-OpenSSL-RSA perl-Crypt-OpenSSL-Random perl-Date-Manip perl-Digest-SHA perl-Encode-Detect perl-ExtUtils-MakeMaker perl-ExtUtils-ParseXS perl-IO-Compress-Base perl-IO-Compress-Zlib perl-Mail-DKIM perl-MailTools perl-Module-Pluggable perl-Net-DNS perl-Net-LibIDN perl-NetAddr-IP perl-Package-Constants perl-Pod-Escapes perl-Pod-Simple perl-SNMP_Session perl-Test-Harness perl-Time-HiRes perl-TimeDate perl-YAML-Syck perl-devel perl-libs perl-version pixman poppler poppler-data poppler-utils portreserve ppl psutils-perl pulseaudio pulseaudio-libs pycairo pygobject2 pygtk2 pygtk2-libglade python-decorator python-deltarpm python-slip python-slip-dbus rarian rarian-compat rtkit samba-winbind-clients setools-console setools-gui setools-libs setools-libs-tcl sgml-common sgpio sound-theme-freedesktop speex startup-notification system-config-date-docs system-config-firewall-tui tex-preview texinfo texinfo-tex texlive texlive-dvips texlive-latex texlive-texmf texlive-texmf-dvips texlive-texmf-errata texlive-texmf-errata-dvips texlive-texmf-errata-fonts texlive-texmf-errata-latex texlive-texmf-fonts texlive-texmf-latex texlive-utils tokyocabinet urlview urw-fonts usermode-gtk xcb-util xml-common xorg-x11-font-utils xulrunner xz xz-lzma-compat yelp lksctp-tools-devel apr-util apr-util-devel libtool-ltdl-devel libmcrypt libmcrypt-devel gmp mhash mhash-devel gdbm zlib curl g++ openssl bzip2-devel libc-client-devel bison system-config-securitylevel

@ cmake 설치
# cd /usr/local/src
http://www.cmake.org 에서 최신 버전을 확인하여 해당 버전으로 설치한다.
# wget http://www.cmake.org/files/v2.8/cmake-2.8.11.2.tar.gz (최신버전)
# tar zxvf cmake-2.8.11.2.tar.gz (최신버전)
# cd cmake-2.8.11.2 (최신버전)
# ./bootstrap
# make; make install

@ mysql 최신버전 설치
# cd /usr/local/src
http://www.mysql.com/downloads/mysql/ 에서 Source Code 중,
Generic Linux (Architecture Independent), Compressed TAR Archive 최신버전을 Download 수행한다.
# wget http://www.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.13.tar.gz/from/http://mirror.khlug.org/mysql/ (최신버전)

# tar zxvf mysql-5.6.13.tar.gz (최신버전) 

# cd mysql-5.6.13  (최신버전) 
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DENABLED_LOCAL_INIFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DWITH_SSL=system -DWITH_ZLIB=system -DENABLED_LOCAL_INFILE=1 -DWITH_READLINE=1 -DWITH_VALGRIND=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_DATADIR=/usr/local/mysql/data

실행 중에 아래와 같은 오류가 발생하면,
:
CMake Error at configure.cmake:1071 (MESSAGE):
  Unable to find Valgrind header files
  valgrind/memcheck.h;valgrind/valgrind.h.  Make sure you have them in your
  include path.
Call Stack (most recent call first):
  CMakeLists.txt:314 (INCLUDE)

-- Configuring incomplete, errors occurred!
일부 패키지가 미설치된 상태이므로 다음과 같이 설치한다.
# yum install valgrind
yum install valgrind-devel
기존 소스를 모두 지우고, tar 실행부분부터 다시 수행한다.
# cd ..
# rm -fR mysql-5.6.13

wget 명령 다음, tar 부분부터 다시 수행...


# make; make install

# groupadd mysql
# useradd -M -o -r -d /usr/local/mysql -s /sbin/nologin -c "Mysql Server" -u 27 -g mysql mysql >/dev/null 2>&1 || :
# chown -R root:mysql /usr/local/mysql; chown -R mysql:mysql /usr/local/mysql/data
# cd /usr/local/mysql; ./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

@ 비밀번호 설정
# cp support-files/mysql.server /etc/init.d/mysqld
# cp support-files/my-huge.cnf /etc/my.cnf --> 메모리 1G 이상
# cp support-files/my-medium.cnf /etc/my.cnf
mysql-5.6.13 에는 support-files 아래에 실행에 필요한 cnf 파일이 미존재하여
첨부된 기존 버전의 my.cnf를 /etc/my.cnf로 저장한다. 

my.cnf

# vi /etc/init.d/mysqld ##### datadir 찾아서 datadir=/usr/local/mysql/data 라고 입력
# service mysqld start
# chkconfig --add mysqld
# chkconfig --level 35 mysqld on (런레벨 35일때 자동 실행 된다)
# chkconfig --list | grep mysqld
@ 리부팅시 서비스 실행하지 않으려면 - chkconfig mysqld off
# /usr/local/mysql/bin/mysqladmin -u root password
설치 작업이 끝났다면 익명접근권한을 삭제하자. ( mysql 콘솔에 그냥 접근을 못하게 해야 함.)
# /usr/local/mysql/bin/mysql -u root -p
# Enter password:
# mysql> USE mysql;
# mysql> delete from user where password = "";
# mysql> exit
# /usr/local/mysql/bin/mysqladmin -u root -p reload
# Enter password:

@ cronolog 설치(apache log 분할) 

# cd /usr/local/src
# wget http://www.youtu.kr/mirror/cronolog-1.6.2.tar.gz
# tar xvf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure
# make;make install 


 

Apache 설치

1. 라이브러리 설치
yum -y install gcc
yum -y install openssl-devel
yum -y install apr-devel
yum -y install apr-util-devel
yum -y install pcre-devel
yum -y install zlib-devel
 
 
2. 아파치 다운로드 & 컴파일 
# cd /usr/local/src 
# wget http://linux-files.com/httpd/httpd-2.4.6.tar.gz  (http://linux-files.com/httpd/ 에서 최신버전 검색하여 버전 수정 후에 수행)
# tar zxvf httpd-2.4.6.tar.gz
# cd httpd-2.4.6
 

./configure 옵션 설명

--prefix=/usr/local/apache : 아파치의디렉토리설정 

--enable-so : DSO 방식으로 설치 

--enable-ssl : SSL/TLS지원 (mod_ssl) 

--with-mpm=worker : 아파치프로세스가 사용할 멀티스레드방식으로 지정 

Worker, beos, prefork, mpm_os2, prechild, leader,threadpool 등으로 설정가능 

Worker는 멀티프로세싱 모듈, 멀티스레드, 멀티프로세스 지원 

--disable-access : 호스트기반의 접근제어 

--disable-auth : 사용자기반 접근제어 

--enable-auth-anon : 익명 사용자 액세스를 위한 옵션 

--enable-auth-dbm : 암호인증방식으로 DBM 데이터베이스의 인증방식을 지원 

--enable-auth-digest :암호인증방식으로 RFC2617에 따른 digest를 지원 

--disable-status : 아파치프로세스/스레드 모니터링을 지원하지 않도록 하는 옵션 

--disable-autoindex: 디렉토리리스팅을 지원 

--enable-speling : 보편적으로 알려진 URL가운데 URL스펠링을 고쳐주는 스펠링보정기능을 위한 옵션 

--with-port-PORT : 아파치에서 사용할 포트번호를 지정 

--enable-disk-cache : 디스크 캐싱 기능을 위한 모듈을 넣을 수 있다. 

--enable-auth-ldap : LDAP기반 인증을 지원하기 위한 옵션 

./configure 수행 시에 아래와 같은 오류가 발생하는 경우, 해당 httpd 버전에 필요한 lib가 없기 때문이다.
checking for chosen layout... Apache
checking for working mkdir -p... yes
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
configure: 
configure: Configuring Apache Portable Runtime library...
configure: 
configure: error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.

현재 설치된 버전을 확인
# yum list |grep apr
apr.x86_64                             1.3.9-5.el6_2                   @anaconda-CentOS-201303020151.x86_64/6.4
apr-devel.x86_64                       1.3.9-5.el6_2                   @base    
apr-util.x86_64                        1.3.9-3.el6_0.1                 @anaconda-CentOS-201303020151.x86_64/6.4
apr-util-devel.x86_64                  1.3.9-3.el6_0.1                 @base    
apr-util-ldap.x86_64                   1.3.9-3.el6_0.1                 @anaconda-CentOS-201303020151.x86_64/6.4
apr.i686                               1.3.9-5.el6_2                   base     
apr-devel.i686                         1.3.9-5.el6_2                   base     
apr-util.i686                          1.3.9-3.el6_0.1                 base     
apr-util-devel.i686                    1.3.9-3.el6_0.1                 base     
apr-util-mysql.x86_64                  1.3.9-3.el6_0.1                 base     
apr-util-odbc.x86_64                   1.3.9-3.el6_0.1                 base     
apr-util-pgsql.x86_64                  1.3.9-3.el6_0.1                 base     
apr-util-sqlite.x86_64                 1.3.9-3.el6_0.1                 base     
haproxy.x86_64                         1.4.22-5.el6_4                  updates  

해당 lib를 다운로드하여 해당 디렉토리에 압축해제를 수행하고 다시 configure를 수행한다.
1. For Apache 2.4.x - you need apr and apr-util 1.4.x or later
(means most probably you do not have them yet in you OS repos
and need manually download them form http://apr.apache.org/download.cgi)
2. Extract them to ./srclib/apr 
and ./srclib/apr-util directory respectively.
3. Download -deps files for your Apache build from
http://httpd.apache.org/download.cgi#apache24
(I used this one - http://www.sai.msu.su/apache//httpd/httpd-2.4.6-deps.tar.gz)
4. Extract -deps files to your ./srclib/apr directory
5. Use --with-included-apr switch with ./configure script

# ./configure --prefix=/usr/local/apache  --enable-mods-shared=most --enable-ssl --with-ssl=/usr/local/openssl --enable-modules=ssl --enable-rewrite --with-included-apr --with-included-apr-util --enable-deflate --enable-expires --enable-headers --enable-proxy --enable-mpms-shared=all
 
# make && make install
 
3. 데몬등록
# /usr/local/apache/bin/apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  event.c
# cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
@ chkconfig를 이용해서 자동실행 등록해야 하지만 이전에 실행 스크립트 파일에 아래 내용 추가가 선행되어야 한다.
# vi /etc/init.d/httpd
-httpd 파일의 맨 끝에 아래의 내용... 
-----------------------------------------------  

# chkconfig: 2345 90 90
description: init file for Apache server daemon
processname: /usr/local/apache/bin/apachectl
config: /usr/local/apache/conf/httpd.conf
pidfile: /usr/local/apache/logs/httpd.pid 
-----------------------------------------------  
여기까지를 추가한다.

* chkconfig: 345 85 15

345는 부팅시 런레벨 3,4,5 에서 구동됨을 의미.

85는 데몬 실행 우선순위, 15는 데몬 종료 우선순위를 의미.

# chkconfig --add httpd

# chkconfig --list | grep httpd 
  
4. apache 설정 변경

# vi /usr/local/apache/conf/httpd.conf
주석을 해제하고 서버이름이나 IP주소를 설정합니다.

ServerName xxx.xxx.xxx.xxx (IP주소)
KeepAlive ON
서버관리자 메일주소 설정
ServerAdmin webmaster@localhost
인터넷주소 rewrite 모드 사용을 위한 설정
AllowOverride None  AllowOverride All

 

루트 디렉토리 설정에 대해 알맞게 수정

#DocumentRoot "/usr/local/apache/htdocs"

DocumentRoot "/home

#<Directory "/usr/local/apache/htdocs">

<Directory "/home">

웹 페이지 접속시 기본적으로 읽어 들일 파일명 설정 

DirectoryIndex index.html 를 찾아 DirectoryIndex index.html index.htm index.php index.php3 index.cgi index.jsp 로 수정
아래와 같이 추가 합니다.
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .htm .html .php .ph php3 .php4 .phtml .inc -->추가
AddType application/x-httpd-php-source .phps -->추가
주석제거 
# AddHandler cgi-script .cgi
몇가지 주석 및 제거 - 필요에 따라 더 적용해도 무방함
Include conf/extra/httpd-mpm.conf <-- 주석제거
Include conf/extra/httpd-userdir.conf <-- 주석제거
Include conf/extra/httpd-vhosts.conf <-- 주석제거
Include conf/extra/httpd-default.conf <-- 주석제거
<Directory />
Options FollowSymLinks

#AllowOverride None

AllowOverride All

Order deny,allow

#Deny from all <-- 주석처리
</Directory>


# vi /usr/local/apache/conf/extra/httpd-userdir.conf
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec 를
Options MultiViews SymLinksIfOwnerMatch IncludesNoExec 로
Indexes 를 삭제 한다.
# vi /usr/local/apache/conf/extra/httpd-vhosts.conf
내용을 모두 삭제하고 구문만 적용후 저장 - 저장방법은 :wq 인 것은 아시죠...^^
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /usr/local/apache/htdocs/
ServerName *
</VirtualHost>


#NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot /usr/local/apache/htdocs/
    ServerName www.도메인주소
    ErrorLog logs/도메인주소.error_log
    #CustomLog logs/dummy-host2.example.com-access_log common
</VirtualHost>

# /etc/init.d/httpd start 수행 시에 아래와 같은 오류가 발생하는 경우,
AH00526: Syntax error on line 10 of /usr/local/apache/conf/extra/httpd-userdir.conf:
Invalid command 'UserDir', perhaps misspelled or defined by a module not included in the server configuration
# vi /usr/local/apache/conf/httpd.conf 로 들어가서
LoadModule userdir_module /etc/httpd/modules/mod_userdir.so 부분의 주석을 제거

# /etc/init.d/httpd start 수행 시에 아래와 같은 오류가 발생하는 경우,
AH00534: httpd: Configuration error: No MPM loaded.
# vi /usr/local/apache/conf/httpd.conf 로 들어가서
LoadModule mpm_event_module modules/mod_mpm_event.so 부분의 주석을 제거
(특정 LoadModule에 대한 오류가 발생한 경우, 해당 부분의 주석을 제거하여 재실행)
 

# /etc/init.d/httpd start 를 실행했을 때,
httpd: Syntax error on line 144 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/modules/mod_mpm_event.so into server: /usr/local/apache/modules/mod_mpm_event.so: cannot open shared object file: No such file or directory
와 같은 오류가 발생하는 경우, 해당 라인으로 이동(:144)하여 주석처리 후 재실행 하되,
AH00557: httpd: apr_sockaddr_info_get() failed for 도메인명
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
와 같은 오류가 추가로 발생하는 경우,
# cd /etc
# cp hosts hosts.old 를 수행하여 백업하고,
# vi hosts 를 수행하여,
127.0.0.1   localhost.localdomain localhost 도메인명
서버에할당된주소 도메인주소
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
로 수정하고 저장한 후,
# /etc/init.d/httpd start 를 실행하면 정상 수행되어야 한다.


@ 접속이 안될경우 80포트 열어 주어야 한다.
# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT =>추가
# /etc/init.d/iptables restart 또는 service iptables restart
# service iptables restart 를 재수행해준다.

@ 기타 모듈 설치 (아래 PHP 설치 시에 라이브러리로 사용될 모듈)
# cd /usr/local/src
# mkdir etc
# cd etc
# wget
http://download.savannah.gnu.org/releases/freetype/freetype-2.4.8.tar.gz
# wget
http://www.peregrinehw.com/downloads/gd/gd-2.0.33.tar.gz
# wget
http://www.youtu.kr/mirror/jpegsrc.v6b.tar.gz
# wget
http://sourceforge.net/projects/libpng/files/libpng15/1.5.18/libpng-1.5.18.tar.gz
# wget
http://www.youtu.kr/mirror/imap-2004g.tar.bz2
# wget http://heanet.dl.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz
# wget
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.30.tar.gz 
# tar zxvf freetype-2.4.8.tar.gz; tar zxvf gd-2.0.33.tar.gz; tar zxvf jpegsrc.v6b.tar.gz; tar zxvf libpng-1.5.18.tar.gz; tar jxvf imap-2004g.tar.bz2; tar zxvf libmcrypt-2.5.8.tar.gz; tar zxvf libiconv-1.14.tar.gz; tar zxvf pcre-8.30.tar.gz;
# cd /usr/local/src/etc/jpeg-6b; mkdir -p /usr/local/libjpeg/bin; mkdir -p /usr/local/libjpeg/man/man1; make clean;make -j4; make install; cp -f libjpeg.a /usr/local/lib; cp -f *.h /usr/include
# cd /usr/local/src/etc/libpng-1.5.18
# cp scripts/makefile.linux Makefile
# make clean;make -j4;make install
# cd /usr/local/src/etc/freetype-2.4.8
# make clean;./configure --prefix=/usr/local/freetype;make -j4;make install
# cd /usr/local/src/etc/gd-2.0.33
# make clean;./configure --prefix=/usr/local/gd;make -j4;make install
# cd /usr/local/src/etc/imap-2004g
# make clean;make slx SPECIALS="SSLDIR=/usr SSLINCLUDE=/usr/include SSLLIB=/usr/lib"
# cd /usr/local/src/etc/imap-2004g/c-client
# cp -f c-client.a /usr/lib; cp -f rfc822.h mail.h linkage.h /usr/include
# cd /usr/local/src/etc/libmcrypt-2.5.8
# make clean;./configure --prefix=/usr/local;make -j4;make install
# cd /usr/local/src/etc/libiconv-1.14
# make clean;./configure --prefix=/usr/local;make -j4;make install
# ln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2
# cd /usr/local/src/etc/pcre-8.30 
# make clean;./configure --prefix=/usr/local;make -j4;make install 

PHP 설치
 
1.php 다운로드 & 라이브러리 컴파일
yum -y install zlib curl
yum -y install openssl openssl-devel
yum -y install libtermcap-devel ncurses-devel libc-client-devel bzip2-devel
yum -y install bison
yum -y install libpng

yum install net-snmp net-snmp-devel
yum -y install libjpeg-devel libpng-devel freetype-devel gd-devel libtermcap-devel ncurses-devel libxml2-devel libc-client-devel bzip2-devel
rpm -qa gcc* cpp* compat-gcc* flex* openssl*
rpm -qa libjpeg* libpng* freetype* gd-*

cd /usr/local/src
wget http://graphics.cs.uni-sb.de/NMM/Download/external/jpegsrc.v6b.tar.gz
wget http://www.ijg.org/files/jpegsrc.v6b.tar.gz 
tar xvfz jpegsrc.v6b.tar.gz
cd jpeg-6b/
cp /usr/share/libtool/config/config.guess ./
cp /usr/share/libtool/config/config.sub ./  
mkdir /usr/local/jpeg  

mkdir /usr/local/jpeg/include  

mkdir /usr/local/jpeg/lib  

mkdir /usr/local/jpeg/bin  

mkdir /usr/local/jpeg/man  

mkdir -p /usr/local/man/man1
mkdir /usr/local/jpeg/man/man1
./configure --enable-shared --enable-static

./configure --prefix=/usr/local/jpeg --enable-shared --enable-static  

make && make install

make libdir=/usr/lib64  

make install  

에러 발생 원인 및 해결법

 config.guess와 config.sub 를 복사하지 않는 다면 configure 시에 아래와 같은 메세지가 나온다.

checking host system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized

  
 미리 mkdir 명령어로 디렉토리를 만들지 않는다면 아래와 같은 메세지가 나온다.

                /usr/bin/install -c -m 644 jconfig.h /usr/local/jpeg/include/jconfig.h
                /usr/bin/install: cannot create regular file `/usr/local/jpeg/include/jconfig.h': No such file or directory
                make: *** [install-headers] Error 1

 man 과 man1 디렉토리를 만들지 않는다면 아래와 같은 메세지가 나온다.

                /usr/bin/install -c -m 644 ./cjpeg.1 /usr/local/jpeg/man/man1/cjpeg.1
                /usr/bin/install: cannot create regular file `/usr/local/jpeg/man/man1/cjpeg.1': No such file or directory

 64bit arch를 사용한다면 make할때 libdir=/usr/lib64 옵션을 주어야 한다.
 

cd /usr/local/src
wet http://cdnetworks-kr-1.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
tar xvfz libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
make && make install

# cd /usr/local/src
# wget http://kr2.php.net/get/php-5.3.10.tar.gz/from/kr.php.net/mirror
# wget http://museum.php.net/php5/php-5.3.10.tar.gz 
# tar zxvf php-5.3.10.tar.gz
# cd php-5.3.10
# make clean
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs --with-config-file-path=/usr/local/lib --with-gd --with-freetype-dir=/usr/local/freetype --with-zlib --enable-sockets --enable-gd-native-ttf --with-png-dir=/usr/local/lib --with-jpeg-dir=/usr/local/lib --enable-sigchild --enable-magic-quotes --with-gettext --enable-mbstring --enable-inline-optimization --enable-bcmath --enable-shmop --enable-calendar --enable-ftp --with-gdbm --with-iconv=/usr/local --enable-mbregex --with-imap --with-imap-ssl --with-openssl --with-curl --enable-soap --disable-debug --with-mcrypt=/usr/local/libmcrypt --with-kerberos --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mod-charset --enable-safe-mode --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-snmp --with-zlib-dir --enable-exif --with-xpm-dir --with-libxml-dir --with-pcre-dir --enable-sqlite-utf8 --with-regex=php --with-bz2
...
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+
Thank you for using PHP.
[root@ns php-5.3.10]# 

위와 같이 표시되어야 정상수행된 것입니다. 확인하시기 바랍니다. 

# make -j4; make install 

# cp php.ini-production /usr/local/lib/php.ini --> 5.3.0 이후 버전 


------------------------------------------------------------------------------------------
컴파일 오류시 대처
컴파일 오류는 해당 라이브러리 미설치 또는 configure 옵션설정 오류가 대부분입니다.
반드시, configure의 옵션설정부분의 라이브러리 설치를 확인하고, 옵션 오류가 없는 지 먼저 확인해야 합니다.

1. configure: error: xml2-config not found. Please check your libxml2 installation.
# yum install libxml2-devel

 

2. configure: error: Please reinstall the BZip2 distribution
해결책 :
[root@localhost local]# wget ftp://sources.redhat.com/pub/bzip2/v102/bzip2-1.0.2.tar.gz
Bzip2팩키지는 configure script가 없습니다. option을 한줄로 써서 컴파일 하고 설치합니다.
# cd bzip2-1.0.2
# make PREFIX=/tools install
# make clean
# cd ../php-5.2.11

 

3. configure: error: libXpm.(a|so) not found
# yum install gtk+ gtk+-devel

# yum install libXpm-devel

(# yum install xorg-x11-devel)

# sudo ln -s /usr/lib/x86_64-linux-gnu/libXpm.a /usr/lib/libXpm.a

# sudo ln -s /usr/lib/x86_64-linux-gnu/libXpm.so /usr/lib/libXpm.so

# sudo ln -s /usr/lib64/libXpm.so /usr/lib/libXpm.so

configure의 --with-libdir=/usr/lib64 를 --with-libdir=lib64 로 수정하고, configure 재수행!

 

4. configure: error: mcrypt.h not found. Please reinstall libmcrypt.  
# cd ..
# wget http://ftp.linux.co.kr/pub/etc/libmcrypt-2.5.7.tar.gz
# tar zxvfp libmcrypt-2.5.7.tar.gz
# cd libmcrypt-2.5.7
# ./configure && make && make install
# cd ../php-5.2.11

 

5. /usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [libphp5.la] Error 1 
# cd ..
# wget http://ftp.gnu.org/gnu/libtool/libtool-2.2.6a.tar.gz
# cd libtool-2.2.6
# ./configure
# make
# make install
# cd ../php-5.2.11

 

6. overflow2
~/php-5.3.4/ext/gd/gd.c (php를 받아서 압축을 푼 경로)


/*
        if (overflow2(font->nchars, font->h)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
                efree(font);
                php_stream_close(stream);
                RETURN_FALSE;
        }
        if (overflow2(font->nchars * font->h, font->w )) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading font, invalid font header");
                efree(font);
                php_stream_close(stream);
                RETURN_FALSE;
        }
*/ 해당 부분을 주석처리

[출처] [PHP] 컴파일시 나오는 에러대처|작성자 참좋은날

7. configure: error: Please reinstall the iconv library.
--with-iconv=/usr/local 를 --with-iconv 로 대체

8. checking for specified location of the MySQL UNIX socket... no
configure: error: Cannot find libmysqlclient_r under /usr/local/mysql.
Note that the MySQL client library is not bundled anymore!

When PHP is configured using --with-mysql=/usr/local/mysql and --with-libdir=lib64, it should search for /usr/local/mysql/lib64, since there is no such directory there encountered an error in PHP compile.

Since MYSQL is compiled from source, there will not be a 'lib64', the following steps will solve this problem.

[root@vps ~]# cd /usr/local/mysql  #Change directory to mysql's home directory
[root@vps mysql]# ln -s lib lib64    #Create a link for lib to lib64
를 수행하고, configure 재수행!
------------------------------------------------------------------------------------------

# vi /root/.bash_profile
PATH=$PATH:$HOME/bin 를
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin:/usr/local/apache/bin:/usr/local/php/bin 로 수정

@ php.ini 설정
# vi /usr/local/lib/php.ini
post_max_size = 100M (Default: 8M)
file_uploads = On
upload_max_filesize = 100M (Default: 2M)
allow_url_fopen = Off (Default: On)
allow_url_include = Off
short_open_tag = On (Default: Off)
disable_functions = exec,passthru,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
(Default: disable_functions =)

# ntsysv <--- 서비스 상태확인

# reboot <-- 설정을 마치면 한번쯤 리부팅 해 주세요...^^
 
 
서비스 시작
# service mysqld start
# service httpd start


새로운 도메인을 추가하는 경우, 아래의 처리들을 다시한번 확인해본다.
--------------------------------------------------------------------------------
[root@ns user]# vi /etc/resolv.conf
[root@ns user]# vi /etc/hosts <--- 신규 추가 시에 추가 필요
[root@ns user]# vi /etc/named.conf <--- 신규 추가 시에 추가 필요
[root@ns user]# vi /var/named/chroot/var/named/도메인주소.zone <--- 신규 추가 시에 생성 필요
[root@ns user]# ln -s /var/named/chroot/var/named/도메인주소.zone /var/named/도메인주소.zone
[root@ns user]# vi /usr/local/apache/conf/httpd.conf <--- 신규 추가 시에 추가 필요

[root@ns user]# /etc/rc.d/init.d/named reload
[root@ns user]# service named restart  (# chkconfig --level 35 named on (부팅 시에 런레벨 35일때 자동 실행))
[root@ns user]# service httpd restart

이제, 도메인을 등록한 사이트의 네임 호스트 관리에서 네임 호스트 및 IP주소를 추가하고,
네임서버를 네임 호스트 관리에서 입력한 네임 호스트로 입력하여 변경을 수행(보통, 등록한 사이트의 네임서버로 초기설정된 상태)

등록을 완료한 후에 ISP의 네임서버에 등록 및 변경이 수행되기까지는 약간의 시간이 필요하다.
잠시 후에 아래의 명령으로 정상 등록 및 변경여부를 확인한다.

[root@ns user]# nslookup 도메인주소
[root@ns user]# dig 도메인주소

시스템 > 관리 > 사용자 및 그룹에서 사용자를 추가 후에 권한을 변경한다. 

[root@ns user]# chmod 711 /home/사용자
[root@ns user]# chmod 755 /home/사용자/www
[root@ns user]# chgrp -R 사용자 /home/사용자
[root@ns user]# chown -R 사용자 /home/사용자


 
 
기타 Apache 계정별 사용 설정
vi /usr/local/apache/conf/httpd.conf
 
Include conf/extra/httpd-userdir.conf
LoadModule userdir_module modules/mod_userdir.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
주석 제거
 
/home/계정디렉토리 권한 711
/home/계정/public_html 권한 755 필요
 

 
참고 URL 
http://vogel.tistory.com/143


ZendGuard 설치

 

* ZendOptimizer는 PHP 5.2까지만 지원됨으로 PHP5.3을 설치 하는 경우 ZendGuard를 설치한다.

 

step 1) ZendGuard 소스를 /usr/local/에 다운 받는다.
wget http://downloads.zend.com/guard/5.5.0/ZendGuardLoader-php-5.3-linux-glibc23-i386.tar.gz

# uname -a

Linux mgribbon.net 2.6.32-358.18.1.el6.x86_64 #1 SMP Wed Aug 28 17:19:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/issue

CentOS release 6.4 (Final)

Kernel \r on an \m

위와 같이 64-bit가 설치되었음을 확인한다.

wget http://downloads.zend.com/guard/5.5.0/ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz

 
step 2) 소스파일의 압축을 푼다

# tar zxvf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz

 

step 3) Zend 모듈을 php 모듈에 복사한다.

cp ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x/ZendGuardLoader.so /usr/lib64/php/modules

 

step 4)  /usr/local/lib/php.ini 파일에 Zend 설정을 추가한다.

vi /usr/local/lib/php.ini

..............
[Zend]
zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so


설치 후에는 웹서버를 리스타트 수행한다.

# /etc/init.d/httpd restart 



 php pdo-mysql 확장 모듈 설치

 

1.pdo_mysql download 

wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz

 

2.설치
적당한 위치에 다운로드 받은 파일을 압축해제 후 압축해제한 디렉토리로 이동 
# tar -xzvf PDO_MYSQL-1.0.2.tgz
# cd
PDO_MYSQL-1.0.2

# /usr/local/php/bin/phpize

# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
# make

# make install 

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20090626/

 

3.적용

php.ini 파일은 대부분 /etc 또는 apache/conf 디렉토리에 있음.

php.ini 파일에 추가
# vi /usr/local/lib/php.ini

extension=/usr/local/php/lib/php/extensions/no-debug-zts-20090626/pdo_mysql.so

 

추가 후 apache restart 하면 적용완료 됨!! 

# service httpd restart  


'Linux > CentOS' 카테고리의 다른 글

PHPIZE를 이용한 openSSL PHP 확장 모듈 설치  (0) 2013.09.16
집 컴퓨터를 웹서버로 만들기  (0) 2013.09.16
리눅스 yum 명령어  (0) 2012.10.10
BackupPC for CentOS  (0) 2012.10.09
아파치 모듈 mod_rewrite 설정  (0) 2012.09.13
Posted by iWithJoy
Linux2013. 5. 8. 11:17

In order to run ProFTPd as a Windows service under Cygwin the following needs to be set in the /etc/proftpd.conf file:

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

:

# Port 21 is the standard FTP port.
#Port                           21
Port                            2122
:

# Set the user and group under which the server will run.
User                            SYSTEM
Group                           Administrators

# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~

:

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

 

The server can then be run as a service:

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

cygrunsrv --install proftpd \
          --path /usr/sbin/proftpd.exe \
          --args "--nodaemon" \
          --type manual \
          --disp "CYGWIN proftpd" \
          --desc "ProFTPd FTP daemon"

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

 

Then it needs to be run:

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

cygrunsrv --start proftpd

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

 

'Linux' 카테고리의 다른 글

Cygwin 설치 및 개발환경 구축  (0) 2013.04.19
RPM 패키지 설치 및 삭제방법  (0) 2012.08.31
init와 Runlevel  (0) 2012.08.31
유니티 각 부분의 명칭 및 키보드 단축키  (0) 2011.07.20
유니티(unity) 초기화  (0) 2011.07.20
Posted by iWithJoy
Linux2013. 4. 19. 11:22



회사에서의 개발환경은 cygwin + gcc + gmake이다.  따라서 cygwin을 설치한다.

http://www.cygwin.com/setup.exe 를 다운받아놓도록 한다. 
향후 패키지를 추가/제거할 때도 사용하여야 하니까 그냥 다운 받아놓는 것이 낫다.  용량도 400KB 정도...

이걸 실행시키면 어디를 통해서 install 할 것인지를 물어본다. 
여기에서 Install from Internet을 사용한다.

Root Directory는 기본 설정인 C:\cygwin을 그냥 사용하는 것이 제일 무방할 듯 싶다. 
검색해본 결과 많은 사람들이 여기에 기반을 두고 작업을 하였기 때문에 헷갈리지 않을터이다. 
밑의 설정은 All Users와 Unix/binary에 체크한다. (기본 설정)

여기서 다음을 누르면 어디에 다운을 받을 것인지, 어떤 방법으로 받을 것인지 물어보는데 기본값을 쓰면 되고,
download site는 http://ftp.daum.net을 추가해서 쓰면 괜찮을 듯 하다.

기본값은 진짜 기본만 설치하게 되므로 나중에 되는게 하나도 없다
All 옆에 Default를 몇 번 클릭하여 Uninstall로 바꾸고, 원하는 패키지의 Unintall을 Install로 바궈서. 필요한 패키지만 설치하자.

직감적으로 gcc나 make, gdb, vim 등등은 당연히 해야할 것이라는 느낌이 온다.  
다음은 필요하다고 생각되는 package들을 정리한 것이다.

Admin - cygrunsrv (sshd 등을 bg로 돌릴 유틸)
Devel - gcc, make, ctags 관련
Editors - vim 관련
Net - openssh 관련 (ssh를 사용할 것이라면)
Shell - rxvt 관련 (xterm을 사용할 것이라면)

위에서 열거한 package 말고도 필요한 패키지들을 선택하도록 하고,
나중에 또 추가가 되므로 크게 신경 쓸 일은 아닌듯 하다.

어쨌거나 설치가 끝나면 환경변수를 설정하도록 한다. 
내 컴퓨터 우클릭하여 '속성'->'고급'->'환경변수'를 선택하여 사용자 변수와 시스템 변수를 추가하도록 한다.

사용자 변수
HOME=d:\home (linux에서의 ~ 를 말함)
LOGNAME= (windows 계정과 동일하게)

시스템 변수
CYGWIN (ntsec binmode)을 새로 만들고
PATHC:\Cygwin\bin을 추가한다 (당연히 항목과 항목 사이는 ;으로 구분한다).






만약 cygwin 자체의 terminal을 쓴다면 상관은 없지만, cygwin의 xterm을 사용하고 싶다면, 추가의 작업이 필요하다.

c:\cygwin을 보면 cygwin.bat가 있다.  autoexec.bat 이후로 bat 파일은 진짜 오랜만이다.  어쨌거나 이거 내용을 보면 다음과 같다.

@echo off

C:
chdir C:\cygwin\bin

bash --login -i

이거를 응용해서 rxvt,bat를 하나 만든다 (xterm용)

@echo off

C:
chdir C:\cygwin\bin

rxvt.exe -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche" -e /bin/bash --login -i

rxvt의 각 항목의 값들이 궁금하다면 cygwin에서 rxvt --help를 해보면 알 수 있다.  대충 xterm으로 띄우는데 scrolling이 가능하도록 하고 검은 배경에 회색글씨를 쓰겠다... 폰트는 Dotumche를 쓰겠고.. 뭐 이런 거다.

이게 끝난 다음에 만든 rxvt.bat를 실행시키면 익숙한 shell prompt를 확인할 수 있다.

cygwin에서 개발하려면 다른 editor도 있겠지만, 아무래도 vim을 가장 많이 사용하지 않을까 싶다.  cygwin에서 vim을 사용하려면 이거저거 걸리는게 많다.  일단 기본적으로 설정 파일이 없기 때문에 원 리눅스에서의 컬러풀(?)한 터미널을 기대하면 안된다.  또 한글입력에 문제가 많아서 요거 2가지 처리를 해줘야 한다.

먼저 vim을 설정해야 되는데, 항목이 워낙 많으니 그냥 /usr/share/vim/vim71/vimrc_example.vim을 home 디렉토리에 .vimrc로 복사하고, 좀 손을 봐준다.  쭉 내리다보면 다음과 같은 부분이 있다.

if has("vms")
  set nobackup
else
  set backup
endif

요 부분을 주석처리한다.  vimrc에서의 주석은 " (double quotation mark)를 맨 앞에 붙여주면 된다.  이거 안하면 저장하고 나올때마다 backup 파일이 생기는 짜증나는 (필요하긴 하지만) 현상을 목격하게 된다.  어쨌거나 이거 됐으면 다음 작업을 진행한다.  역시 .vimrc에 다음과 같은 항목을 추가하여 준다.

set fileencoding=euc-kr
set encoding=cp949

vi에서 한글을 사용하기 위한 설정이다.  이렇게 다 됐으면 저장하고 다시 vi로 아무 c파일이나 짜본다.

#include <stdio.h>

int main (void)
{
  printf ("헬로, 시그윈 월드\n");

  return 0;
}

잘 된다.  하지만 이렇게 하면 vim에서만 한글이 잘 보일뿐, 막상 쉘에서 ls해보면 잘 안나온다.  요것도 수정해야 하는데, 홈 디렉토리에 .bash_profile을 다음과 같은 내용을 추가한다.

alias ls='ls -F --color=auto --show-control-char'

쉘에서 ls를 해도 한글이 무리 없이 잘 나오게 된다.  후아... 이정도 했으면 큰 문제 없이 cygwin을 사용할 수 있을 것 같다.  헌데, 작업하다보면 새로운 terminal을 띄워야 할 때가 있는데 이때마다 마우스로 손이 가는건 상당히 부하가 큰 작업(-_-?)이다.  요거를... 키보드에서만 해결하도록 다음과 같은 alias도 하나 추가한다.

alias rxvtTerm='/cygdrive/c/cygwin/bin/rxvt -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche" -e /bin/bash --login -i &'

이러면 그냥 쉘 프롬프트에서 rxvtTerm을 실행시켜서 새로운 xterm 하나를 더 얻을 수 있게 된다.

 

 

CYGWIN SSH 설치

 

< 윈도우 초기 설정 >

- Administarator 계정으로 로그인
- 현재 Administarator 계정과, 다른 User 계정에 Password를 지정해준다.


< CYGWIN 설치 >

- C:\cygwin 폴더를 생성한후, http://www.cygwin.com/ 에서 다운로드 받은 setup.exe 파일을 폴더에 저장한다.
(Cygwin의 setup.exe 파일은 초기 설치 후에도 cygwin package들을 추가하고 삭제하고 재설치 할때 사용된다.)
- setup.exe 파일을 실행시켜 cygwin을 설치한다.

1) 설치 정보 화면
2) Choose A Download Source 화면에서 Install from Internet 선택
3) Select Root Install Directory 화면 에서 Root Directory 는 C:\cygwin 으로 Install For 는 All User 선택, Default Text File Type 은 Unix/Binary 선택
4) Local Package Directory 는 C:\cygwin -> Select Your Internet Connection 은 DirectConnection 선택
5) Select package to install 화면
+ View 버튼을 클릭하면 버튼 옆에 Full 이라고 표시된다.
+ 목록 중에 openssh, tcp_wrappers, diffutils, zlib 패키지 중 New 칼럼에 skip 이라고 표시되있는 상태이면 skip을 클릭하여 설치 상태로 변경한다.

< 시스템 환경 변수 설정 및 기타 설정 >

- 시스템 등록 정보 화면에서 고급탭의 환경 변수 설정
-> 새로운 변수 설정 : 변수 이름 - CYGWIN, 변수 값 - ntsec tty
-> Path 변수 수정 : 뒤에 ;c:\cygwin\bin  를 추가한다.


< Cygwin 설치후, 실행 및 설정 >

- 권한 문제가 발생할 가능성이 있으므로 아래 세 명령어 실행
# chmod +r  /etc/passwd
# chmod +r  /etc/group
# chmod  755  /var

- ssh 설정 스크립트 실행
# ssh-host-config  -y

privilege separation -> yes
create a local user sshd on this machine -> yes
install sshd as a service -> yes
environment variable CYGWIN= ->  ntsec tty

- Windows 사용자 정보와 cygwin좨의 사용자정보를 싱크(중요)
# mkpasswd   -cl   >   /etc/passwd
# mkgroup   --local    >   /etc/group

- ssh 서비스 실행

# net start sshd 
or
# cygrunsrv  --start  sshd

- ssh 서비스 로컬 테스트

#whoami
#ssh    localhost
or
#ssh  -vvv  localhost
or
#ssh    "$USERNAME@127.0.0.1"
(사용자 명이 스페이스가 존재한다면, 스페이스 자리에 \[space]를 대신한다. ex> ab cd -> ab\ cd )

처음 접속시, The authenticity of host '....<xxx.x.x.xx>" can't be established......
라는 문구가 나오는데.. 이는 yes라고 답하고 계속 진행한다.

그리고 명령어 입력 프롬포트가 나타나면 다음과 같이 명령한다.

cd   /cygdrive/c
ls

ls 명령이 정상적으로 수행이 되, 디렉토리와 파일 리스트가 출력되면 정상이다.

- 윈도우(XP SP2 기준) 방화벽 설정 : 제어판 - 보안센터 - Windows 방화벽 - 예외 탭

1) 포트 추가 설정
: 포트추가 화면에서 이름 SSH 포트번호 22 로 설정하고 TCP 선택
2) 프로그램 추가 설정
: 프로그램 추가 설정에서 프로그램 경로를 C:\cygwin\bin\ssh.exe 를 설정

- 원격지에서 접속 테스트

-> 원격지에서 Putty나 기타 클라이언트 프로그램에서 접속 확인
-> 접속이 되지 않을 경우, /etc/hosts.deny, /etc/hosts.allow 파일확인(참조 링크 확인)

예를 들어, 특정IP에게 거절되지 않게 설정하려면,

/etc/hosts.deny 를 편집기로 열어서, 아래의 내용을 추가하면 된다.

ALL:ALL EXCEPT 특정IP:DENY

 

-> 참고사항 : SSHD 가 실행된 이후로, 윈도우의 환경 변수(특히 PATH)를 변경하면 적용되지 않는다.  윈도우 서비스의 SSHD를 재시작하거나, 윈도우를 재시작하면 된다. 

더욱정리가 잘되어있는 사이트는 요아래에 있으니 참고해주세요~~

Cygwin 설치

cygwin이라는 프로그램을 windows에 설치하면 Linux 명령과 bash sell을 사용 할 수 있습니다.
보통 개인적 취향이나 학습의 목적으로 cygwin을 자신의 컴퓨터에 설치하여 사용하고는 하는데,
나아가서 원격머신 흔히 서버로 사용할 머신이 windows 계열일때의 불편을 해소하고자 할 때
이 보다 좋은 방법은 없는듯 합니다.

목차 :
  1. cygwin을 깔면 무얼 할 수 있나?
  2. cygwin 설치 방법
  3. 한글 설정
  4. sshd 띄워 원격에서 접속하기
 
1. cygwin을 깔면 무얼 할 수 있나?
 cygwin이라는 프로그램은 windows에 설치하여 Linux와 같은 환경을 제공합니다.

cygwin을 실행한 모습


위의 그림처럼 cygwin을 실행시키면 Dos창과 비슷한 콘솔이 열리는데, 이것을 이용해서 Unix 명령과 각종 Shell을 실행 시킬 수 있습니다.
물론 이미 설치되어 있는 모든 프로그램의 실행도 가능합니다.  GUI를 갖는 윈도우 프로그램도 포함해서 말이죠.(물론 그렇게 할 필요는 없어 보이지만..)

IT, 특히 개발자로서는 grep, find, tail 명령만으로도 이 프로그램을 사용하는 충분한 이유가 될 수 있을듯 합니다.
Unix 환경에 익숙하지 않은 사람은 이것을 이용해서 학습을 할 수 있을 것이구요.

제가 이와 같이 개인적 성향이나 학습의 가능성을 알리기 위해 이렇게 글 까지 쓰지는 않았을 겁니다. 자기 혼자 사용하는 개인용 PC인 경우라면 grep이나 find가 없어도 알아서 잘들 쓰고 있고, 이런게 있는데 좋으네 마네 설명하고 자시고 할 필요는 없어 보입니다.

그런데, 서버 환경이 Windows인 경우에는 문제가 다릅니다.
원격 서버에서 실행되어야 하는 각종 서버 데몬의 실행과 중단 명령, 원격 서버에 쌓이고 있는 로그파일의 tail, 원격 서버의 CPU, Memory 사용률과 Process List를 확인 하려 할때, 윈도우 원격 데스트탑 연결(mstsc.exe)이나 VNC를 이용해야 하는것은 무척 불편하고 퇴근시간을 늦추는 요인이 됩니다.

CecureCRT로 cygwin을 이용한 ssh 접속모습


cygwin의 sshd를 이용하면 원격에서 telnet과 같이 ssh를 이용하여 모든 콘솔 명령을 이용할 수 있으니 소스적용이나 시스템 모니터링에서 windows와 Unix의 차이를 모르고 작업 할 수 있게 해줍니다.
자 어때요. 이정도면 cygwin 쓸만 한가요? 그렇다면 설치와 환경 설정 방법을 설명해 드릴께요.

2. cygwin 설치 방법
  cygwin을 설치 하기 위해서는 ftp가 열려 있어야 합니다.
금융사 내부에서 인터넷을 할때는 대부분 ftp가 닫혀 있기 때문에 설치 프로그램이 필요한 패키지를 다운로드 하지 못하는 경우가 있읍니다. 이 경우에는 첨부한 설치 프로그램과 패키지를 이용해서 설치해야 합니다.

 가. FPT가 가능하다면 http://www.cygwin.com에 방문하여 설치 프로그램을 다운로드 받습니다.
FTP가 불가능하다면 첨부 파일인 setup.exe를 다운받습니다.

http://www.cygwin.com


 나. 설치 프로그램을 실행하여 평소처럼 "다음"을 눌줍니다.
 

cygwin installer


 다. 만약 FTP가 가능하다면 "Install from Internet"을 선택하고 "다음"을 클릭합니다.
   만약 FTP가 불가능 하다면 "Install from Local Directory"를 선택합니다.

  라. 설치할 경로와 설치 환경을 설정합니다. 왠만하면 그대로 두시면 됩니다.

  마. 패키지 경로를 지정합니다.
   FTP가 가능한 경우는 패키지를 다운받을 경로를 지정하시면 되고,
   FTP가 불가능한 경우는 첨부파일 release.zip을 다운받아 압축해제한 경로를 지정하시면 됩니다.

 바. FTP 접속 방법 선택
  FTP가 불가능한 경우에는 해당 사항 없는 화면입니다.
  FTP로 다운받아 설치하는 경우에 FTP를 어떻게 접속할지를 선택하는 방법입니다.
   어떤걸 선택할 지는 알아서 판단 해야 겠죠.

  사. 다운로드 사이트 선택
   release.zip을 다운받으신 경우에은 마찬가지로 해당 사항 없는 화면입니다.
   어느 미러 사이트에서 받을지 묻는 것인데, ftp://ftp.kaist.ac.kr 가 제일 빠르다고 합니다.

   아. 설치 패키지 선택
   어떤 패키지를 설치 할지 선택하는 것인데요, 이부분은 모두 해당 되는 부분입니다.
    패키지를 설명하고 자시고 할 자신은 없으니 모두 설치를 하십시요.
   이때!! "All Default"라고 되어있는 "Default"를 클릭하여 "Install"로 바꾸시는 것은 매우 중요합니다.
 

  자. 설치 진행 및 종료
    나머지는 굳이 설명 안드리겠습니다. 그냥 놔두면 설치하고 "마침" 클릭하시면 되겠습니다.

 자 이제 생성된 아이콘을 클릭하여 cygwin을 실행하고 Unix 처럼 사용하시면 됩니다.
  
  • C: D: 드라이브 변경은 Dos에서 처럼  "cd c:" , "cd d:" 하시면 되고 /(root) 디렉토리는 cygwin이 설치된 경로, 다시말해 디폴트로 설치했다면 "c:\cygwin" 이 되게 됩니다.
    ~(home) 디렉토는  "c:\document and settings\계정이름" 입니다.

 
3. 한글 설정
cygwin을 설치하고 바로 쓰면 한글 파일명이나 디렉토리명이 물음표(?)로 표시되고, 한글 입력도 잘 되지 않습니다. 그래서 설치 후 한글 설정 작업이 필요합니다.

 가. c:\cygwin\Cygwin.bat 파일을 노트패드로 열어 굵은 글씨로 된 문장을 추가 합니다.
... 생략
set CYGWIN=tty

bash --login -i

 나. cygwin콘솔에서 vi로  ~/.bashrc 열어 아래 내용을 맨 아래에 넣습니다.
alias ls='ls -ahF --color=tty --show-control-char'
 그 밖에 alias를 추가 하거나 수정하셔도 됩니다.

다. cygwin 콘솔에서 vi로 ~/.inputrc 를 열어 아래 내용을 맨 아래에 추가합니다.
set meta-flag on
set convert-meta off
set output-meta on

자. 이제 한글 입/출력도 잘 될것입니다.
로칼에서만 사용하실 꺼라면 이대로 잘 사용하시면 됩니다.


4. sshd 설정하여 원격에서 접속하기
  가. 환경변수 설정
 내컴퓨터 아이콘의 속성을 선택해서 "시스템 등록정보" 창을 열어 봅니다.
"고급" 탭의  "환경변수"를 클릭하여 환경변수를 추가합니다.

저장할 변수내용은 다음과 같습니다.
CYGWIN=ntsec tty

    나. cygwin 콘솔에서 다음 명령을 실행합니다.
 
ssh-host-config
CYGWIN=ntsec tty

  다. cygwin 콘솔에서 sshd 데몬을 실행합니다.
cygrunsrv --start sshd
 
이와 같이 하고 나면 윈도우 서비스에 sshd 가 추가 되어 실행되고 있는 것을 확인 할수 있습니다.


라. ssh 접속

 Putty 또는 SecureCRT와 같은 ssh를 지원하는 콘솔 프로그램을 이용해서 원격에서 접속해 봅니다. 
 계정은 windows 로그인 계정과 같습니다. 대부분 Administrator 이겠죠.


자 이제 윈도우 시스템을 원격에서도 Unix와 같이 사용해서 퇴근 시간이 빨라지길 바랍니다.
X를 띄워 쓰는 분도 있으니 더 쓸모 있는 방법이 있지 않알까 생각도 됩니다.

 

Cygwin 설치

cygwin이라는 프로그램을 windows에 설치하면 Linux 명령과 bash sell을 사용 할 수 있습니다.
보통 개인적 취향이나 학습의 목적으로 cygwin을 자신의 컴퓨터에 설치하여 사용하고는 하는데,
나아가서 원격머신 흔히 서버로 사용할 머신이 windows 계열일때의 불편을 해소하고자 할 때
이 보다 좋은 방법은 없는듯 합니다.

목차 :
  1. cygwin을 깔면 무얼 할 수 있나?
  2. cygwin 설치 방법
  3. 한글 설정
  4. sshd 띄워 원격에서 접속하기
 
1. cygwin을 깔면 무얼 할 수 있나?
 cygwin이라는 프로그램은 windows에 설치하여 Linux와 같은 환경을 제공합니다.

cygwin을 실행한 모습


위의 그림처럼 cygwin을 실행시키면 Dos창과 비슷한 콘솔이 열리는데, 이것을 이용해서 Unix 명령과 각종 Shell을 실행 시킬 수 있습니다.
물론 이미 설치되어 있는 모든 프로그램의 실행도 가능합니다.  GUI를 갖는 윈도우 프로그램도 포함해서 말이죠.(물론 그렇게 할 필요는 없어 보이지만..)

IT, 특히 개발자로서는 grep, find, tail 명령만으로도 이 프로그램을 사용하는 충분한 이유가 될 수 있을듯 합니다.
Unix 환경에 익숙하지 않은 사람은 이것을 이용해서 학습을 할 수 있을 것이구요.

제가 이와 같이 개인적 성향이나 학습의 가능성을 알리기 위해 이렇게 글 까지 쓰지는 않았을 겁니다. 자기 혼자 사용하는 개인용 PC인 경우라면 grep이나 find가 없어도 알아서 잘들 쓰고 있고, 이런게 있는데 좋으네 마네 설명하고 자시고 할 필요는 없어 보입니다.

그런데, 서버 환경이 Windows인 경우에는 문제가 다릅니다.
원격 서버에서 실행되어야 하는 각종 서버 데몬의 실행과 중단 명령, 원격 서버에 쌓이고 있는 로그파일의 tail, 원격 서버의 CPU, Memory 사용률과 Process List를 확인 하려 할때, 윈도우 원격 데스트탑 연결(mstsc.exe)이나 VNC를 이용해야 하는것은 무척 불편하고 퇴근시간을 늦추는 요인이 됩니다.

CecureCRT로 cygwin을 이용한 ssh 접속모습


cygwin의 sshd를 이용하면 원격에서 telnet과 같이 ssh를 이용하여 모든 콘솔 명령을 이용할 수 있으니 소스적용이나 시스템 모니터링에서 windows와 Unix의 차이를 모르고 작업 할 수 있게 해줍니다.
자 어때요. 이정도면 cygwin 쓸만 한가요? 그렇다면 설치와 환경 설정 방법을 설명해 드릴께요.

2. cygwin 설치 방법
  cygwin을 설치 하기 위해서는 ftp가 열려 있어야 합니다.
금융사 내부에서 인터넷을 할때는 대부분 ftp가 닫혀 있기 때문에 설치 프로그램이 필요한 패키지를 다운로드 하지 못하는 경우가 있읍니다. 이 경우에는 첨부한 설치 프로그램과 패키지를 이용해서 설치해야 합니다.

 가. FPT가 가능하다면 http://www.cygwin.com에 방문하여 설치 프로그램을 다운로드 받습니다.
FTP가 불가능하다면 첨부 파일인 setup.exe를 다운받습니다.

http://www.cygwin.com


 나. 설치 프로그램을 실행하여 평소처럼 "다음"을 눌줍니다.
 

cygwin installer


 다. 만약 FTP가 가능하다면 "Install from Internet"을 선택하고 "다음"을 클릭합니다.
   만약 FTP가 불가능 하다면 "Install from Local Directory"를 선택합니다.

  라. 설치할 경로와 설치 환경을 설정합니다. 왠만하면 그대로 두시면 됩니다.

  마. 패키지 경로를 지정합니다.
   FTP가 가능한 경우는 패키지를 다운받을 경로를 지정하시면 되고,
   FTP가 불가능한 경우는 첨부파일 release.zip을 다운받아 압축해제한 경로를 지정하시면 됩니다.

 바. FTP 접속 방법 선택
  FTP가 불가능한 경우에는 해당 사항 없는 화면입니다.
  FTP로 다운받아 설치하는 경우에 FTP를 어떻게 접속할지를 선택하는 방법입니다.
   어떤걸 선택할 지는 알아서 판단 해야 겠죠.

  사. 다운로드 사이트 선택
   release.zip을 다운받으신 경우에은 마찬가지로 해당 사항 없는 화면입니다.
   어느 미러 사이트에서 받을지 묻는 것인데, ftp://ftp.kaist.ac.kr 가 제일 빠르다고 합니다.

   아. 설치 패키지 선택
   어떤 패키지를 설치 할지 선택하는 것인데요, 이부분은 모두 해당 되는 부분입니다.
    패키지를 설명하고 자시고 할 자신은 없으니 모두 설치를 하십시요.
   이때!! "All Default"라고 되어있는 "Default"를 클릭하여 "Install"로 바꾸시는 것은 매우 중요합니다.
 

  자. 설치 진행 및 종료
    나머지는 굳이 설명 안드리겠습니다. 그냥 놔두면 설치하고 "마침" 클릭하시면 되겠습니다.

 자 이제 생성된 아이콘을 클릭하여 cygwin을 실행하고 Unix 처럼 사용하시면 됩니다.
  
  • C: D: 드라이브 변경은 Dos에서 처럼  "cd c:" , "cd d:" 하시면 되고 /(root) 디렉토리는 cygwin이 설치된 경로, 다시말해 디폴트로 설치했다면 "c:\cygwin" 이 되게 됩니다.
    ~(home) 디렉토는  "c:\document and settings\계정이름" 입니다.

 
3. 한글 설정
cygwin을 설치하고 바로 쓰면 한글 파일명이나 디렉토리명이 물음표(?)로 표시되고, 한글 입력도 잘 되지 않습니다. 그래서 설치 후 한글 설정 작업이 필요합니다.

 가. c:\cygwin\Cygwin.bat 파일을 노트패드로 열어 굵은 글씨로 된 문장을 추가 합니다.
... 생략
set CYGWIN=tty

bash --login -i

 나. cygwin콘솔에서 vi로  ~/.bashrc 열어 아래 내용을 맨 아래에 넣습니다.
alias ls='ls -ahF --color=tty --show-control-char'
 그 밖에 alias를 추가 하거나 수정하셔도 됩니다.

다. cygwin 콘솔에서 vi로 ~/.inputrc 를 열어 아래 내용을 맨 아래에 추가합니다.
set meta-flag on
set convert-meta off
set output-meta on

자. 이제 한글 입/출력도 잘 될것입니다.
로칼에서만 사용하실 꺼라면 이대로 잘 사용하시면 됩니다.


4. sshd 설정하여 원격에서 접속하기
  가. 환경변수 설정
 내컴퓨터 아이콘의 속성을 선택해서 "시스템 등록정보" 창을 열어 봅니다.
"고급" 탭의  "환경변수"를 클릭하여 환경변수를 추가합니다.

저장할 변수내용은 다음과 같습니다.
CYGWIN=ntsec tty

    나. cygwin 콘솔에서 다음 명령을 실행합니다.
 
ssh-host-config
CYGWIN=ntsec tty

  다. cygwin 콘솔에서 sshd 데몬을 실행합니다.
cygrunsrv --start sshd
 
이와 같이 하고 나면 윈도우 서비스에 sshd 가 추가 되어 실행되고 있는 것을 확인 할수 있습니다.


라. ssh 접속
 Putty 또는 SecureCRT와 같은 ssh를 지원하는 콘솔 프로그램을 이용해서 원격에서 접속해 봅니다.

 계정은 windows 로그인 계정과 같습니다. 대부분 Administrator 이겠죠.


자 이제 윈도우 시스템을 원격에서도 Unix와 같이 사용해서 퇴근 시간이 빨라지길 바랍니다.
X를 띄워 쓰는 분도 있으니 더 쓸모 있는 방법이 있지 않알까 생각도 됩니다.

 

 

한글사용을 위해 아래의 파일의 내용을 확인하여 추가 및 수정한다.

 

.bash_profile

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

# source the users bashrc if it exists
if [ -f "${HOME}/.bashrc" ] ; then
  source "${HOME}/.bashrc"
fi

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
        INPUTRC=/etc/inputrc
fi

#export PS1='[\u@\h \w]\$ '
export PS1='[\w]\$ '

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

 

.bashrc

--------------------------------------------------------------------------------
# Some shortcuts for different directory listings
# alias ls='ls -hF --color=tty'                 # classify files in colour
 alias ls='ls --color=tty --show-control-char'
 alias dir='ls --color=auto --format=vertical'
 alias vdir='ls --color=auto --format=long'
 alias ll='ls -l'                              # long list
 alias la='ls -A'                              # all but . and ..
 alias l='ls -CF'                              #

if [[ "${COLORTERM}" == "rxvt-xpm" || "${TERM}" == "cygwin" ]]; then
  #export LANG=ko_KR
  export LANG=ko_KR.eucKR
  #export LANG=C.eucKR
  #export LANG=ko_KR.UTF-8
fi
--------------------------------------------------------------------------------

 

.inputrc

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

# equivalent to "\C-?": delete-char
"\e[3~": delete-char

# VT
"\e[1~": beginning-of-line
"\e[4~": end-of-line

# kvt
"\e[H": beginning-of-line
"\e[F": end-of-line

# rxvt and konsole (i.e. the KDE-app...)
"\e[7~": beginning-of-line
"\e[8~": end-of-line

# VT220
"\eOH": beginning-of-line
"\eOF": end-of-line

# Allow 8-bit input/output
set meta-flag on
set convert-meta off
set input-meta on
set output-meta on
--------------------------------------------------------------------------------

 

.minttyrc

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

Font=Fixedsys
BoldAsFont=no
Locale=ko_KR
Charset=eucKR
--------------------------------------------------------------------------------

 

.profile

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

# Set user-defined locale
export LANG=$(locale -uU)

# This file is not read by bash(1) if ~/.bash_profile or ~/.bash_login
# exists.
#
# if running bash
if [ -n "${BASH_VERSION}" ]; then
  if [ -f "${HOME}/.bashrc" ]; then
    source "${HOME}/.bashrc"
  fi
fi
--------------------------------------------------------------------------------

 

Posted by iWithJoy
JAVA/Regular Expression2013. 3. 22. 17:31

HTML 을 XML 파서로 파싱해서 객체화 시킬 일이 있어 여러 가지 실험해 보다가 쓸만한 팁을 정리합니다.

HTML 의 경우는 XML 과는 다르게 태그를 닫지 않거나 attribute 를 큰 따옴표로 감싸지 않아도 브라우저에서 확인이 가능합니다. 이렇기 때문에 HTML 을 XML 파서로 파싱하려면 큰 따옴표로 묶이지 않은 부분을 변경해 주어야 합니다.
(실제로 작업을 해보지는 않았으나 태그를 닫지 않는 것을 수정하려면 문서 전체를 문자열 단위로 파싱을 해야 가능할 것 같습니다.)

[TYPE_A]

<P class=PStyle0>
...
</P>


[TYPE_B]

<P class="PStyle0">
...
</P>


간단하게 이야기 하자면 [TYPE_A][TYPE_B] 로 변경하는 것이 목적입니다.

자바에서는 replaceAll 메소드와 정규식을 이용하면 쉽게 변환이 가능합니다.

1 String html = "...";
2   
3 String replaceHtml = html.replaceAll("(class=)([^\\p{Space}\\>\\\"]+)", "$1\"$2\"");


우선 replaceAll 의 첫번째 파라미터를 설명하겠습니다.
'class='로 시작을 하고 스페이스, '>', 큰 따옴표가 나오기 전까지의 모든 문자들의 연속을 찾습니다. 괄호로 묶음은 그룹을 뜻하는데 여기서 그룹 1 은 'class=' 이며, 그룹 2 는 위의 [TYPE_A] 에서 라면 'PStyle0' 까지 입니다.

두번째 파라미터는 간단합니다. '$그룹번호' 로 변경하겠다는 이야기 입니다.
'$1\"$2\"' 을 단계별로 변환하면 그룹 1 이 교체되면 'class=\"$2\"' 가 되고 그룹 2 가 교체되면 'class=\"PStyle0\"' 이 됩니다.

정규식은 역시 활용만 잘하면 단순 노가다 작업을 간단하게 줄여줄 수 있는 강력한 무기가 됩니다.

 

출처: http://vicki.tistory.com/851

'JAVA > Regular Expression' 카테고리의 다른 글

Java 정규 표현식 사용하기  (0) 2013.03.06
정규식과 보안  (0) 2013.03.04
Posted by iWithJoy
카테고리 없음2013. 3. 12. 17:55
본 문서의 저작권은 anti-nhn license에 따릅니다.
*본 페이지에는 자바스크립트가 많이 들어있습니다. 자바스크립트가 실행되지 않으면 제대로 보이지 않습니다.
*본 페이지는 IE용 태그를 사용하였으므로, firefox 등에서는 정상작동하지 않을 수 있습니다.
*테스트를 해보실라문 요기를 클릭

차례

1. 정규식이란?

  • String의 검색, 치환, 추출을 위한 패턴.
  • 언어별 사용법은 대동소이함.
  • 패턴예>전화번호 형식, 이메일 형식 등.

2. 정규식 만들기

  1. Javascript
    • var regexp = /pattern/[flags] ;
      var test = regexp.test(to be checked)
    • var regexp = new RegExp("pattern"[, "flags"]);
      var test = regexp.test(to be checked)
    • flags for javascript
      • g : global match, 일반적으로 패턴이 1번만 발견되면 찾기를 종료하지만, g flag가 있으면, 문자열 내에서 모든 패턴을 찾는다.
      • i : ignore case, 대소문자를 고려하지 않고 체크한다.[a-z]와 [A-Z]는 같은 표현이 된다.
      • m : match over multiple lines, 여러 줄에 걸쳐 체크를 한다.
  2. Java
    • java.util.regex package
    • Pattern p = Pattern.compile("pattern");
      Matcher m = p.matcher("string to be checked");
      boolean b = m.matches();
    • boolean b = Pattern.matches("pattern", "string to be checked");

3. 정규식 표현법

*는 valid, 는 invalid
*형광 초록 바탕 부분은 매칭되는 부분.
*예제는 javascript 기준이며, 언어에 따라 다소 차이가 발생할 수 있다.

문자 용도 예제
\
  • 특수문자를 의미
  • 특수문자의 사용을 제외(특수문자 앞에서)
  • b는 b라는 글자를 의미 하지만 \b는 단어 경계를 의미
  • *은 0번이상 반복이라는 의미이지만, \*는 *이라는 글자를 의미.
^ 문자열의 시작. []안에서는 not의 의미
* ^A는 "A로 시작"이라기 보다는 "시작 직후에 A가 나온다"는 의미로 해석하는 것이 좋다. 즉, 시작과 끝과 같은 빈 공간을 하나의 문자로 간주하는 것이 좋다.
/^A/g
  • A string
  • an A
/[^A]/g
  • A string
  • an A
$ 문자열의 마지막
/t$/
  • eat
  • GREAT
* 0번 이상 반복 /ab*d/g
  • ad
  • abd
  • abdcdeabbbbdedb
  • ab
  • axd
+ 1번 이상 반복 ( = {1,} ) /ab+d/g
  • ad
  • abd
  • abdcdeabbbbdedb
  • ab
  • axd
? 0번 이나 1번 /e?le?/g
  • angel
  • angle
  • element
/abc\-?d/g
  • abc-d
  • abcd
. new line 을 제외한 모든 글자 /.n/g
  • nay, an apple is on the tree
  • nay
(x) x를 체크하고 체크한 값을 변수로 저장 /(f..) (b..)/
  • foo bar
    1th :foo
    2th :bar
(?:x) x를 체크하고 체크한 값을 변수로 저장하지 않음 /(?:f..) (b..)/
  • foo bar
    1th :bar
  • bar foo
x|y x 또는 y /green|red/
  • green apple
  • red apple
  • yellow apple
x(?=y) x후에 y가 나오고, x부분만 매칭되는 부분으로 간주 /blah(?=soft|hard)/
  • blahsoft
  • blahhard
  • blah soft
/blah(?=soft).*/
  • blahsoft
  • blahhard
  • blah soft
x(?!y) x가 나오고 그 뒤에 y가 있으면 안 됨 /blah(?!hard)/
  • blahsoft
  • blahhard
  • blah soft
{n} 앞에 지정한 것이 n개 /.{3}/
  • ab
  • abc
  • abcd
  • 홍길동
{n,} 앞에 지정한 것이 n개 이상 /.{3,}/
  • ab
  • abc
  • abcd
{n,m} 앞에 지정한 것이 n~m개 /.{3,5}/
  • ab
  • abc
  • abcd
  • 홍길동
[xyz] x나 y나 z. []안에는 얼마든지 쓸 수 있다. /[abc]{2}/
  • ab
  • abc
  • adbd
[x-z] x에서 z까지 /[a-z]{4,}/g
  • She sells sea shells by the sea shore는 Very 어렵다!
[^xyz] x,y,z를 제외한 나머지 모든 것 /[^a-z]{2,}/g
  • I'm a good man
  • I am A good Man
[\b] 백스페이스. \b와 혼동하지 말것. /[\b]/g
  • abcd
일반적인 String에서는 \b가 백스페이스를 의미한다.
\b 단어의 경계.[\b]와 혼동하지 말것. /\bn[a-z]/g
  • I am not a boy
  • online
  • nope
\B \b 를 제외한 전부 /\Bn[a-z]/g
  • noonday
  • online
  • nope
\cX 컨트롤X와 매칭. \cM은 컨트롤M과 매칭
\d 숫자.[0-9]와 같음 /\d/g
  • 7 eight 9
  • 123
/^0[0-9]{2}/g
  • 0120
  • 12011
\D \d 를 제외한 전부 /\D/g
  • 7 eight 9
  • 12?3
\f form-feed
\n new line
\r carriage return
\s white space
ex>탭, 띄어쓰기, \n, \r
/k\s/g
  • korea
  • blank is
  • blank
\S \s 를 제외한 전부 /k\S/g
  • korea
  • blank is
\t
\v vertical tab
\w 알파벳+숫자+_. [A-Za-z0-9_]와 동일 /\w/g
  • !@#$%^&*()+_-[]{}\|"':;,.<>?/
\W \w 빼고 전부 /\W/g
  • !@#$%^&*()+_-[]{}\|"':;,.<>?/
\n \n이 자연수일때, ()로 지정한 n번째 정규식 /(.{2})e tru\1 is out \1ere/
  • the truth is out there ...
    1th :th
(th)가 \1로 지정된다.
\xhh hh는 hexacode, /[\x21-\x40]/g
  • !@#$%^&*()po
Code table 보기
\uhhhh hhhh는 hexacode, /[\u3131-\u3163\uac00-\ud7a3]/g
  • blah .
코드 번호> 3131:ㄱ 3163:ㅣ ac00:가 d7a3:힣 (javascript, java)

4. 정규식 사용 예제

/^[0-9]/
  • 09없다
  • 100점
  • 집이 10평
/^\w+$/
  • blahsoft
  • blah(co)
  • blah soft
/^[a-zA-Z][\w\-]{4,11}$/
  • blah2010
  • blah-2010!
  • 2010blah
  • ILikegoooooooooooooooooogle
/^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}/
  • 02-6288-2114
  • 031-779-7114
  • 12-1234-5678
  • 02-6288-2114545
  • 02-0288-2114
/^0\d{1,2}-[1-9]\d{2,3}-\d{4}$/
  • 02-6288-2114
  • 031-779-7114
  • 12-1234-5678
  • 02-2123-12314545
  • 02-0288-2114
/^[\.a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/
  • r-d.blah.co.kr
  • r-d.blah.co.kr입니다.
  • blah..co.kr
  • a.com
/^(?:[\w\-]{2,}\.)+[a-zA-Z]{2,}$/
  • r-d.blah.co.kr
  • r-d.blah.co.kr입니다.
  • blah..co.kr
  • a.com
/^[_a-zA-Z0-9\-]+@[\._a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/
  • abc@haha.co.kr
  • abc@haha..co.kr
  • hwang@a.com
/^[\w\-]+@(?:[\w\-]{2,}\.)+[a-zA-Z]{2,}$/
  • abc@haha.co.kr
  • abc@haha..co.kr
  • hwang@a.com
/^([a-z]+):\/\/((?:[a-z\d\-]{2,}\.)+[a-z]{2,})(:\d{1,5})?(\/[^\?]*)?(\?.+)?$/i
  • http://www.blah.co.kr/main/index.jsp?var=value
    1th :http
    2th :www.blah.co.kr
    3th :
    4th :/main/index.jsp
    5th :?var=value
  • http://www.blah.co.kr/main/index.jsp
    1th :http
    2th :www.blah.co.kr
    3th :
    4th :/main/index.jsp
    5th :
  • http://blah.co.kr/
    1th :http
    2th :blah.co.kr
    3th :
    4th :/
    5th :
  • http://blah.co.kr
    1th :http
    2th :blah.co.kr
    3th :
    4th :
    5th :
  • http://blah.co.kr:8088/main/
    1th :http
    2th :blah.co.kr
    3th ::8088
    4th :/main/
    5th :
/^[ㄱ-ㅣ가-힣]+$/
  • 티맥스소프트
  • ㅜㅜ
  • ㅎㅎ

5. Javascript 정규식 함수

함수 코드예제 코드설명
Array RegExp.exec (to be checked)
var myRe=/d(b+)(d)/ig;
var myArray = myRe.exec("cdbBdbsbz");

/d(b+)(d)/ig

  • cdbBdbsbz
myArray.index =1 ; (처음으로 매칭되는 위치, 컴터가 늘 그렇듯 위치는 0번째부터 센다.)
myArray.input = cdbBdbsbz; (체크할 대상)
myArray[0] = dbBd;(검사에 통과한 부분)
myArray[1] = bB;(1번째 괄호에서 체크된 부분)
myArray[2] = d;(2번째 괄호에서 체크된 부분)

myRe.lastIndex =5 ; (다음번 체크를 하기위한 위치.)
myRe.ignoreCase = true; (/i 플래그 체크)
myRe.global = true; (/g 플래그 체크)
myRe.multiline = false; (/m 플래그 체크)

RegExp.$_ = cdbBdbsbz;(입력한 스트링)
RegExp.$1 = bB;(1번째 괄호에서 체크된 부분 )
boolean RegExp.test(to be checked)
var myRe=/d(b+)(d)/ig;
var checked = myRe.test("cdbBdbsbz");
document.write("checked = " + checked +";<br>");

/d(b+)(d)/ig

  • cdbBdbsbz
실행결과: checked = true;
String RegExp.toString()
var myRe=/d(b+)(d)/ig;
var str = myRe.toString();
document.write(str);

실행 결과: /d(b+)(d)/ig
String String.replace(pattern or string, to be replaced)
var str = "abcdefe";
document.write(str.replace("e" , "f"));
실행 결과: abcdffe

e가 2번 있지만, 첫번째 인자가 정규식이 아니라 문자열일 경우는 첫번째 것만 바꾼다.
var str = "aba";
document.write(str.replace(/^a/ , "c"));
실행 결과: cba
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
실행 결과: Smith, John

re에 의해서 찾아진 문자열 들은 re에서 ()로 표현된 순서대로 $1, $2와 같이 변수로 저장된다.
var re = /\s(?:http|https):\/\/\S*(?:\s|$)/g;
var str = "url is http://iilii.egloos.com/ !!\n";
str += "blah home: http://www.blah.co.kr";
newstr = str.replace(re, function (str,p1,offset,s) {
     return "<a href='" + str + "'>" + str + "</a>";
  }
).replace(/\n/, "<br>");
document.write(newstr);
url is http://iilii.egloos.com/ !!
blah home: http://www.blah.co.kr

str: 찾은 문자열
p1: ()에서 검색된 1번째 문자열. 마찬가지로 p2,p3 등도 가능
offset: str을 찾은 위치
s : 원본 문자열.
Array String.match(regular expression
var str = "ABCdEFgHiJKL";
var myResult = str.match(/[a-z]/g );
for(var cnt = 0 ; cnt < myResult.length; cnt++){
    document.write(cnt +":" + myResult[cnt] +"<br>");
}

document.write("비교<br>");

var str = "ABCdEFgHiJKL";
var myResult = /[a-z]/g.exec(str);
for(var cnt = 0 ; cnt < myResult.length; cnt++){
    document.write(cnt +":" + myResult[cnt] +"<br>");
}
실행 결과:
0:d
1:g
2:i
비교
0:d

String.match(RegExp) =>g flag가 있으면 다 찾아낸다.
RegExp.exec(String) =>g flag가 있어도, 한 개만 찾고 끝낸다.
Array String.split([separator[, limit]])
var str = "ABCdEFgHiJKL";
var myResult = str.split(/[a-z]/g , 3);
for(var cnt = 0 ; cnt < myResult.length; cnt++){
    document.write(cnt +":" + myResult[cnt] +"<br>");
}
실행 결과:
0:ABC
1:EF
2:H

주어진 문자열을 separator를 기준으로 limit 만큼 자른다.

6. 정규식으로 만든 유용한 Javascript 함수

String removeTags(input)

HTML tag부분을 없애준다
function removeTags(input) {
    return input.replace(/<[^>]+>/g, ""); 
};
example>
var str = "<b>blah</b> <i>soft</i>";
document.write(str +"<br>");
document.write(removeTags(str));
result>
blah soft
blah soft

String String.trim()

문자열의 앞뒤 공백을 없애준다.
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
};
example>
var str = "         untrimed string            ";
document.write("========" + str+ "==============<br>");
document.write("========" + str.trim() + "==============");
result>
======== untrimed string ==============
========untrimed string==============

String String.capitalize()

단어의 첫 글자를 대문자로 바꿔준다.
String.prototype.capitalize = function() {
    return this.replace(/\b([a-z])/g, function($1){
        return $1.toUpperCase();
    }) ;  
};
example>
var str = "korea first world best";
document.write(str.capitalize());
result>
Korea First World Best

String number_format(input)

입력된 숫자를 ,를 찍은 형태로 돌려준다
function number_format(input){
    var input = String(input);
    var reg = /(\-?\d+)(\d{3})($|\.\d+)/;
    if(reg.test(input)){
        return input.replace(reg, function(str, p1,p2,p3){
                return number_format(p1) + "," + p2 + "" + p3;
            }    
        );
    }else{
        return input;
    }
}
example>
document.write(number_format(1234562.12) + "<br>");
document.write(number_format("-9876543.21987")+ "<br>");
document.write(number_format("-123456789.12")+ "<br>");
result>
1,234,562.12
-9,876,543.21987
-123,456,789.12

7. Java 정규식 함수

Pattern p = Pattern.compile("(a*)(b)");
Matcher m = p.matcher("aaaaab");
if (m.matches()) {
    for (int i = 0; i < m.groupCount() + 1; i++) {
        System.out.println(i + ":" + m.group(i));
    }
} else {
    System.out.println("not match!");
}

result>
0:aaaaab
1:aaaaa
2:b
0번째는 매칭된 부분.
String a = "I love her";
System.out.println(a.replaceAll("([A-Z])", "\"$1\""));

result>
"I" love her
자바도 $1을 쓸 수 있다.
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "dog");
    System.out.println(sb.toString());
}
m.appendTail(sb);
System.out.println(sb.toString());

result>
one dog
one dog two dog
one dog two dogs in the yard

Posted by iWithJoy
JAVA/Regular Expression2013. 3. 6. 13:58

어플리케이션들을 만들다 보면 종종 단어 검색, 메일 주소 점검, XML 문서의 무결성 확인 등과 같은 복잡한 문자열 처리 기능이 필요한 경우가 있게 마련이다. 이런 때에 패턴 매칭(pattern matching)이 자주 사용된다. Perl과 sed, awk와 같은 언어들은 일치하는 텍스트를 검색하기 위해, 패턴을 정의하는 문자들과 정규표현식을 사용해 향상된 패턴 매칭 능력을 제공해 주고 있다. 자바에서 패턴 매칭을 사용하려면 StringTokenizer 클래스와 수많은 charAt, substring 메소드를 동원해야만 한다. 하지만 이런 방식은 종종 아주 복잡하고 지저분한 코드를 만들어내곤 한다.

 

하지만모두지금까지의이야기일Java 2 Platform, Standard Edition(J2SE)1.4넘어오면서정규표현식을다룰있는java.util.regex라는새로운패키지가추가되었다.이제자바에도정규표현식의강력함을맛볼있는메타캐릭터들을사용할있게되었다.

 

이번글에서는정규표현식에대해간단히설명하고,아래의과정에따라java.util.regex패키지를통해정규표현식을활용하는방법에대해자세히설명하도록하겠다.

 

l       단어바꾸기

l       메일주소점검

l       파일에서제어문자제거

l       파일검색

 

(글의예제들을실행시켜보려면J2SE 1.4호환컴파일러와가상머신이필요함)

 

정규표현식만들기

정규표현식이란여러문자열들의공통적인특성을기술하는문자들의패턴이다. java.util.regex패키지를보면입력데이터로부터패턴을찾고수정할있는다양한방법들이제공됨을확인할있을것이다.

 

정규표현식의가장단순한형태는‘Java’, ‘programming’같은일반적인문자열이다.또한메일주소와같이특수한포맷을갖는문자열을검증등도가능하다.

 

정규표현식에는일반문자들과특수문자들이혼용되어사용된다.

 

\$

^

.

*

+

?

[

]

\.

 

 

 

 

‘\’시작하는문자열을제외한모든문자들은보통문자를의미한다.

 

특수문자들은물론고유한기능을갖고있다.예를들어‘.’경우라인종결문자를제외한어떤문자와도대응될있다.따라서정규표현식s.n‘sun’, ‘son’등과같이‘s’시작하고‘n’으로끝나는자로문자열어떤것이든있다.

 

이와같이우리는정규표현식에서제공되는여러특수문자들을통해줄의시작단어를찾거나,특정범위의문자찾기,대소문자구별없이찾기,정확히일치하는단어찾기등의작업을쉽게처리할있다.

 

java.util.regex패키지에서제공하는정규표현식은Perl언어에서의정규표현식사용법과같기때문에Perl익숙한사용자라면같은문법을그대로자바에도적용할있다.만약정규표현식에익숙하지않다면아래표가많은도움이것이다.

Construct

Matches

Characters

 

X

The characterx

\\

The backslash character

\0n

The character with octal value0n(0 <= n <= 7)

\0nn

The character with octal value0nn(0 <= n <= 7)

\0mnn

The character with octal value0mnn(0 <= m <= 3, 0 <= n <= 7)

\xhh

The character with hexadecimal value 0xhh

\uhhhh

The character with hexadecimal value 0xhhhh

\t

The tab character ('\u0009')

\n

Thenewline(line feed) character ('\u000A')

\r

The carriage-return character ('\u000D')

\f

The form-feed character ('\u000C')

\a

The alert (bell) character ('\u0007')

\e

The escape character ('\u001B')

\cx

The control character corresponding tox

 

 

Character Classes

[abc]

a,b, orc(simple class)

[^abc]

Any character excepta,b, orc(negation)

[a-zA-Z]

athroughzorAthroughZ, inclusive (range)

[a-z-[bc]]

athroughz, except forbandc:[ad-z](subtraction)

[a-z-[m-p]]

athroughz, except formthroughp:[a-lq-z]

[a-z-[^def]]

d,e, orf

 

 

Predefined Character Classes

.

Any character (may or may not match line terminators)

\d

A digit:[0-9]

\D

A non-digit:[^0-9]

\s

Awhitespacecharacter:[ \t\n\x0B\f\r]

\S

A non-whitespacecharacter:[^\s]

\w

A word character:[a-zA-Z_0-9]

\W

A non-word character:[^\w]

보다자세한설명과예제는J2SE 1.4 API문서의java.util.regex.Pattern참조하도록하자.

 

클래스와메소드

 

Pattern클래스

Pattern객체는Perl문법과비슷한형태로정의된정규표현식을나타낸다.

 

문자열로정의한정규표현식은사용되기전에반드시Pattern클래스의인스턴스로컴파일되어야한다.컴파일된패턴은Matcher객체를만드는사용되며, Matcher객체는임의의입력문자열이패턴에부합되는여부를판가름하는기능을담당한다.또한Pattern객체들은비상태유지객체들이기때문에여러개의Matcher객체들이공유할있다.

 

다음은Pattern클래스의주요메소드들에대한설명이다.

 

static Pattern compile(Stringregex):주어진정규표현식으로부터패턴을만들어낸다(이를컴파일한다표현한다).
static Matchermatcher(CharSequenceinput):
입력캐릭터시퀀스에서패턴을찾는Matcher객체를만든다.
String[] pattern():
컴파일된정규표현식을String형태로반환한다.
String[] split(CharSequenceinput):
주어진입력캐릭터시퀀스를패턴에따라분리한다.

 

/*

 * split메소드를이용해입력시퀀스를콤마(‘,’)공백문자를기준으로

 *나눈다.

 */

import java.util.regex.*;

 

public class Splitter {

   public static void main(String[] args) throws Exception {

       //이상의연속된‘,’공백문자를의미하는패턴을만든다.

       Pattern p =Pattern.compile("[,{space}]+");

       //패턴에따라입력문자열을쪼갠다.

       String[] result =

                p.split("one,two, three  four , five");

       for (inti=0;i<result.length;i++)

           System.out.println(result[i]);

   }

}

 

Matcher클래스

Matcher객체는특정한문자열이주어진패턴과일치하는가를알아보는데이용된다. Matcher클래스의입력값으로는CharSequence라는새로운인터페이스가사용되는데이를통해다양한형태의입력데이터로부터문자단위의매칭기능을지원받을있다.기본적으로제공되는CharSequence객체들은CharBuffer, String,StringBuffer클래스가있다.

 

Matcher객체는Pattern객체의matcher메소드를통해얻어진다. Matcher객체가일단만들어지면주로가지목적으로사용된다.

 

l       주어진문자열전체가특정패턴과일치하는가를판단(matches).

l       주어진문자열이특정패턴으로시작하는가를판단(lookingAt).

l       주어진문자열에서특정패턴을찾아낸다(find).

 

이들메소드는성공true실패false반환한다.

 

또한특정문자열을찾아새로운문자열로교체하는기능도제공된다.

 

appendRepalcement(StringBuffersb, String replacement)메소드는일치하는패턴이나타날때까지의모든문자들을버퍼(sb)옮기고찾아진문자열대신교체문자열(replacement)채워넣는다.또한appendTail(StringBuffersb)메소드는캐릭터시퀀스의현재위치이후의문자들을버퍼(sb)복사해넣는다.다음절에나오는예제코드를참고하도록하자.

 

CharSequence인터페이스

 

CharSequence인터페이스는다양한형태의캐릭터시퀀스에대해일관적인접근방법을제공하기위해새로생겨났다.기본적으로String,StringBuffer,CharBuffer클래스가이를구현하고있으므로적절한것을골라사용하면되며,인터페이스가간단하므로필요하면직접이를구현해새로하나만들어도된다.

 

ExampleRegexScenarios

아래코드는J2SE 1.4도큐먼트의예제를완성한것이다.

 

/*

 *코드는"One dog, two dogs in the yard."라는문자열을

 *표준출력을통해출력한다.

 */

import java.util.regex.*;

 

public class Replacement {

   public static void main(String[] args)

                        throws Exception {

       // ‘cat’이라는패턴생성

       Pattern p =Pattern.compile("cat");

       //입력문자열과함께매쳐클래스생성

       Matcher m =p.matcher("one cat," +

                      " two cats in the yard");

       StringBuffersb= newStringBuffer();

       booleanresult =m.find();

       //패턴과일치하는문자열을‘dog’으로교체해가며

       //새로운문자열을만든다.

       while(result) {

           m.appendReplacement(sb, "dog");

           result =m.find();

       }

       //나머지부분을새로운문자열끝에덫붙인다.

       m.appendTail(sb);

       System.out.println(sb.toString());

   }

}

 

메일주소포맷확인

다음코드는주어진입력시퀀스가메일주소포맷인가를판단한다.코드는가능한모든형태의메일주소를확인하는것은아니니필요하면코드를추가해사용하자.

 

/*

*메일주소에서잘못된문자검사

*/

public classEmailValidation{

  public static void main(String[] args)

                                throws Exception {

                                

     String input = "@sun.com";

     //메일주소가‘.’이나‘@’같은잘못된문자로시작하는확인

     Pattern p =Pattern.compile("^\\.|^\\@");

     Matcher m =p.matcher(input);

     if (m.find())

        System.err.println("Email addresses don't start" +

                           " with dots or @ signs.");

     //’www.’으로시작하는주소를찾는다.

     p =Pattern.compile("^www\\.");

     m =p.matcher(input);

     if (m.find()) {

       System.out.println("Email addresses don't start" +

               " with \"www.\", only web pages do.");

     }

     p =Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");

     m =p.matcher(input);

     StringBuffersb= newStringBuffer();

     booleanresult =m.find();

     booleandeletedIllegalChars= false;

 

     while(result) {

        deletedIllegalChars= true;

        m.appendReplacement(sb, "");

        result =m.find();

     }

 

m.appendTail(sb);

 

     input =sb.toString();

 

     if (deletedIllegalChars) {

        System.out.println("It contained incorrect characters" +

                          " , such as spaces or commas.");

     }

  }

}

 

파일에서제어문자제거

 

/*

*지정된파일에서제어문제를찾아제거한다.

*/

import java.util.regex.*;

importjava.io.*;

 

public class Control {

   public static void main(String[] args)

                                throws Exception {

                                

       //파일객체생성

        File fin = new File("fileName1");

       Filefout= new File("fileName2");

       //입출력스트림생성

       FileInputStreamfis=

                         newFileInputStream(fin);

       FileOutputStreamfos=

                       newFileOutputStream(fout);

 

       BufferedReaderin = newBufferedReader(

                      newInputStreamReader(fis));

       BufferedWriterout = newBufferedWriter(

                     newOutputStreamWriter(fos));

 

       //제어문자를의미하는패턴생성

       Pattern p =Pattern.compile("{cntrl}");

       Matcher m =p.matcher("");

       StringaLine= null;

       while((aLine=in.readLine()) != null) {

           m.reset(aLine);

           //제어문자들을문자열로대체

           String result =m.replaceAll("");

            out.write(result);

           out.newLine();

       }

       in.close();

       out.close();

   }

}

 

파일검색

 

/*

 * .java파일에서주석을찾아출력한다.

 */

import java.util.regex.*;

importjava.io.*;

importjava.nio.*;

importjava.nio.charset.*;

importjava.nio.channels.*;

 

public classCharBufferExample{

   public static void main(String[] args) throws Exception {

       //주석을나타내는패턴생성

       Pattern p =

           Pattern.compile("//.*$",Pattern.MULTILINE);

       

       //소스파일

       File f = new File("Replacement.java");

       FileInputStreamfis= newFileInputStream(f);

       FileChannelfc=fis.getChannel();

       

       //소스파일로부터CharBuffer생성

       ByteBufferbb =

           fc.map(FileChannel.MAP_RO, 0, (int)fc.size());

        Charsetcs=Charset.forName("8859_1");

       CharsetDecodercd=cs.newDecoder();

       CharBuffercb=cd.decode(bb);

       

       //매칭작업수행

       Matcher m =p.matcher(cb);

       while (m.find())

           System.out.println("Found comment: "+m.group());

   }

}

 

출처: 복연 [wegra@wegra.org] 자바스터디 네트워크[http://javastudy.co.kr]

'JAVA > Regular Expression' 카테고리의 다른 글

replaceAll 정규식 팁!  (0) 2013.03.22
정규식과 보안  (0) 2013.03.04
Posted by iWithJoy
JAVA/Regular Expression2013. 3. 4. 17:53

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

 

 

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

 

정규식

 

[abc]
 a, b, or c (simple class) -- a나 b나 c중의 하나
 
[^abc]
 Any character except a, b, or c (negation) -- a나 b나 c만 아니면 된다.
 
[a-zA-Z]
 a through z or A through Z, inclusive (range) -- 정규식은 대소문자를 구분한다.
 
[a-d[m-p]]
 a through d, or m through p: [a-dm-p] (union) -- 위에 것과 같다 a~d 혹은 m~p의 값이 들어오면 참이다
 
[a-z&&[def]]
 d, e, or f (intersection) -- 소문자 a~z까지 범위중 def중 하나와 같은것 이면 참이다. 즉 교집합과 같다.
 
[a-z&&[^bc]]
 a through z, except for b and c: [ad-z] (subtraction) -- 소문자 a~z까지의 범위중 b나 c가 아니면 참이다
 
[a-z&&[^m-p]]
 a through z, and not m through p: [a-lq-z](subtraction) -- 소문자 a~z까지의 범위중 m~p사의 것이 아니면 참이다.
 

 
.
 Any character (may or may not match line terminators)
 
\d
 A digit: [0-9] -- 0~9까지의 숫자 면 참
 
\D
 A non-digit: [^0-9] -- 0~9의 숫자가 아닌것이면 참
 
\s
 A whitespace character: [ \t\n\x0B\f\r]
 
\S
 A non-whitespace character: [^\s]
 
\w
 A word character: [a-zA-Z_0-9]
 
\W
 A non-word character: [^\w]
  

while(cnt != 3){

String str = sc.next();

boolean boo = str.matches("1-9"); -- 1-9만 받아들인다 equals와 같아진다.

System.out.println(boo);

cnt++;

}

   

 XY
 X followed by Y
 
X|Y
 Either X or Y
 
(X)
 X, as a capturing group -- 괄호 사용시 하나의 묶음이 된다.
 

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

 

 ip주소 자바 정규식

 

public static final String IPV4_REGEX = "\\A(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z"; 

 

public static final String IPV6_HEX4DECCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z"; 

 

public static final String IPV6_6HEX4DEC_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z";

 

 public static final String IPV6_HEXCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z"; public static final String IPV6_REGEX = "\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z";
 

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

 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>업로드 파일확장자 검사</title>
<script language=javascript>

 

function checkExt()
{

    var IMG_FORMAT = "\\.(bmp|gif|jpg|jpeg|png)$";

 

    if((new RegExp(IMG_FORMAT, "i")).test(document.form1.text1.value)) return true;

 

    alert("이미지 파일만 첨부하실 수 있습니다.   ");
    return false;
}

 

</script>
</head>
<body>
<form name=form1 method=post onsubmit="return checkExt()"

    encType="multipart/form-data">
<input type=file name=text1>
<input type=submit>
</form>
</body>
</html>

 

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

 

□ JSP

 o 취약한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ;// 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames();// 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName);// 파일의 이름 얻기

if(fileName == null)
out.print("Error");
 else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr");
out.print("User Name : " + multi.getParameter("userName") + "<BR>");
out.print("Form Name : " + formName + "<BR>");
out.print("File Name  : " + fileName);


 catch(Exception e)
out.print("Error");
 
%> 

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


 o 안전한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ; // 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames();  // 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName); // 파일의 이름 얻기

String file_ext = fileName.substring(fileName.lastIndexOf('.') + 1);
if(!( file_ext.equalsIgnoreCase("hwp") || file_ext.equalsIgnoreCase("pdf") || file_ext.equalsIgnoreCase("jpg")) )
out.print("업로드 금지 파일");


if(fileName == null)
out.print("파일 업로드 실패");
 else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr"); // 한글인코딩
out.print("File Name  : " + fileName);

 catch(Exception e)

 

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

 

download.jsp

<%@ page contentType="application;" %>

<%@ page language="java" import="java.util.*,java.io.*,java.sql.*,java.text.*" %>

<%@ include file="boardcfg.jsp" %>

<%

String mask = request.getParameter("mask");


String fileP = request.getRealPath("/")+"upload/";
String fileN1 = "", fileN2 = "";
long fSize = 0;

String queryw = " WHERE maskname = ? ";
String query = "SELECT filename, filesize from "+tableName+" " + queryw;
String query2 = "update "+tableName+" SET download = download + 1 " + queryw;

Connection pconn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
%>

<%@ include file = "db.jsp"%>

<%
pstmt = pconn.prepareStatement(query);
pstmt.setString(1,mask);
rs = pstmt.executeQuery();

if(rs.next()) {
        fileN1 = mask;
        fileN2 = rs.getString("filename");
        fileN2 = new String(fileN2.getBytes("euc-kr"),"8859_1");
        fSize = rs.getInt("filesize");
}

rs.close();
pstmt.clearParameters();

pstmt = pconn.prepareStatement(query2);
pstmt.setString(1,mask);
pstmt.executeUpdate();

pstmt.close();

} catch(Exception e){
} finally {
 if (pstmt!=null) pstmt.close();
 if (pconn!=null) pconn.close();
}

// Download file
String ut = fileP+fileN1;

File file = new File(ut); // 절대경로입니다.
byte b[] = new byte[(int)file.length()];
 String strClient=request.getHeader("User-Agent");
           if(strClient.indexOf("MSIE 5.5")>-1) {
 response.setHeader("Content-Disposition", "filename=" + fileN2 + ";");
           } else {
 response.setHeader("Content-Disposition", "attachment;filename=" + fileN2 + ";");
           }
if (fSize > 0 && file.isFile())
{
 BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
 BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
 int read = 0;
 try {
  while ((read = fin.read(b)) != -1){
             outs.write(b,0,read);
  }
  outs.close();
  fin.close();
 } catch (Exception e) {
  System.out.println(e.getMessage());
 } finally {
  if(outs!=null) outs.close();
  if(fin!=null) fin.close();
 }
}
%>

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

파일명을 특정 규칙에 맞는지 검사하는 javascript

/* 영문, 숫자, 언더바(_), 하이픈(-)만 가능 */
function checkInputFileName(fileName) {
var fileNameMatch = new RegExp(/^[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/);

if(fileNameMatch.test(fileName)) {
return true;
}
return false;
}

정규식을 이용하였기 때문에 여러가지로 응용이 가능할 듯 하다.

정규식을 살펴 보면
/^[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/
=>입력의 시작부터 A-Z, a-z, 0-9, _, - 중 하나 이상의 문자가 포함되고 . 이후에 다시 A-Z, a-z, 0-9, _, - 중 하나 이상의 문자가 포함되며 이후 입력이  종료 된다.
ex) a.b (O), aabc01.bbdd0 (O), abcc. (X) , #a.b (X)
#a.b의 경우 /[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/ 이 정규식을 적용하면 true가 되나 ^ 가 포함된 위의 정규식을 적용하면 정규식에 매칭되는 a.b 앞에 아무 문자도 없어야 하므로 false가 된다.

/ reg exp / : /를 사용하여 정규식의 시작과 끝을 알린다.
^ : 입력의 시작 부분을 찾는다.
[abc] : 괄호 안의 문자중 하나를 찾음. 예를 들어 [ab]는 "plain"의 "a"를 찾는다.
[a-z] : a부터 z를 포함하는 문자를 의미한다.
\ : 다음에 오는 문자를 특수 문자로 표시함. [a-z]는 a부터z를 의미하지만 [a\-z]는 a와 -와 z를 의미한다.
{n,[m]} : n,m은 음이 아닌 정수. 최소n번 최대 m번 일치하는 문자열

 

'JAVA > Regular Expression' 카테고리의 다른 글

replaceAll 정규식 팁!  (0) 2013.03.22
Java 정규 표현식 사용하기  (0) 2013.03.06
Posted by iWithJoy
카테고리 없음2012. 12. 22. 11:55

성경일독표

◀ 성경읽기표 ▶                     주의 말씀은 내 발에 등이요 내 길에 빛이니이다 (시119:105)

1주

창1~3

창4~6

창7~9

창10~12

창13~15

창16~18

창19~21

 

27주

잠25~27

잠28~31

전1~3

전4~6

전7~9

전10~12

아1~4

2주

창22~24

창25~27

창28~30

창31~33

창34~36

창37~39

창40~42

 

28주

아5~8

사1~3

사4~6

사7~9

사10~12

사13~15

사16~18

3주

창43~45

창46~48

창49~50

출1~3

출4~6

출7~9

출10~12

 

29주

사19~21

사22~24

사25~27

사28~30

사31~33

사34~36

사37~39

4주

출13~15

출16~18

출19~21

출22~24

출25~27

출28~30

출31~33

 

30주

사40~42

사43~45

사46~48

사49~51

사52~54

사55~57

사58~60

5주

출34~36

출37~40

레1~3

레4~6

레7~9

레10~12

레13~15

 

31주

사61~63

사64~66

렘1~3

렘4~6

렘7~9

렘10~12

렘13~15

6주

레16~18

레19~21

레22~24

레25~27

민1~3

민4~6

민7~9

 

32주

렘16~18

렘19~21

렘22~24

렘25~27

렘28~30

렘31~33

렘34~36

7주

민10~12

민13~15

민16~18

민19~21

민22~24

민25~27

민28~30

 

33주

렘37~39

렘40~42

렘43~45

렘46~48

렘49~50

렘51~52

애1~2

8주

민31~33

민34~36

신1~3

신4~6

신7~9

신10~12

신13~15

 

34주

애3~5

겔1~3

겔4~6

겔7~9

겔10~12

겔13~15

겔16~18

9주

신16~18

신19~21

신22~24

신25~27

신28~30

신31~34

수1~3

 

35주

겔19~21

겔22~24

겔25~27

겔28~30

겔31~33

겔34~36

겔37~39

10주

수4~6

수7~9

수10~12

수13~15

수16~18

수19~21

수22~24

 

36주

겔40~42

겔43~45

겔46~48

단1~3

단4~6

단7~9

단10~12

11주

삿1~3

삿4~6

삿7~9

삿10~12

삿13~15

삿16~18

삿19~21

 

37주

호1~3

호4~7

호8~11

호12~14

요엘

1~3

아모스

1~3

아모스4~6

12주

룻1~4

삼상

1~4

삼상

5~8

삼상

9~12

삼상

13~16

삼상

17~20

삼상

21~24

 

38주

아모스

7~9

오바댜1

요나

1~4

미가

1~3

미가

4~7

나훔

1~3

하박국

1~3

13주

삼상

25~28

삼상

29~31

삼하

1~4

삼하5~8

삼하

9~12

삼하

13~16

삼하

17~20

 

39주

스바냐

1~3

학개

1~2

스가랴

1~4

스가랴5~7

스가랴8~10

스가랴11~14

말라기

1~4

14주

삼하

21~24

왕상

1~4

왕상5~7

왕상

8~10

왕상

11~14

왕상

15~18

왕상

19~22

 

40주

마1~3

마4~6

마7~9

마10~12

마13~15

마16~18

마19~21

15주

왕하

1~4

왕하5~8

왕하

9~12

왕하

13~16

왕하

17~20

왕하

21~25

대상

1~4

 

41주

마22~24

마25~26

마27~28

막1~3

막4~6

막7~9

막10~12

16주

대상5~8

대상

9~12

대상

13~16

대상

17~20

대상

21~24

대상

25~29

대하

1~4

 

42주

막13~16

눅1~3

눅4~6

눅7~9

눅10~12

눅13~15

눅16~18

17주

대하5~8

대하

9~12

대하

13~16

대하

17~20

대하

21~24

대하

25~28

대하

29~32

 

43주

눅19~21

눅22~24

요1~3

요4~6

요7~9

요10~12

요13~15

18주

대하

33~36

1~4

스5~7

스8~10

느1~3

느4~7

느8~10

 

44주

요16~18

요19~21

행1~3

행4~6

행7~9

행10~12

행13~15

19주

느11~13

에1~3

에4~6

에7~10

욥1~3

욥4~6

욥7~9

 

45주

행16~18

행19~21

행22~24

행25~26

행27~28

롬1~3

롬4~6

20주

욥10~12

욥13~15

욥16~18

욥19~21

욥22~24

욥25~27

욥28~30

 

46주

롬7~8

롬9~11

롬12~13

롬14~16

고전

1~3

고전

4~6

고전

7~9

21주

욥31~33

욥34~36

욥37~39

욥40~42

시1~5

시6~10

시11~15

 

47주

고전

10~12

고전

13~14

고전

15~16

고후

1~3

고후

4~6

고후

7~9

고후

10~13

22주

시16~20

시21~25

시26~30

시31~35

시36~40

시41~45

시46~50

 

48주

갈1~3

갈4~6

엡1~3

엡4~6

빌1~4

골1~4

살전

1~3

23주

시51~55

시56~60

시61~65

시66~70

시71~75

시76~80

시81~85

 

49주

살전

4~5

살후

1~3

딤전

1~3

딤전

4~6

딤후

1~4

딛1~3

몬1

24주

시86~90

시91~95

96~100

101~105

106~110

111~115

116~120

 

50주

히1~3

히4~6

히7~9

히10~11

히12~13

약1~2

약3~5

25주

121~125

126~130

131~135

136~140

141~145

146~150

잠1~3

 

51주

벧전

1~2

벧전

3~5

벧후

1~3

요일

1~2

요일

3~5

요이,삼/유

계1~3

26주

잠4~6

잠7~9

잠10~12

잠13~15

잠16~18

잠19~21

잠22~24

 

52주

계4~6

계7~9

계10~12

계13~15

계16~18

계19~20

계21~22


* 하루 3장 밀리면 그것도 쉽지 않죠. 열심히 일독합시다.

 

갓피플 성경: http://bible.godpeople.com

 

 

성경 통독(1년 1독)을 위한 프로그램

   

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주

32주

33주

34주

35주

36주

37주

38주

39주

40주

41주

42주

43주

44주

45주

46주

47주

48주

49주

50주

51주

52주

 

 

 

 

 

Posted by iWithJoy
Server2012. 12. 14. 11:29

Wowza에서는 관리툴인 JConsole을 사용하여 메모리, CPU사용, application별 connection 현황 등을 파악할 수 있다.
Wowza에서 JConsole을 사용하기 위해서는 Server.xml 파일의 <JMXRemoteConfiguration> 태그 단을 수정해야 한다.
그리고 JConsole 접속 admin 패스워드도 수정한다. 디폴트는 admin/admin으로 잡혀 있다.

# vi /usr/local/WowzaMediaServer/conf/Server.xml

  
 <Root>
   <Server>
      <JMXRemoteConfiguration>
         <Enable>true</Enable>
            <IpAddress>localhost or 서버IP</IpAddress>
               <RMIServerHostName>서버IP</RMIServerHostName> 
  

 

# vi /usr/local/WowzaMediaServer/conf/jmxremote.password

  
 admin admin => 관리자 아이디와 패스워드를 스페이스로 구분해서 수정  
 

JConsole 실행 후 나타나는 접속 입력 창에서

Remote Process 선택 후

 

service:jmx:rmi://서버IP:8084/jndi/rmi://서버IP:8085/jmxrmi

 

입력하고, 위의 jmxremote.password 에서 수정한 아이디와 패스워드를 입력한다.

 

Posted by iWithJoy
Server2012. 12. 13. 17:03

 

Wowza Media Sever2 설치는 시키는 데로만 하면 되므로 어려운 것은 없습니다.

 

1. http://www.wowzamedia.com/store.html 에서 설치파일을 다운로드 합니다.

 

2. Wowza Server Developer edition의 GET FREE를 통해 등록하고 키를 이메일로 받는다.

 

3. 설치파일을 실행합니다.

 

4. Java Runtime 이 없다면 1.5 이상을 설치합니다. http://www.java.com/ko

 

5. Wowza Startup 을 실행합니다.

 

6. http://localhost:1935/ 로 접속해서 Wowza Media Server 버전이 표시된다면 성공입니다.!

Wowza Media Server 2 Developer 2.0.0 build22912

 

이제 설치 및 실행은 끝난 상태... 테스트를 해 보겠습니다.

 

[설치폴더]\application 에 vod 폴더를 생성합니다.

 

[설치폴더]\conf 에 vod 폴더를 생성합니다.

 

[설치폴더]\conf 의 application,xml 파일은 vod 폴더에 복사합니다.

 

/conf/vod/Application.xml에 iPhone용 Streamer인 cupertinostreaming이 설정되어 있는지 확인합니다.

 

<HTTPStreamers>sanjosestreaming,cupertinostreaming,smoothstreaming</HTTPStreamers>   

 Wowza Server를 시작한 후 아이폰 또는 아이팟터치에서

 

<html>
<video src="http://[SERVER-IP]:1935/vod/mp4:Extremists.m4v/playlist.m3u8" width=120 height=90 controls=true />
</html>

 

과 같은 웹페이지에 접속하면 재생되는 것을 확인할 수 있습니다.

안드로이드폰이나 퀵타임플레이어 에서 재생하기 위해서는

먼저 /conf/vod/Application.xml 의 RTP/Authentication/PlayMethod 를 none으로 해주어야 합니다.

  <RTP>

   <Authentication>
    <PublishMethod>digest</PublishMethod>
    <PlayMethod>none</PlayMethod>
   </Authentication>

 

접속은 rtsp://[SERVER-IP]:1935/vod/mp4:Extremists.m4v 와 같이 하면 됩니다.

 

안드로이드에서 재생이 안될 경우에는 vhost.xml에서 포트 554를 함께 열어주시고, rtsp://[SERVER-IP]/vod/mp4:Extremists.m4v 과 같이 접속하여 재생하여 보시기 바랍니다.

 

    <Port>1935, 554</Port>

또는 [설치폴더]\examples\SimpleVideoStreeaming\Client\ 의 소스를 실행하여

 

Server에는 "rtmp://[SERVER-IP]:1935/vod

 

Stream에는 mp4:Extremists.m4v 를 넣어주고 Play 버튼을 눌러주면 재생을 확인할 수 있습니다.

 

 

테스트가 끝나고 실제 서비스시에는

 

윈도우 :

[서비스 - Wowza Media Server] - 시작,

시작유형 - 자동

 

리눅스 :

/etc/init.d/WowzaMediaServer start

chkconfig --level 345 WowzaMediaServer on

 

출처: http://cafe.naver.com/wowzamedia/17

 

vhost.xml에서 포트 554여는 방법은 어떻게 하는 건가요?

Vhost.xml의 hostport에 <Port>1935, 554</Port> 과 같이 554를 추가해주면 됩니다.

 

"재생할 수 없는 동영상입니다"의 경우,

application.xml 의 <playmethod>digest</playmethod>를
<playmethod>none</playmethod>으로 바꿔줘야 한다.

 

아이폰 실행 성공!
<video src=http://[SERVER-IP]:1935/vod/mp4:Extremists.m4v/playlist.m3u8" width=120 height=90 controls=true />

 

c:\Program Files (x86)\Wowza Media Systems\Wowza Media Server 2.2.2\conf\Application.xml

Line 26:

  <Streams>
   <StreamType>default</StreamType>
   <StorageDir>d:\asfRoot</StorageDir>
   <KeyDir>${com.wowza.wms.context.VHostConfigHome}/keys</KeyDir>
   <!-- LiveStreamPacketizers (separate with commas): cupertinostreamingpacketizer, smoothstreamingpacketizer, sanjosestreamingpacketizer, cupertinostreamingrepeater, smoothstreamingrepeater, sanjosestreamingrepeater -->
   <LiveStreamPacketizers></LiveStreamPacketizers>   
   <!-- Properties defined here will override any properties defined in conf/Streams.xml for any streams types loaded by this application -->
   <Properties>
   </Properties>
  </Streams>

Line 54:

   <Authentication>
    <PublishMethod>digest</PublishMethod>
    <PlayMethod>none</PlayMethod>
   </Authentication>

c:\Program Files (x86)\Wowza Media Systems\Wowza Media Server 2.2.2\conf\VHost.xml

Line 10:

    <Port>1935, 554</Port>

 

C:\Program Files (x86)\Wowza Media Systems\Wowza Media Server 2.2.2\examples\SimpleVideoStreaming\client\simplevideostreaming.html

Server: rtmp://localhost/vod/121209

Stream: mp4:121209_2_bh.mp4 [Play]

 

Wowza Media server로 스트리밍 재생 시, 디폴트값으로 한글파일명의 동영상은 재생이 안된다.

한글파일을 인식하기 위해서는 /Wowza 디렉토리/conf/log4j.properties 파일을 수정하면 가능해진다.

 # vi /서버 디렉토리/conf/log4j.properties
Line 16:

#log4j.appender.[appender].encoding=UTF-8 -> 주석 해제

http://www.wowzamedia.com/forums/showthread.php?t=6029

 

 

한글 폴더나 한글 파일을 사용하셔야 하는 경우,

http://www.wowza.com/forums/content.php?116 에서

해당 버전의 StreamNameAlias AddOn 을 다운로드 받아 설치하고,

 

사용할 어플리케이션의 Application.xml에

 

   <Module>
    <Name>ModuleStreamNameAlias</Name>
    <Description>ModuleStreamNameAlias</Description>
    <Class>com.homux.wms.plugin.streamnamealias.ModuleStreamNameAlias</Class>
   </Module>

 

과 같이 추가하여 사용하시거나 기존에 ModuleStreamNameAlias를 사용하셨다면 대체하시면 됩니다.

 

기존에 ModuleStreamNameAlias를 사용하지 않으셨던 분들은

 

Application.xml 파일의 끝부분의 Properties에

 

   <Property>
    <Name>aliasMapFileStream</Name>
    <Value>${com.wowza.wms.context.VHostConfigHome}/conf/aliasmap.stream.txt</Value>
   </Property>
   <Property>
    <Name>aliasMapFilePlay</Name>
    <Value>${com.wowza.wms.context.VHostConfigHome}/conf/aliasmap.play.txt</Value>
   </Property>
   <Property>
    <Name>aliasMapPathDelimiter</Name>
    <Value>/</Value>
   </Property>
   <Property>
    <Name>aliasMapNameDelimiter</Name>
    <Value>=</Value>
   </Property>
   <Property>
    <Name>aliasMapDebug</Name>
    <Value>false</Value>
    <Type>Boolean</Type>
   </Property>

 

를 추가하시고 aliasmap.play.txt, aliasmap.stream.txt를 /conf 폴더에 복사하셔야 합니다.

 

제가 컴파일을 2.1.2.04에서 했기 때문에 이전 버전에서는 작동안할 수도 있습니다.

 

**********

RTSP URL의 한글 문제는 Wowza Media Server 2.1.2 patch8에서 수정되었습니다.

**********
출처: http://cafe.naver.com/wowzamedia/29

 

Posted by iWithJoy