Linux/Unix2019. 4. 17. 03:00

이번에는 리눅스에 추가한 하드디스크로 LVM을 만드는걸 포스팅 해본다


먼저 간단하게 요약 해보면 (rhel ver6 기준)


1. 하드디스크 추가


2. 추가한 디스크 파티션을 LVM 타입(8e)으로 생성


3. 물리불륨생성


4. 물리불륨을 불륨그룹에 추가


5. 볼륨그룹에서 논리볼륨으로 다시 할당


6. 포맷(EXT4) 을 한뒤 OS에 마운트



1. 먼저 OS 초기 디스크 상태

[root@vmsvr-6u8 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_vmsvr6u8-lv_root
                       18G  3.0G   14G  19% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             477M   35M  418M   8% /boot
cs

먼저 OS을 기본으로 설치 하고난 후 상태 df 명령어를 이용하여 확인.


2. fdisk 추가된 하드디스크 확인


[root@vmsvr-6u8 ~]# fdisk -l
 
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ed063
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM
 
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
 
 
Disk /dev/mapper/vg_vmsvr6u8-lv_root: 18.9 GB, 18865979392 bytes
255 heads, 63 sectors/track, 2293 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
 
 
Disk /dev/mapper/vg_vmsvr6u8-lv_swap: 2080 MB, 2080374784 bytes
255 heads, 63 sectors/track, 252 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
cs


fdisk -l 명령어를 이용하여 /dev/sdb 하드디스크가 8G 짜리가 추가되어 있는걸 확인 할 수 있다



3. fdisk로 파티션 LVM(8e)타입을 지정


[root@vmsvr-6u8 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x85fdf936.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
 
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
 
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1): (enter)
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): (enter)
Using default value 1044
 
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
 
Command (m for help): w
The partition table has been altered!
 
Calling ioctl() to re-read partition table.
Syncing disks.
cs


fdisk를 이용하여 추가된 하드디스크 파티션을 LVM 타입 8e로 구성한다



4. fdisk로 파티션 확인


[root@vmsvr-6u8 ~]# fdisk -l
 
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ed063
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM
 
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x85fdf936
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1044     8385898+  8e  Linux LVM
 
Disk /dev/mapper/vg_vmsvr6u8-lv_root: 18.9 GB, 18865979392 bytes
255 heads, 63 sectors/track, 2293 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
 
 
Disk /dev/mapper/vg_vmsvr6u8-lv_swap: 2080 MB, 2080374784 bytes
255 heads, 63 sectors/track, 252 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
cs


생성된 파티션은 뒤에 숫자가 붙어서 /dev/sdb1로 표시 된다



5. 물리볼륨 생성한다 (pvcreate)


[root@vmsvr-6u8 ~]# pvcreate /dev/sdb1 
  Physical volume "/dev/sdb1" successfully created
 
[root@vmsvr-6u8 ~]# pvscan 
  PV /dev/sda2   VG vg_vmsvr6u8     lvm2 [19.51 GiB / 0    free]
  PV /dev/sdb1                      lvm2 [8.00 GiB]
  Total: 2 [27.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 1 [8.00 GiB]
cs


pvcreate [디바이스명] 명령어 형태로 물리볼륨을 생성한다

그후 pvscan 으로 확인을 한다



6. 볼륨그룹에 설정 (vgcreate)


[root@vmsvr-6u8 ~]# vgcreate Volgroup01 /dev/sdb1        
  Volume group "Volgroup01" successfully created
 
[root@vmsvr-6u8 ~]# vgdisplay 
  --- Volume group ---
  VG Name               Volgroup01
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               8.00 GiB
  PE Size               4.00 MiB
  Total PE              2047
  Alloc PE / Size       0 / 0   
  Free  PE / Size       2047 / 8.00 GiB
  VG UUID               nq9XJ3-06EY-pq5r-6zCj-sx66-exRB-CwnB0Z
   
  --- Volume group ---
  VG Name               vg_vmsvr6u8
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.51 GiB
  PE Size               4.00 MiB
  Total PE              4994
  Alloc PE / Size       4994 / 19.51 GiB
  Free  PE / Size       0 / 0   
  VG UUID               AEEtoW-v37n-2nMi-mmwD-BI1a-VIyN-2ZZs2t
cs


vgcreate [볼륨명] [디바이스명] 명령어 형태로 볼륨그룹 생성한다

그후 vgdisplay 으로 확인을 한다 Free PE가 모두 할당 안되어 있는걸 확인 할 수 있다



7. 논리 볼륨을 설정한다 (lvcreate)


[root@vmsvr-6u8 ~]# lvcreate -l 100%FREE -n data Volgroup01
  Logical volume "data" created.
 
[root@vmsvr-6u8 ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/Volgroup01/data
  LV Name                data
  VG Name                Volgroup01
  LV UUID                HS9s91-7fG7-4Xg9-ZIoy-jf9J-VnPR-8gnLWl
  LV Write Access        read/write
  LV Creation host, time vmsvr-6u8, 2019-04-17 00:07:59 +0900
  LV Status              available
  # open                 0
  LV Size                8.00 GiB
  Current LE             2047
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/vg_vmsvr6u8/lv_root
  LV Name                lv_root
  VG Name                vg_vmsvr6u8
  LV UUID                O5kfud-g7QI-3cr9-rPnb-XbD2-f8n6-KxjNql
  LV Write Access        read/write
  LV Creation host, time vmsvr-6u8, 2019-04-16 19:25:52 +0900
  LV Status              available
  # open                 1
  LV Size                17.57 GiB
  Current LE             4498
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/vg_vmsvr6u8/lv_swap
  LV Name                lv_swap
  VG Name                vg_vmsvr6u8
  LV UUID                IMWRXK-eYbr-I75B-eT0A-2hwG-hKBg-Mxptdy
  LV Write Access        read/write
  LV Creation host, time vmsvr-6u8, 2019-04-16 19:25:59 +0900
  LV Status              available
  # open                 1
  LV Size                1.94 GiB
  Current LE             496
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
   
[root@vmsvr-6u8 ~]# vgdisplay 
  --- Volume group ---
  VG Name               Volgroup01
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               8.00 GiB
  PE Size               4.00 MiB
  Total PE              2047
  Alloc PE / Size       2047 / 8.00 GiB
  Free  PE / Size       0 / 0   
  VG UUID               nq9XJ3-06EY-pq5r-6zCj-sx66-exRB-CwnB0Z
   
  --- Volume group ---
  VG Name               vg_vmsvr6u8
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.51 GiB
  PE Size               4.00 MiB
  Total PE              4994
  Alloc PE / Size       4994 / 19.51 GiB
  Free  PE / Size       0 / 0   
  VG UUID               AEEtoW-v37n-2nMi-mmwD-BI1a-VIyN-2ZZs2t
cs


lvcreate -l [size] -n [논리볼륨명] [볼륨명]

lvcreate 명령어를 사용하여 -l (PE 개수) -L (용량) 옵션으로 디스크를 용량을 지정 할 수 있다

vgdisplay 명령어로 Free Pe 가 0으로 용량 모두 할당 된것을 확인 할 수 있다



8. 파일시스템 포맷 및 마운트


[root@vmsvr-6u8 ~]# mkfs.ext4 /dev/Volgroup01/data
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2096128 blocks
104806 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
 
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
 
[root@vmsvr-6u8 ~]# mount /dev/Volgroup01/data /data
 
[root@vmsvr-6u8 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_vmsvr6u8-lv_root
                       18G  3.0G   14G  19% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             477M   35M  418M   8% /boot
/dev/mapper/Volgroup01-data
                      7.8G   18M  7.4G   1% /data
cs


mkfs.ext4 [LV PATH] (아직까지 난 EXT4가 가장 맘에 든다)

mount [LV PATH] [지정디렉토리]

ext4로 포맷후 마운트할 디렉토리에 마운트 하면 끝!



9 자동마운트를 위해 fstab에 추가


[root@vmsvr-6u8 ~]# vi /etc/fstab 
 
#
# /etc/fstab
# Created by anaconda on Tue Apr 16 19:26:28 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg_vmsvr6u8-lv_root /                       ext4    defaults        1 1
UUID=0f7adb3a-6bcb-4512-b812-e32c5e8140ed /boot         ext4    defaults        1 2
/dev/mapper/vg_vmsvr6u8-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                 tmpfs   defaults        0 0
devpts                  /dev/pts                 devpts  gid=5,mode=620  0 0
sysfs                   /sys                     sysfs   defaults        0 0
proc                    /proc                    proc    defaults        0 0
/dev/mapper/Volgroup01-data       /data          ext4    defaults        1 2
cs


서버가 부팅이 되어도 자동으로 마운트 되기 위해 /etc/fstab 에 추가한다

/dev/mapper/Volgroup01-data     /data           ext4    defaults        1 2



일단 여기까지 나중에 명령어 별로 옵션 및 논리볼륨 증설 및 제거 하는걸 추가!!

Posted by 샤키
Linux/Unix2019. 2. 1. 03:00

  1. 환경
    1. rhel 6.9
    2. openssl 1.1.0h
    3. apache 2.4.33
    4. tomcat 7.0.88
    5. mysql 5.7
    6. jdk(java) 1.7.8

 

  1. 설치전
    1. 의존성 패키지 설치

]#yum groupinstall "Development tools"

]#yum install expat-devel zlib-devel

 

  1. 설치
    1. openssl

https://www.openssl.org/

위사이트에서 1.1.0h 시리즈 최신버전을 다운 받는다

2018 6 기준 ver 

 

]# tar xvfz openssl-1.1.0h.tar.gz

]# cd openssl-1.1.0h

]# ./config shared --prefix=/usr/local/openssl

]# make

]# make install

]# openssl version


 

  • /usr/local/openssl/bin/openssl: error while loading shared libraries: 

                    libssl.so.1.1: cannot open shared object file: No such file or directory

    • ]# ln -s /usr/local/openssl/lib/libssl.so.1.1 /lib64/libssl.so.1.1
    • ]# ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /lib64/libcrypto.so.1.1

실행했을때 라이브러리 관련 에러 나는 라이브러리를 64밑에 링크로 걸어준다

  • ]# mv /usr/bin/openssl /usr/bin/openssl__
  • ]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

     편의상 기존 명령어를 백업하고 새로운 버전으로 교체한다 (환경변수 새로 지정보다 이방법 추천)

 

  1. apr, apr-util, pcre  버전업되면 안받아질수 있음

wget http://mirror.apache-kr.org//apr/apr-1.6.3.tar.gz

wget http://mirror.apache-kr.org//apr/apr-util-1.6.1.tar.gz

wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz

 

  • apr

]# tar xvfz apr-1.6.3.tar.gz

]# cd apr-1.6.3

]# ./configure --prefix=/usr/local/apr

]# make

]# make install

 

  • rm: cannot remove `libtoolT': No such file or directory
    • apr-1.6.3]# cp -arp libtool libtoolT

libtoolT 관련 에러가 나오면 libtooT 복사후에 설치를 한다

 

  • apr-util

]# tar xvfz apr-util-1.6.1.tar.gz

]# cd apr-util-1.6.1

]# ./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-util

]# make

]# make install

 

  • make[1]: *** [xml/apr_xml.lo] 오류 1

make[1]: Leaving directory `/root/source/apr-util-1.6.1'

make: *** [all-recursive] 오류

설치시 위와 같이 에러 나올시 expat-devel 설치

yum install expat-devel

 

  • pcre

]# tar xvfz pcre-8.42.tar.gz

]# cd pcre-8.42

]# ./configure --prefix=/usr/local/pcre

]# make

]# make install

 

  1. Apache

wget http://mirror.navercorp.com/apache//httpd/httpd-2.4.33.tar.gz

 

]# tar xvfz httpd-2.4.33.tar.gz

]# cd httpd-2.4.33

]# ./configure --prefix=/opt/APACHE/httpd2.4 \

--enable-module=so \

--enable-rewrite \

--enable-so \

--with-apr=/usr/local/apr \

--with-apr-util=/usr/local/apr-util \

--with-pcre=/usr/local/pcre \

--enable-mods-shared=all \

--enable-ssl \

--enable-modules=ssl \

--with-ssl=/usr/local/openssl

 

OR

 

]# ./configure --prefix=/opt/APACHE/httpd2.4 --enable-module=so --enable-rewrite --enable-so 

--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre 

--enable-mods-shared=all --enable-ssl --enable-modules=ssl --with-ssl=/usr/local/openssl

     그대로 복사시 에러나 날수도 있으니 둘중 적합한거 사용

]# make

]# make install

 


]# /opt/APACHE/httpd2.4/bin/apachectl -V

설치후 버전확인

 

]# /opt/APACHE/httpd2.4/bin/apachectl -t

  • 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

아파치 가동전에 테스트 할시 위와 같이 에러 발생시

]# vi /opt/APACHE/httpd2.4/conf/httpd.conf

#ServerName www.example.com:80

---> ServerName www.example.com:80

주석을 풀고 아파치가 정상적으로 가동되는지 확인

 

  1. JDK(JAVA) 설치

]# tar xvfz jdk-7u80-linux-x64.tar.gz

]# mkdir -p /usr/java

]# mv jdk1.7.0_80 /usr/java/jdk1.7.0_80

]# vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.7.0_80

export LD_LIBRARY_PATH=$LD_LIBRAPY_PATH:/usr/local/lib

PATH="$PATH:/usr/java/jdk1.7.0_80/bin"

export PATH=$PATH

환경변수로 추가

]# source /etc/profile

]# java -version

 

  • 기존자바가 설치되어 있으면 먼저 삭제후 설치     

 

 

  1. Tomcat

wget http://mirror.navercorp.com/apache/tomcat/tomcat-7/v7.0.88/bin/apache-tomcat-7.0.88.tar.gz

 

]# tar xvfz apache-tomcat-7.0.88.tar.gz

]# mv apache-tomcat-7.0.88 /usr/local/tomcat

]# vi /usr/local/tomcat/conf/server.xml

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

주석 풀어준다 (7버전부터 주석이 없는게 기본값?)

 

]# /usr/local/tomcat/bin/version.sh

  1. ]# vi /etc/rc.d/init.d/tomcat

 

#!/bin/sh

#startup script for Tomcat

#

# chkconfig: 35 85 15

# description: apache tomcat 7.x

#

# processname: tomcat

#

# Source function library.

export JAVA_HOME=/usr/java/jdk1.7.0_80

export CATALINA_HOME=/usr/local/tomcat

 

#export JAVA_OPTS="-server -Xms512m -Xmx512m -XX:MaxPermSize=256m"

export PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

# See how we were called.

case "$1" in

  start)

  echo -n "Starting tomcat: "

  $CATALINA_HOME/bin/catalina.sh start

  echo

  ;;

  stop)

  echo -n "Shutting down tomcat: "

  $CATALINA_HOME/bin/catalina.sh stop

  echo

  ;;

  restart)

  $0 stop

  sleep 2

  $0 start

  ;;

  *)

  echo "Usage: $0 {start|stop|restart}"

  exit 1

esac

exit 0

service 등록하여 사용할때 이용되는 스크립트

]# chmod 755 /etc/rc.d/init.d/tomcat

 

 

  1. `tomcat-connectors

wget http://apache.tt.co.kr/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.43-src.tar.gz

 

]# tar xvfz tomcat-connectors-1.2.43-src.tar.gz

]# cd tomcat-connectors-1.2.43-src/native/

]# ./configure --with-apxs=/opt/APACHE/httpd2.4/bin/apxs

]# make

]# make install

]# ls -l /opt/APACHE/httpd2.4/modules/mod_jk.so    파일 확인

기본적으로 modules 복사가 되는데 혹시나 없으면 컴파일된것을 직접 modules 복사한다

]# cp -a tomcat-connectors-1.2.43-src/native/apache-2.0/mod_jk.so /opt/APACHE/httpd2.4/modules/

 

]# vi /opt/APACHE/httpd2.4/conf/workers.properties    파일생성

worker.list=worker

worker.worker1.type=ajp13

worker.worker1.host=localhost

worker.worker1.port=8009

내용 추가

 

]# vi /opt/APACHE/httpd2.4/conf/tomcat.conf    파일 생성

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel info

JkMount /* worker

내용 추가

 

]# vi /opt/APACHE/httpd2.4/conf/httpd.conf

Include conf/tomcat.conf

마지막줄에 추가

 

  1. MySQL 5.7, mysql-connector

wget https://dev.mysql.com/get/mysql80-community-release-el6-1.noarch.rpm

 

]# rpm -ivh mysql80-community-release-el6-1.noarch.rpm

]# yum-config-manager --disable mysql80-community

]# yum-config-manager --enable mysql57-community

]# yum install mysql-community-server

]# yum install mysql-connector-java

]# cp -arp /usr/share/java/mysql-connector-java-5.1.17.jar /usr/local/tomcat/lib/

 

  1. tomcat DBCP

]# vi /usr/local/tomcat/conf/context.xml

<Resource

    name="jdbc/mysql" -->JDBC name

    auth="Container"

    type="javax.sql.DataSource"

    driverClassName="com.mysql.jdbc.Driver"  -->mysql jdbc 드라이브명

    loginTimeout="10"

    maxWait="5000"

    username="testuser" --> DB 유저

    password="1234"     --> DB 패스워드

    testOnBorrow="true"

    url="jdbc:mysql://localhost:3306/test" />

</Context>

내용추가

 

  1. apache + tomcat startup

]# /opt/APACHE/httpd2.4/bin/apachectl start

]# /etc/init.d/tomcat start

  • apache, tocmat 스타트업

 

]# cat /usr/local/tomcat/logs/catalina.out

  • 로그를 확인하여 이상없이 톰캣이 올라온것을 확인 한다

 

]# netstat -atnp

  • netst -atnp으로 톰캣이 mysql 제대로 접속이 되었는지 확인한다
  • Java(tomcat) port 58884 -> mysqld(3306) 연결

 

  • 또는 간단한 소스를 이용하여 tomcat + db연동이 되었는지 확인한다

 

 


Posted by 샤키
Linux/Unix2017. 7. 14. 03:00

최근에 충격 좀 먹고(?) 포스팅 해본다

VPN (Virtual private network)

일반 공공망 (인터넷망)을 내부망(사설망) 처럼 회선 비용 절감 및 보안 등등 목적으로 사용하는 사설망


간단히 설명 요즘은 개인 NAS가 많이 사용된다

외부 및 사무실에서도 집에서 NAS를 옆에둔 서버처럼 연결 및 사용 하는 방식 (이게 맞나...?)


그나마 제일 많이 사용하는 OpenVPN 설치


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#설치 환경 CentOS 7 기준(2017/07)
 
#설치폴더 생성
mkdir -/root/vpn_install
cd /root/vpn_install
 
#centos EPEL 레포지토리
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm
rpm -Uvh epel-release-7-10.noarch.rpm
 
#openvpn 설치
yum install openvpn -y
#키 관리를 해주는 easy-rsy 
yum install easy-rsa -y
 
easy-rsa 파일을 easy-rsa 복사
mkdir /etc/openvpn/easy-rsa
cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
#vars 파일 수정
# vi /etc/openvpn/easy-rsa/vars
 
#아래 정도만 수정 "꼭 이대로 안해도 된다"
export KEY_COUNTRY="KR"
export KEY_PROVINCE="NA"
export KEY_CITY="Seoul"
export KEY_ORG="example.com"
export KEY_EMAIL="admin@example.com"
export KEY_OU="server"
 
# X509 Subject Field
export KEY_NAME="server"
cs


1
2
3
4
5
6
7
8
#var를 편집하고, key를 빌드 key 폴더가 생성 
cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
 
cd /etc/openvpn/easy-rsa
chmod +rwx *
source ./vars
./clean-all
./build-ca
cs



1
2
#서버키를 기존 빌드와 다르게 엔터 말고 마지막부분에 y으로 커밋해주서야 
./build-key-server server
cs


1
2
pem 파일 생성
./build-dh
cs

빌드 시간이 어느정도 걸린다.


1
2
3
4
5
6
7
cd /etc/openvpn/easy-rsa/keys
 
#생성된 서버키를 상단으로 복사해준다
cp dh2048.pem ca.crt server.crt server.key /etc/openvpn/
 
#클라이언트에서 사용할 키 
./build-key client
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#샘플설정파일 복사 - 디렉토리 버전은 다를수 있음
cp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf /etc/openvpn/
 
 
#OpenVPN 서버 설정파일 수정
vi /etc/openvpn/server.conf
 
#아래 내용만 주석제거 및 수정
push "redirect-gateway def1 bypass-dhcp"
#본인이 선호(?)하는 DNS로 수정
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client
 
comp-lzo
user nobody
group nobody
 
status openvpn-status.log
log /var/log/openvpn.log
cs

테스트겸 설치 해보는거라 서버상의 방화벽은 전부 내리고 테스트를 해봄

1
2
3
4
5
#테스트 하기 위해 vpn서버 가동
openvpn --config /etc/openvpn/server.conf
 
#에러확인하기위해 로그파일 확인
tail -/var/log/openvpn.log
cs

로그파일

udp 1194 포트가 열려있는거 확인


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#OpenVpn 클라이언트에서 사용할 프로파일 수정 client.ovpn
client
dev tun0
proto udp
remote [본인 접속할 vpn] 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca ca.crt
cert client.crt
key client.key
cs


외부에서 접속테스트 

사설망(내부망)이 아닌 외부테스트로 LTE 환경에서 테스트 진행

"OpenVPN Connect" 안드로이드에서 테스트


Import로 들어가서


Import Profile from SD card 선택


미리 복사해둔 클라이언트키 및 프로파일

"client.ovpn"파일 선택


프로파일 적용후 Connect를 클릭


접속이 잘되는것을 확인


vpn접속후 사설망형태로 접속을 해본다


vpn서버에서 "10.8.0.6"으로 접속한 폰(?) 디바이스를 확인 할 수 있다



일단 간단하게 OpenVpn 서버 구축 여기까지

나중에 좀 더 보충하기


Posted by 샤키
Linux/Unix2015. 3. 27. 12:03



무료 콘솔클라이언트 툴중 최강자인 putty에서 zmodem 사용하는 방법을 알아보겠다


먼저 zmodem은 데이터 전송 프로토콜이다 (자세한건 텀즈에서 확인)


서버에 파일을 업로드 및 다운로드 할때 scp, filezilla를 사용하면 되겠지만 


작고 간단한 파일을 전송 하는데 다른 툴을 쓰는건 불편하다


일단 일반 putty는 zmodem을 지원 하지 않는다 


그래서 여기서는 zmodem을 지원하는 putty의 변조인 LePutty를 이용해보겠다


http://leputty.sourceforge.net/

위 주소에서 LePutty 다운로드 한다



위주소에서 LePutty를 받으면 실행 파일과 친절하게 윈도우용 zmodem(?)이 포함 되어 있다

win32-lrzsz-0.12.20-bin.zip 파일도 압축을 풀어준다


먼저 putty를 실행 하여 Connection - ZModem으로 가서 rz, sz 경로를 지정해준다

다운로드 경로도 함께 지정해준다



서버에도 rz,sz 를 설치 해준다 

CentOS 기준

~]# yum -y install lrzsz



자 설치가 완료 되었으면 바로 사용해보자!

rz는 로컬파일을 서버로 업로드 할때 명령어다


~]#rz


콘솔창에 위에 같이 rz 명령어를 치면

waiting to receive B~~~~~ 나온다


그상태에서 putty 상단줄에 마우스 오른쪽을 눌러서 Zmodem Upload 메뉴를 선택한다

그리고 업로드 할 파일을 지정해준다


지정을 해주었으면 파일이 전송되는 모습을 볼수 있다


위와 같이 서버에 업로드 된것을 확인 할수 있다

(한글 파일도 잘되는군...)


이제 반대로 다운로드를 해보자


~]# sz [다운로드 파일]


sz 명령어 뒤에 다운로드 한파일 지정하고 명령어를 실행한다

업로드 마찬가지로 B000~~~ 어쩌구 나온다

그후 putty 상단줄에서 Zmodem Receive를 선택한다



위와 같이 텍스트파일을 다운로드 되는것을 확인 할수 있다


로컬에서도 파일이 다운된것을 확인 할수 있다


끝!







SecureCRT, Xshell은 zmodem을 편하게 사용할수 있는데... (업로드 할때 드래그로 간단히...)


뭐 유료라... SecureCRT가 가격만 괜찮으면 구매 해서 쓸텐데... ㅜㅜ



Posted by 샤키
Linux/Unix2014. 11. 7. 15:00

   

   

ctrl + v 를 눌러 주석지정할 지정한다

   

shift + i 누른후 # 삽입한다

   

esc를 누르면 블럭지정된것에 #이 들어가면서 전체 주석이 된다

Posted by 샤키
Linux/Unix2014. 10. 28. 12:05

CentOS 5.8기준으로 작성 되었고

5.x버전은 크게 차이가 없을것이다

 

vncservers 파일을 주석을 풀어준다

VNCSERVERS="숫자:사용할계정"

VNCSERVERARGS[숫자]="-geometry 해상도"

내경우는 숫자는 0빼고 다 잘되는거 같았다

 

 

 

패스워드 설정을 하면 위경로에 파일이 생긴다


 

vnc서버를 한번 실행 하면

root 밑에 Xauthority 파일이 생성된다

 

xterm, twm 을 주석 처리 하고

gone-session &

한줄을 추가 해준다

 

vnc 서버를 재실행 해준다

 


vnc viewer로 접속을 해본다

(가장 위쪽 vncserver설정에 화면 번호를 1번으로 해서 접속을 한다)




접속이 잘~~ 된다

Posted by 샤키
Linux/Unix2010. 3. 4. 01:57

Rsync로 동기화를 할때 ssh를 이용하기 때문에

crontab을 등록하여 이용하게 되면 자동으로 되는 작업에 암호가 필요 하게 된다

이러한 인증을 없이 하기 위해 ssh-keygen를 이용하면 된다

   

   

위와 같이 가상서버에서 확인해보자

   

ip 150서버에서 102서로 ssh를 이용하여 접속을 해보면 패스워드를 물어 보는것을 알 수 있다

   

150 root 밑에 .ssh를 가보면 known_hosts만 보인다

   

이와 같이 ssh-keygen으로 rsa타입으로 공개키를 생성해준다

   



id_rsa, id_rsa.pub 파일이 생성 된다

   

접속할 대상서버에는 id_rsa.pub을 authorized_keys로 파일을 하나 복사하고

   

id_rsa.pub 안에 공개키 (내서버)

   

authorized_key에 위에 공개키를 복사한다 (접속할서버)

   

내서버 위에서 만든 공개키를 접속할서버 authorized_keys에 넣어준다

   

내서버에서 접속할 서버를 접속해보면 암호없이 접속 되는것을 볼수 있다

 

Posted by 샤키
Linux/Unix2010. 1. 14. 10:03

netstat의 State 필드에 표시되는 TCP 상태표시가 갖는 의미를 알아봅시다.
RFC 793 문서에 있는 TCP 기본 연결, 종료 과정을 보면 이해가 더 빠를 거라 생각한다.
  
-----------------------------------------------------------
# netstat -atn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address          Foreign Address       State
... 생략 ...
tcp        0      0 0.0.0.0:25             0.0.0.0:*             LISTEN      <-- 포트가 열렸음
tcp        0      0 192.168.123.10:32799   207.46.106.141:1863   ESTABLISHED <-- 서로 연결중
tcp        0      0 192.168.123.10:32794   218.xxx.xx.xx:22      ESTABLISHED
tcp        0      0 192.168.123.10:32802   207.46.108.46:1863    CLOSE_WAIT  <-- 종료 대기중
tcp        0      0 192.168.123.10:33244   211.xxx.xx.x:80       ESTABLISHED
... 생략 ...
-----------------------------------------------------------
  
1) TCP 연결관련 상태
  
* RFC 793문서에 나온 기본적인 TCP 연결 과정

      TCP A                                                      TCP B

  1.  CLOSED                                                     LISTEN
  2.  SYN-SENT    --> < SEQ=100>< CTL=SYN>                   --> SYN-RECEIVED
  3.  ESTABLISHED <-- < SEQ=300>< ACK=101>< CTL=SYN,ACK>     <-- SYN-RECEIVED
  4.  ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>         --> ESTABLISHED
  5.  ESTABLISHED --> < SEQ=101>< ACK=301>< CTL=ACK>< DATA>  --> ESTABLISHED

LISTEN      : 데몬이 요청을 발을 수 있도록 연결 요구를 기다리는 상태
  즉, 포트가 열려있음을 의미. http(80), mail(25), ftp(21), telnet(23) 등
  위에서 포트 25(mail)이 메일을 받을 수 있도록 열려 있는 상태
  윈도우즈에서는 LISTENING으로 표시
SYN_SENT    : 로컬에서 원격으로 연결 요청(SYN 신호를 보냄)을 시도한 상태
SYN_RECV    : 원격으로 부터 연결 요청을 받은 상태
  요청을 받아 SYN+ACK 신호로 응답은 한 상태이지만 ACK는 받지 못했다.
  netstat로 확인할 때 SYN_RECV가 상당히 많다면 TCP SYN 플러딩(Flooding) 공격일
  가능성이 있다.
  윈도우즈와 솔라리스에서는 SYN_RECEIVED으로, FreeBSD는 SYN_RCVD으로 표시
ESTABLISHED : 서로 연결이 되어 있는 상태
  위에서 192.168.123.10의 포트 32794과 218.xxx.xx.xx의 포트 22(ssh)이 서로
  연결되어 있는 상태

2) TCP 종료관련 상태

* 정상적인 연결 종료 과정

      TCP A                                                   TCP B

  1.  ESTABLISHED                                             ESTABLISHED
  2.  (Close)
      FIN-WAIT-1  --> < SEQ=100>< ACK=300>< CTL=FIN,ACK>  --> CLOSE-WAIT
  3.  FIN-WAIT-2  <-- < SEQ=300>< ACK=101>< CTL=ACK>      <-- CLOSE-WAIT
  4.                                                         (Close)
      TIME-WAIT   <-- < SEQ=300>< ACK=101>< CTL=FIN,ACK>  <-- LAST-ACK
  5.  TIME-WAIT   --> < SEQ=101>< ACK=301>< CTL=ACK>      --> CLOSED
  6.  (2 MSL)
      CLOSED                                                      

FIN_WAIT1   : 소켓이 닫히고 연결이 종료되고 있는 상태. 원격의 응답은 받을 수 있다.
  솔라리스에서는 FIN_WAIT_1로 표시
FIN_WAIT2   : 로컬이 원격으로 부터 연결 종료 요구를 기다리는 상태
  솔라리스에서는 FIN_WAIT_2로 표시
CLOSE_WAIT  : 원격의 연결 요청을 받고 연결이 종료되기를 기다리는 상태
  원격으로 부터 FIN+ACK 신호를 받고 ACK 신호를 원격에 보냈다.
TIME_WAIT   : 연결은 종료되었으나 원격의 수신 보장을 위해 기다리고 있는 상태
  이 상태를 특히 자주 보게되는 Apache에서 KeepAlive를 OFF로 해둔 경우,
  Tomcat 서버를 쓰는 경우 등
LAST_ACK    : 연결은 종료되었고 승인을 기다리는 상태
CLOSED      : 완전히 연결이 종료된 상태

※ 위의 FIN_WAIT1, FIN_WAIT2, CLOSE_WAIT 3개 상태는 연결 종료를 위해 서로간에
   신호를 주고받는 과정에 나타나는 상태로 이해하면 된다.
   종료 요청을 한 곳에서는 FIN_WAIT1, FIN_WAIT2, TIME_WAIT 상태가
   종료 요청을 받는 곳에서는 CLOSE_WAIT, LAST_ACK 상태가 표시된다.

3) 기타

CLOSING     : 연결은 종료되었으나 전송도중 데이타가 분실된 상태
UNKNOWN     : 소켓의 상태를 알 수 없음

솔라리스의 netstat 명령에서는 다음 2개의 상태를 더 표시한다.

IDLE        : 소켓이 열렸지만 binding 되지 않은 상태
BOUND       : listen이나 연결을 위한 준비 상태


출처 : http://coffeenix.net/
Posted by 샤키
Linux/Unix2010. 1. 11. 18:01
목차
1. 가장 일반적인 find 명령어

2. find 명령어 일반적인 옵션
  2-1. 사용법 개요
  2-2. 일반적으로 표현식 옵션 구분
  3-3. 자주 사용되는 표현식 옵션
  3-4. path(find 명령어 다음의 path)
  3-5. 표현식-연산자

3. 예제
  3-1. 다른 명령어와 결합형태(ls,xargs)
  3-2. 퍼미션 관련 예제
  3-3. 유저와 관련된 예제
  3-4. 팁
  - 최근 하루(1) 동안(-)에 변경(change)된 파일을 찾을려면(-ctime)?
  - 오래된 파일을 찾을려면(30일 이상 수정(modify))되지 않은)?
  - 최근 30일(30) 안에(-) 접근(access)하지 않은 파일과 디렉토리를 리스트로 만들려면(-atime)?
  - 자신의 홈디렉토리에서 만 검색하려면?
  - 서브 디렉토리로 내려가지 않고 현재 디렉토리에서만 검색하려면?
  - 특정 유저(foobar) 소유의 파일을 찾을려면?
  - 퍼미션이 777인 파일을 찾을려면 ?
  - others에게 쓰기 권한이 있는 파일을 찾을려면?
  - others에게 쓰기 권한이 있는 파일을 찾아 쓰기 권한을 없애려면?
  - 유저이름과 그룹이름이 없는 파일을 찾을려면?
  - 빈 파일을 찾을려면?
  - 파일크기가 100M 이상된 파일을 찾을려면?
  - *.bak 파일을 찾아 지울려면?
  - *.bak 파일을 찾아 특정 디렉토리로 옮길려면?
  - 디렉토리 만 찾을려면?
  - root권한으로 실행되는 파일을 찾을려면?
  - 다른 파일시스템을 검색하지 않을려면?
  - 파일이름에 공백이 들어간 파일을 찾을려면?
  - 숨겨진(hidden) 파일을 찾을려면?
  - 같은 이름을 가진 디렉토리를 찾을려면?
  - 잘못된 링크를 찾을려면?

4. find 명령어에 대해서 좀더 알아보려면?

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

1. 가장 일반적인 find 명령어

	# find /path -name "foobar" -print

제일 먼저(?) 배우는 형식이 아닌가 쉽군요.


2. find 명령어 일반적인 옵션

2-1. 사용법 개요

find 명령어 사용법 보기 :

# find --help
# man find (직접 입력해 보세요. 내용이 너무 많아서..)

사용법 : find [path...] [expression]
기본값 : default path는 현재 디렉토리;  default expression은 -print

표현식(expression) 구성 :
operators (decreasing precedence; -and is implicit where no others are given):
      ( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
      EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
options (always true): -daystart -depth -follow --help
      -maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev
tests (N can be +N or -N or N):
      -amin N -anewer FILE -atime N -cmin N
      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
      -ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
      -nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
      -size N[bckw] -true -type [bcdpfls] -uid N -used N -user NAME
      -xtype [bcdpfls]
actions:
      -exec COMMAND ; -fprint FILE -fprint0 FILE -fprintf FILE FORMAT
      -ok COMMAND ; -print -print0 -printf FORMAT -prune -ls

간단하게 몇가지만 알아보죠...
(자세한 사용설명은 꼭 man 페이지를 읽어보세요....한글은 없군요..T.T)


2-2. 일반적으로 표현식 옵션 구분

  -a'xxxx'
		'xxxx'에 대한 Access(접근)
  -c'xxxx'
		'xxxx'에 대한 Changes(변경), 마지막으로 Access한 경우 변경됨
  -m'xxxx'
		'xxxx'에 대한 Modify(수정), 파일내용 자체 수정한 경우
  -i'xxxx'
		'xxxx'(inum 제외)에 대한 Insensitive(대소문자 구분없이)

3-3. 자주 사용되는 표현식 옵션

  N
		정확하게 N과 일치
  +N
		N 보다 큰 경우
  -N
		N 보다 작은 경우
  -name PATTERN
		PATTERN에 일치하는 파일 찾기, 와일드카드 문자 사용가능
  -iname PATTERN
		PATTERN에 일치하지 않은(insensitive) 파일 찾기
  -perm [+-]mode
		PERMission('mode')에 해당되는 파일 찾기, ls와 결합 가능
  -type [bcdpfls]
		b(블럭파일), c(특정 문자), d(디렉토리), p(파이프),
		f(정규표현 일반파일), l(링크), s(소켓) 유형의 파일 찾기
  -size N[bckw]
		파일 크기가 N 인 파일 찾기
		b(블럭-기본값), c(bytes), k(kbytes),
		w(2바이트 단어)
  -user NAME
		NAME은 유저이름이거나 UID
  -atime N
		N*24 시간 동안에 Access 한 파일
  -ctime N
		N*24 시간 동안에 Changes 한 파일(내용수정이 아니고 읽기모드도 Changes됨)
  -mtime N
		N*24 시간 동안에 Modify 한 파일
  -empty
		파일이 비어 있고(0 bytes), 정규식 파일이거나 디렉토리
  -newer FILE
		FILE 보다 최근에 갱신된 파일
  -path PATTERN
		path가 PATTERN과 일치하는 path에 대해서 검색
  -regex PATTERN
		파일이름이 PATTERN에 일치하는 정규식에 대해서 검색
  -inum N
		inode N을 갖는 파일
  -nouser,-nogroup
		USER나 GROUP에 이름이 없는 파일 검색(UID,GID만 있는 파일)
  -exec COMMAND
		검색된 파일을 찾으면 COMMAND 명령을 실행한다.
		COMMAND 인자(검색된 파일)는 {}으로 사용하며,
		이때 COMMAND 끝은 \;(;이 아님)을 사용해야 한다. 즉 명령구분
		문자인 ';'을 탈출(\)시켜줘야 한다.
  -ok COMMAND
		-exec COMMAND와 같지만 COMMAND를 실행하기 전에 확인을 요청한다.

3-4. path(find 명령어 다음의 path)
  .
		현재 디렉토리(기본값이므로 생략해도 됨)
  `pwd`
		현재 디렉토리와 결합(?) `은 ~문자가 있는 자판
  $(pwd)
		위의 `pwd`와 같거나 비슷함
  /
		최상위 루트 디렉토리에서 하위 모든 디렉토리
  /home
		특정 /home 디렉토리에서 하위 모든 디렉토리
  /{usr,home/{aaa,san2},var}
		/usr, /usr/home/aaa /usr/home/san2 /var

3-5. 표현식-연산자

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


3. 예제

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

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

  형태1. -exec 이용시

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

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

		# find ..... | xargs COMMAND

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

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

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

즉, find 결과에 대해서,

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

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

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

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

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

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

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

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

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

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

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

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


3-2. 퍼미션 관련 예제

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

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

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

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

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

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

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

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

	-perm -20 -o -perm -2

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

	-perm -22

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

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

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

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

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

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

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

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


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

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

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

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

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

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


3-4. 유용한 팁

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

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

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

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

	# find / -mtime +30 -print | more

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

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

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

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

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

	# find . -prune ...

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

	# find / -user foobar -print | more

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

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

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

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

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

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

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

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

  - 빈 파일을 찾을려면?

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

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

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

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

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

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

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

  - 디렉토리 만 찾을려면?

	# find . -type d ...

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

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

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

	# find / -xdev ...

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

	# find / -name "* *" -print

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

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

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

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

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

	# find . -type l -print | perl -nle '-e || print' | xargs ls -l
	*주)'O'Reilly Unix Power Tools' 참고


4. find 명령어에 대해서 좀더 알아보려면?

# man find

DESCRIPTION
       This  manual page documents the GNU version of find.  find
       searches the directory tree rooted at each given file name
       by  evaluating  the  given  expression from left to right,
       according to the rules of precedence (see  section  OPERA
       TORS),  until  the outcome is known (the left hand side is
       false for and operations, true for  or),	 at  which  point
       find moves on to the next file name.

       The first argument that begins with `-', `(', `)', `,', or
       `!' is taken to be the beginning of  the	 expression;  any
       arguments before it are paths to search, and any arguments
       after it are the rest of the expression.	 If no paths  are
       given, the current directory is used.  If no expression is
       given, the expression `-print' is used.

       find exits with status 0 if all files are  processed  suc
       cessfully, greater than 0 if errors occur.

EXPRESSIONS
       The expression is made up of options (which affect overall
       operation rather than the processing of a  specific  file,
       and  always  return  true),  tests (which return a true or
       false value), and actions (which	 have  side  effects  and
       return a true or false value), all separated by operators.
       -and is assumed where the operator  is  omitted.	  If  the
       expression  contains  no actions other than -prune, -print
       is performed on all files  for  which  the  expression  is
       true.

1) path(생략-앞부분에서 설명)

2) 표현식-연산자(생략-앞부분에서 설명)

3) 표현식-옵션 :
   options (always true):
       -daystart -depth -follow --help
       -maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev

       All  options always return true.	 They always take effect,
       rather than being processed only when their place  in  the
       expression is reached.  Therefore, for clarity, it is best
       to place them at the beginning of the expression.

       -daystart
	      Measure times (for -amin,	 -atime,  -cmin,  -ctime,
	      -mmin,  and  -mtime)  from  the  beginning of today
	      rather than from 24 hours ago.

       -depth Process each directory's contents before the direc
	      tory itself.

       -follow
	      Dereference symbolic links.  Implies -noleaf.

       -help, --help
	      Print  a	summary of the command-line usage of find
	      and exit.

       -maxdepth levels
	      Descend at most  levels  (a  non-negative	 integer)
	      levels  of directories below the command line argu
	      ments.  `-maxdepth 0' means only	apply  the  tests
	      and actions to the command line arguments.

       -mindepth levels
	      Do  not  apply  any tests or actions at levels less
	      than levels (a non-negative  integer).   `-mindepth
	      1'  means process all files except the command line
	      arguments.

       -mount Don't descend directories on other filesystems.  An
	      alternate	 name  for  -xdev, for compatibility with
	      some other versions of find.

       -noleaf
	      Do not optimize by assuming that	directories  con
	      tain  2  fewer  subdirectories than their hard link
	      count.   This  option  is	 needed	 when	searching
	      filesystems  that do not follow the Unix directory-
	      link convention, such as CD-ROM or MS-DOS	 filesys
	      tems or AFS volume mount points.	Each directory on
	      a normal Unix filesystem has at least 2 hard links:
	      its  name	 and  its  `.'	entry.	Additionally, its
	      subdirectories (if any) each  have  a  `..'   entry
	      linked to that directory.	 When find is examining a
	      directory, after it has statted 2 fewer subdirecto
	      ries than the directory's link count, it knows that
	      the rest of the entries in the directory	are  non-
	      directories  (`leaf'  files in the directory tree).
	      If only the files' names need to be examined, there
	      is  no  need to stat them; this gives a significant
	      increase in search speed.

       -version, --version
	      Print the find version number and exit.

       -xdev  Don't descend directories on other filesystems.

4) 표현식-tests
   tests (N can be +N or -N or N):
       -amin N -anewer FILE -atime N -cmin N
       -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
       -ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
       -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
       -nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
       -size N[bckw] -true -type [bcdpfls] -uid N -used N -user NAME
       -xtype [bcdpfls]

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.

       -amin n
	      File was last accessed n minutes ago.

       -anewer file
	      File was last accessed more recently than file  was
	      modified.	  -anewer  is affected by -follow only if
	      -follow comes before -anewer on the command line.

       -atime n
	      File was last accessed n*24 hours ago.

       -cmin n
	      File's status was last changed n minutes ago.

       -cnewer file
	      File's status was last changed more  recently  than
	      file  was modified.  -cnewer is affected by -follow
	      only if -follow comes before -cnewer on the command
	      line.

       -ctime n
	      File's status was last changed n*24 hours ago.

       -empty File  is	empty  and  is either a regular file or a
	      directory.

       -false Always false.

       -fstype type
	      File is on a filesystem of type  type.   The  valid
	      filesystem  types	 vary among different versions of
	      Unix; an incomplete list of filesystem  types  that
	      are accepted on some version of Unix or another is:
	      ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K.	 You  can
	      use  -printf with the %F directive to see the types
	      of your filesystems.

       -gid n File's numeric group ID is n.

       -group gname
	      File belongs  to	group  gname  (numeric	group  ID
	      allowed).

       -ilname pattern
	      Like -lname, but the match is case insensitive.

       -iname pattern
	      Like -name, but the match is case insensitive.  For
	      example, the patterns `fo*'  and	`F??'  match  the
	      file names `Foo', `FOO', `foo', `fOo', etc.

       -inum n
	      File has inode number n.


       -perm mode
	      File's  permission  bits are exactly mode (octal or
	      symbolic).  Symbolic modes use mode 0 as a point of
	      departure.

       -perm -mode
	      All  of  the  permission	bits mode are set for the
	      file.

       -perm +mode
	      Any of the permission bits mode  are  set	 for  the
	      file.

       -regex pattern
	      File name matches regular expression pattern.  This
	      is a match on the whole path, not	 a  search.   For
	      example,	to match a file named `./fubar3', you can
	      use the regular expression  `.*bar.'  or	`.*b.*3',
	      but not `b.*r3'.

       -size n[bckw]
	      File uses n units of space.  The units are 512-byte
	      blocks by default or if `b' follows n, bytes if `c'
	      follows  n,  kilobytes  if `k' follows n, or 2-byte
	      words if `w' follows n.  The size	 does  not  count
	      indirect blocks, but it does count blocks in sparse
	      files that are not actually allocated.

       -true  Always true.

       -type c
	      File is of type c:

	      b	     block (buffered) special
	      c	     character (unbuffered) special
	      d	     directory
	      p	     named pipe (FIFO)
	      f	     regular file
	      l	     symbolic link
	      s	     socket

       -uid n File's numeric user ID is n.

       -used n
	      File was last accessed n days after its status  was
	      last changed.
       -user uname
	      File  is	owned  by  user	 uname	(numeric  user ID
	      allowed).

       -xtype c
	      The same as -type unless the  file  is  a	 symbolic
	      link.   For symbolic links: if -follow has not been
	      given, true if the file is a link to a file of type
	      c; if -follow has been given, true if c is `l'.  In
	      other words, for symbolic links, -xtype checks  the
	      type of the file that -type does not check.

5) 표현식-Actions
   actions:
       -exec COMMAND ; -fprint FILE -fprint0 FILE -fprintf FILE FORMAT
       -ok COMMAND ; -print -print0 -printf FORMAT -prune -ls

       -exec command ;
	      Execute command; true if 0 status is returned.  All
	      following arguments to find are taken to	be  argu
	      ments  to	 the command until an argument consisting
	      of `;' is encountered.  The string `{}' is replaced
	      by the current file name being processed everywhere
	      it occurs in the arguments to the command, not just
	      in arguments where it is alone, as in some versions
	      of find.	Both of these constructions might need to
	      be  escaped  (with a `\') or quoted to protect them
	      from expansion by the shell.  The command	 is  exe
	      cuted in the starting directory.

       -fls file
	      True; like -ls but write to file like -fprint.

       -fprint file
	      True;  print the full file name into file file.  If
	      file does not exist when find is run,  it	 is  cre
	      ated;  if it does exist, it is truncated.	 The file
	      names ``/dev/stdout'' and ``/dev/stderr'' are  han
	      dled  specially;	they refer to the standard output
	      and standard error output, respectively.

       -fprint0 file
	      True; like -print0 but write to file like	 -fprint.

       -fprintf file format
	      True;  like -printf but write to file like -fprint.

       -ok command ;
	      Like -exec but ask the user first (on the	 standard
	      input);  if the response does not start with `y' or
	      `Y', do not run the command, and return false.

       -print True; print the full file name on the standard out
	      put, followed by a newline.

       -print0
	      True; print the full file name on the standard out
	      put, followed by a  null	character.   This  allows
	      file  names  that	 contain newlines to be correctly
	      interpreted by programs that process the find  out
	      put.

       -printf format
	      True;  print  format on the standard output, inter
	      preting `\'  escapes  and	 `%'  directives.   Field
	      widths  and precisions can be specified as with the
	      `printf' C function.  Unlike -print,  -printf  does
	      not  add	a  newline at the end of the string.  The
	      escapes and directives are:

	      \a     Alarm bell.
	      \b     Backspace.
	      \c     Stop printing from this  format  immediately
		     and flush the output.
	      \f     Form feed.
	      \n     Newline.
	      \r     Carriage return.
	      \t     Horizontal tab.
	      \v     Vertical tab.
	      \\     A literal backslash (`\').

	      A	 `\' character followed by any other character is
	      treated as an ordinary character, so they both  are
	      printed.

	      %%     A literal percent sign.

	      %a     File's   last  access  time  in  the  format
		     returned by the C `ctime' function.

	      %Ak    File's last access time in the format speci
		     fied  by  k, which is either `@' or a direc
		     tive for the  C  `strftime'  function.   The
		     possible values for k are listed below; some
		     of them might not be available on	all  sys
		     tems,   due  to  differences  in  `strftime'
		     between systems.

		      @	     seconds since Jan.	 1,  1970,  00:00
			     GMT.

		     Time fields:

		      H	     hour (00..23)
		      I	     hour (01..12)
		      k	     hour ( 0..23)
		      l	     hour ( 1..12)
		      M	     minute (00..59)
		      p	     locale's AM or PM
		      r	     time, 12-hour (hh:mm:ss [AP]M)
		      S	     second (00..61)
		      T	     time, 24-hour (hh:mm:ss)
		      X	     locale's time representation (H:M:S)
		      Z	     time zone (e.g., EDT), or nothing if
			     no time zone is determinable

		     Date fields:

		      a	     locale's  abbreviated  weekday  name
			     (Sun..Sat)
		      A	     locale's full weekday name, variable
			     length (Sunday..Saturday)
		      b	     locale's	abbreviated   month  name
			     (Jan..Dec)
		      B	     locale's full month  name,	 variable
			     length (January..December)
		      c	     locale's  date  and time (Sat Nov 04
			     12:02:33 EST 1989)
		      d	     day of month (01..31)
		      D	     date (mm/dd/yy)
		      h	     same as b
		      j	     day of year (001..366)
		      m	     month (01..12)
		      U	     week number of year with  Sunday  as
			     first day of week (00..53)
		      w	     day of week (0..6)
		      W	     week  number  of year with Monday as
			     first day of week (00..53)
		      x	     locale's	  date	   representation
			     (mm/dd/yy)
		      y	     last two digits of year (00..99)
		      Y	     year (1970...)

	      %b     File's size in 512-byte blocks (rounded up).

	      %c     File's last status change time in the format
		     returned by the C `ctime' function.

	      %Ck    File's last status change time in the format
		     specified by k, which is the same as for %A.

	      %d     File's  depth in the directory tree; 0 means
		     the file is a command line argument.

	      %f     File's name  with	any  leading  directories
		     removed (only the last element).

	      %F     Type  of the filesystem the file is on; this
		     value can be used for -fstype.

	      %g     File's group name, or numeric  group  ID  if
		     the group has no name.

	      %G     File's numeric group ID.

	      %h     Leading  directories of file's name (all but
		     the last element).

	      %H     Command line argument under which	file  was
		     found.

	      %i     File's inode number (in decimal).

	      %k     File's size in 1K blocks (rounded up).

	      %l     Object  of	 symbolic  link	 (empty string if
		     file is not a symbolic link).

	      %m     File's permission bits (in octal).

	      %n     Number of hard links to file.

	      %p     File's name.

	      %P     File's name with the  name	 of  the  command
		     line  argument  under  which  it  was  found
		     removed.

	      %s     File's size in bytes.

	      %t     File's last modification time in the  format
		     returned by the C `ctime' function.

	      %Tk    File's  last modification time in the format
		     specified by k, which is the same as for %A.

	      %u     File's  user name, or numeric user ID if the
		     user has no name.

	      %U     File's numeric user ID.

	      A `%' character followed by any other character  is
	      discarded (but the other character is printed).

       -prune If  -depth  is  not given, true; do not descend the
	      current directory.
	      If -depth is given, false; no effect.

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

파일속 mms: 찾기찾기
find . -type f -name "webfile.html" -exec grep "mms://vod.xxxx.co.kr" {} /dev/null \;

파일 속 IP을 도메인으로 바꾸기
find . -type f -name "webfile.html" -exec perl -pi -e 's/211.xx.xx.39/vod.xxxx.co.kr/g' {} \;

특정 파일 속 IP 도메인으로 바꾸기
find . -type f -name "[0,1][0-9].html" -exec perl -pi -e 's/211.xx.xx.39/vod.xxxx.co.kr/g' {} \;

압축
for i in $(find . -name 'webfile.html'); do tar -rvf webfile.tgz $i; done

Posted by 샤키
Linux/Unix2009. 8. 11. 17:29

쉘 스크립트를 작성하려는 프로그래머를 위한 bash 프로그래밍 요약이다. 이 글의 목적은 프로그래밍을 가르치는 데에 있지 않다. 이미 하나의 프로그래밍 언어를 알고 있으면서 bash 스크립팅을 배우려고 하는 사람들을 위한 것이다.

프로그래밍의 기초

모든 bash 스크립트는 반드시 o/s에게 인터프리터로 무엇을 쓸 것이지 알려야 한다. 모든 스크립트의 첫번째 라인은 다음과 같아야 한다:
#!/bin/bash

다음 명령으로bash 스크립트를 실행 가능하게 만들어야 한다.
chmod +x filename

변수

변수를 만들어 값을 대입한다. 변수에는 데이터 타입이 없다(다른 언어에서처럼 변수의 타입을 정의하지 않고도 변수의 값으로 문자열, 숫자 등을 가진다).
varname=value

변수 값에 접근할 때는 변수 이름 앞에 $를 붙인다
echo $varname

명령 라인에서 인자로서 넘겨진 값은 $#를 통해 접근할 수 있다. 여기서 #는 넘겨진 값들의 배열 중 그 값의 인덱스이다. 이 배열은 1부터 시작한다.
command var1 var2 var3 .... varX
$1은 var1이 무엇이든지 그 값을 나타내며, $2는 var2의 값을 나타낸다. 나머지도 마찬가지이다.

내부에 정의된 변수들:

변수

용도

$1-$N

명령 라인으로부터 프로그램에 넘겨진 인자(변수) 저장한다.

$?

마지막 명령이 실행되었을 때의 탈출 값을 저장한다.

$0

입력된 명령의 첫번째 단어( 프로그램의 이름) 저장한다.

$*

명령 라인에서 입력된 모든 인자들(($1 $2 …) 저장한다.

"$@"

명령 라인에서 입력된 모든 인자들을 개별적으로 따옴표를 씌운 형태("$1" "$2" ...) 저장한다.

인용 부호

보통의 따옴표("like these")는 쉘이 공백 문자를 무시하도록 해서 넘겨진 하나의 인자 또는 사용할 문자열로 생각하게 한다. 하지만 따옴표 안의 특수 문자는 인식한다.

작은 따옴표('like this')는 어떤 문자열이 넘겨지든 간에 쉘이 모든 특수 문자를 무시해서 해석하도록 한다.

역 따옴표(`command`)는 다른 기능을 한다. 한 명령의 결과를 다른 명령에서 사용하고 싶을 때 역 따옴표를 사용한다. 예를 들어, 변수 contents 의 값을 현재 디렉토리 안에 있는 파일의 리스트와 같게 하고 싶다면 다음과 같은 명령을 입력하면 된다: contents=`ls`. ls 프로그램의 결과가 변수 contents에 들어 간다.

논리와 비교

루프에의 입장/탈출 조건을 체크하는 if-then 문장과 같은 조건 연산식의 계산에는 test라 불리는 명령이 사용된다.

test expression
또는
[ expression ]

>

수치 비교

int1 -eq int2

int1 int2 같다면 True 리턴한다.

int1 -ge int2

int1 int2보다 크거나 같으면 True 리턴한다.

int1 -gt int2

int1 int2보다 크면 True 리턴한다.

int1 -le int2

int1 int2보다 작거나 같으면 True 리턴한다.

int1 -lt int2

int1 int2보다 작으면 True 리턴한다.

int1 -ne int2

int1 int2 다르면 True 리턴한다.

 

문자열 비교

str1 = str2

str1 str2 일치하면 True 리턴한다.

str1 != str2

str1 str2 다르면 True 리턴한다.

str

str null 아니면 True 리턴한다.

-n str

str 길이가 0보다 크면 True 리턴한다.

-z str

str 길이가 0 같으면 True 리턴한다.(길이가 0 것은 null 다르다)

 

파일 비교

-d filename

파일 filename 디렉토리면 True 리턴한다.

-f filename

파일 filename 일반적인 파일이면 True 리턴한다.

-r filename

파일 filename 프로세스에 의해 읽혀진다면 True 리턴한다.

-s filename

파일 filename 길이가 0 아니면 True 리턴한다.

-w filename

파일 filename 프로세스에 의해 쓰여질 있다면 True 리턴한다.

-x filename

파일 filename 수행 가능하다면 True 리턴한다.

 

표현식 비교

!expression

expression true 아니면 true 리턴한다.

expr1 -a expr2

expr1 expr2 true이면 true 리턴한다. ( && , and )

expr1 -o expr2

expr1이나 expr2 적어도 하나가 true이면 true 리턴한다. ( ||, or )

 

논리(이어서)

If...then

if [ expression ]
        then
                commands
fi
 

If..then...else

if [ expression ]
        then
                commands
        else
                commands
fi
 

If..then...else If...else

 
if [ expression ]
        then
                commands
elif [ expression2 ]
        then
                commands
else
                commands
fi

Case select

case string1 in
        str1)
                commands;;
        str2)
                commands;;
        *)
                commands;;
esac
 

string1은str1, str2와 비교된다. 만일 이 중 하나가 string1과 일치한다면, 이중 세미콜론이 나올 때까지 commands가 실행된다. 만일 어느 것도 string1과 일치하지 않는다면, *에 해당하는 commands가 실행된다. 이것은 디폴트 경우로, *가 모든 문자열에 해당하기 때문이다.

반복(루프, loop)

 
for var1 in list
do
        commands
done

이것은 list 안의 각 항목에 대해 한번씩 실행된다. 이 list는 공백 문자로 구분된 여러 개의 단어를 담고 있는 변수(ls나 cat 명령의 출력과 같은)일 수 있다. 또는 문장에 직접 입력된 값들의 리스트일 수도 있다. 루프를 돌 때마다, 변수 var1에는 리스트의 항목 중 현재 항목이 대입되는데 마지막 항목에 이를 때까지 계속 반복된다.

 
while [ expression ]
do
        commands
done
 
until [ expression ]
do
        commands
done
 

함수

함수 만드는 법:

fname(){
        commands
}
 

함수를 부를 땐 다음의 문법을 사용한다: fname

인자를 받아들이는 함수 만들기:

fname2 (arg1,arg2...argN){
        commands
}

인자 있는 함수 부르는 법: fname2 arg1 arg2 ... argN

 


오늘은 계속 퍼오기만... 
출처: http://coffeenix.net/doc/shell/bash_cheat.htm
원문: http://www.linuxnewbie.org/nhf/intel/programming/bash_cheat.html
Posted by 샤키