CentOS APM 설치 후 홈페이지 소스를 FTP로 옮길려고 로그인을 하였는데.. 

디렉토리만 보이고 내용은 하나도 보이지 않는 현상이 나타나네요.


일단 vsftp 는 확인해 본바 이상이 없음.



SELinux 정책 확인


# vi /etc/sysconfig/selinux


# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

#SELINUX=enforcing

SELINUX=disabled

# SELINUXTYPE= can take one of these two values:

#     targeted - Targeted processes are protected,

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted



SELINUX=enforcing 을 아래 disabled 로 변경


그 후 가급적 서버 재부팅을 권함.


다시 FTP 로그인 후 접속 해보면 파일 내용이 나옵니다.



만약 이렇게 해도 안된다면 아래 글을 참조하세요.


# setsebool -P ftp_home_dir 1

// SELinux 정책에서 사용자의 home 디렉토리의 쓰기를 막아놓은것을 해제하는 명령어

 

# service vsftpd restart


# setsebool -P ftp_disable_trans 1

// SELinux 정책에서 FTP부분을 적용하지 않겠다는 명령어



[스크랩] JBoss 6.0 설치하기

Posted 2014. 6. 19. 13:30


출처 : http://blueray21.tistory.com/22




1. JBoss 다운로드 및 설치

1.1 다운로드

[root@centos ~]$ wget http://sourceforge.net/projects/jboss/files/JBoss/JBoss-6.0.0.Final/jboss-as-distribution-6.0.0.Final.zip/download

1.2 파일 이동 및 압축해제

[root@centos ~]$ mv jboss-as-distribution-6.0.0.Final.zip /usr/share/

1.3 압축 풀기

[root@centos ~]$ cd /usr/share/ 
[root@centos share]$ unzip -q jboss-as-distribution-6.0.0.Final.zip


2. 계정 생성 및 프로파일 수정

2.1 계정 새성

[root@centos share]$ groupadd jboss
[root@centos share]$ useradd -s /bin/bash -g jboss jboss
[
root@centos share]$ chown -Rf jboss.jboss /usr/share/jboss-as-distribution-6.0.0.Final/


2.2 프로파일 수정

  • JAVA_HOME
  • JBOSS_HOME

[root@centos share]$ vi /home/jboss/.bash_profil

1
2
3
4
5
6
JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
JBOSS_HOME=/usr/share/jboss-6.0.0.Final
export JBOSS_HOME

2.3 설치 경로 소유자 변경

[root@centos share]$ chgrp -R jboss /usr/share/jboss-6.0.0.Final
[root@centos share]$ chown -R jboss /usr/share/jboss-6.0.0.Final


3. 스크립트 생성

[root@centos share]$ su - jboss
[jboss@centos ~]$ mkdir bin
[jboss@centos ~]$ cd bin
[jboss@centos bin]$ 
vi jboss.sh

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
#!/bin/sh
RETVAL=0
USER=`whoami`
JBOSS_HOME=/usr/share/jboss-6.0.0.Final
SERVER_IP=127.0.0.1
start() {
 # Start daemons.
 echo $"start JBoss6 : "
 if [ "$USER" = "root" ]; then
  su - jboss -c "$JBOSS_HOME/bin/run.sh -b $SERVER_IP -c all &"
 else
  if [ "$USER" = "jboss" ]; then
                        $JBOSS_HOME/bin/run.sh -b $SERVER_IP  -c all
  else
   echo "************* please! run by jboss ***************"
  fi
 fi
}
stop() {
 # Stop daemons.
 echo $"stop JBoss6 : "
 if [ "$USER" = "root" ]; then
  su - jboss -c "$JBOSS_HOME/bin/shutdown.sh -o $SERVER_IP"
 else
  if [ "$USER" = "jboss" ]; then
   $JBOSS_HOME/bin/shutdown.sh -o $SERVER_IP
  else
   echo "************* please! run by jboss ***************"
  fi
 fi
}
case "$1" in
 start)
  start
  ;;
 stop)
  stop
  ;;
 restart|reload)
  stop
  sleep 5
  start
  RETVAL=$?
  ;;
 *)
  echo $"Usage: $0 {start|stop|restart}"
  exit 1
esac
exit $RETVAL

[jboss@centos bin]$ chmod +x jboss.sh 


4. JBoss 실행 및 종료

4.1 JBoss 실행

[jboss@centos bin]$ ./jboss.sh start &

4.2 JBoss 상태 조회

[jboss@centos bin]$ netstat -an | grep 8080
tcp        0      0 127.0.0.1:8080              0.0.0.0:*                   LISTEN      

4.3 JBoss 종료

[jboss@centos bin]$ ./jboss.sh stop &


5. JBoss Admin Console 접속

  • http://localhost:8080/

  • Administration Console 클릭

  • Username : admin
  • Password : admin


6. JBoss Admin 비밀번호 변경

[jboss@centos bin]$ cd /usr/share/jboss-6.0.0.Final/server/default/conf/props
[jboss@centos props]$ vi jmx-console-users.properties

1
2
# A sample users.properties file for use with the UsersRolesLoginModule
admin=admin




Linux에서 nfs mount 가 안될때

Posted 2013. 9. 12. 09:16


출처 : http://makebob.tistory.com/163



(1) nfs mount를 해도 마운트가 안되고..

# mount 192.168.129.1:/home/bobos26 pc
mount: RPC: Unable to receive; errno = Connection refusednfs warning:
mount version older than kernel

mount: nfsmount failed: Bad file descriptor
NFS: mount program didn't pass remote address!
mount: Mounting 192.168.129.1:/home/bobos26 on /dev/shm/tmp/pc failed:
Invalid argument

데탑에서 nfs를 restart를 하려고 해도 nfs데몬이 안죽고, 데몬 시작도 안될때!


[root@livefree ~]# /etc/rc.d/init.d/nfs restart
NFS mountd를 종료 중입니다: [ 확인 ]
NFS 데몬을 종료 중입니다: [실패]
NFS quota를 종료 중입니다: [ 확인 ]
NFS 서비스를 종료 중입니다: [ 확인 ]
NFS 서비스를 시작하고 있습니다: [ 확인 ]
NFS 쿼터를 시작하고 있습니다: 서비스를 등록할 수 없습니다: RPC: 받을 수 없음; er rno = 연결이 거부됨
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp). [실패]
NFS 데몬을 시작함: [실패]
NFS mountd를 시작하고 있습니다: Cannot register service: RPC: Unable to
receive; errno = Connec tion refused [실패]

이런때 rpcinfo -p를 쳐보아라 nfs를 구동하는데 필요한 서비스(portmapper, nfs, mountd)가 시작되지 않았을것이다 서비스를 구동하라




(2) 위의 서비스를 다 구동했는데도 안될때

# mount 192.168.129.1:/home/bobos26 pc
mount: RPC: Unable to receive; errno = Connection refusednfs warning:
mount version older than kernel

mount: nfsmount failed: Bad file descriptor
NFS: mount program didn't pass remote address!
mount: Mounting 192.168.129.1:/home/bobos26 on /dev/shm/tmp/pc failed:
Invalid argument

but rpcinfo -p 해도 portmapper and mountd같은 서비스가 작동중일때

/etc/hosts.allow file을 읽어봐라!!
    ALL: 61.107.31.

처럼 보드부터의 nfs연결 접근을 막고 있다. ALL: 192.168.129를 추가해라!!



(3) 1,2의 방법을 해도 안될때 ㅠㅜ

방화벽 문제이다.
- service iptables stop해봐라. iptable을 죽이면 nfs가 연결이 될꺼다.

그러나 이것은 임시 방편..
- setup을 쳐라 . 거기서 방화벽을 끄거나. 방화벽을 완화시키면 해결완료 ^^



SSH, FTP 접속 딜레이가 생길때...

Posted 2009. 5. 22. 16:36

처음 설치후 한동안 SSH, FTP 등 접속을 할때 빠르게 로그인창이 떳었는데 요즘은 계속 딜레이가 5초 이상이 발생하여
이에 대한 대처 방법을 적도록 하겠습니다.


1. SSH

SSH의 경우 대개 config 를 수정하면 해결이 되더군요
일단 sshd_config 를 수정해야하니 find 명령어로 찾도록 하겠습니다.

# find / -name sshd_config
/usr/local/etc/sshd_config

위의 디렉토리에 있네요.
그럼 수정을..
# vi /usr/local/etc/sshd_config

--------------------
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10
#PermitTunnel no
-----------------------------

맨밑으로 가시고 #UseDNS yes 부분이 있습니다.  이부분을 주석 제거하고 yes를 no로(DNS Server 일 경우 yes 그대로) 하시면 됩니다.

UseDNS no

이렇게 수정하고 저장한다음 SSHD를 재시작 해주시면 됩니다.


2. FTP

FTP의 경우는 대부분(?) resolv.conf 부분에서 딜레이가 발생합니다.

# vi /etc/resolv.conf

제일 첫번째줄에 nameserver 168.126.63.1 (KT DNS) 로 해 보세요.
순서를 바꾸는거죠. ^^;
그리고 /etc/hosts 여기에 접속할 ip 를 추가하면 딜레이 되는 부분이 어느정도 해결이 될겁니다.

서버설치후 해야할 일

Posted 2008. 11. 6. 17:59

출처 Small is beautiful~* | 으랏차차
원문 http://blog.naver.com/jjaiwook79/30009020151


1. 네트워크 접근제한


1) /etc/hosts.allow, hosts.deny 파일을 편집하여 접근을 제한한다.

======================== hosts.allow ========================
#
# hosts.allow This file describes the names of the hosts which are
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
ALL : 218.232.117.*
ALL : 211.214.121.18
ALL : 203.250.136.217
ALL : 211.62.2.*
ALL : 211.62.6.*
ALL : 211.62.7.*
ALL : 211.62.8.*
ALL : 211.62.9.*
ALL : 211.62.15.*
ALL : 211.62.15.*
ALL : 211.196.157.14
===========================================================

======================== hosts.deny ========================
#
# hosts.deny This file describes the names of the hosts which are
# *not* allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow. In particular
# you should know that NFS uses portmap!
ALL : ALL
===========================================================

2) IPTABLE 을 사용하여 커널수준의 방화벽을 구성한다.

======================== rc.local ===========================
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F INPUT
iptables -F OUTPUT

# 웹서버일경우 80으로 들어오는 요청과 1.1.1.1 에서들어오는 ssh 요청을
# 받아들인다.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 1.1.1.1 --dport 22 -j ACCEPT

# 1초에 15번 이상의 HTTP 접근을 할경우 (DOS공격) 접근을 차단한다.
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -connlimit-mask 24 -j DROP

# 메일서버의 경우 동시에 5개이상 SMTP 접근자(스팸머)의 경우 5분동안
# 접근을 제한한다.
iptables -A INPUT -m recent --name spammer --rcheck --seconds 300 -j drop
iptables -A INPUT -p tcp --syn --dport 25 -m connlimit --connlimit-above 5 -m recent --name spammer --set -j DROP

# STRING 필터기능
# MSN 문자열이들어간 패킷 차단
iptables -A FORWARD -m string --string "messenger.msn.com" -j DROP
# 싸이월드로 접속차단
iptables -A FORWARD -p tcp --dport 80 -m string --string "Host: cyworld.nate.com" -j DROP

# 포트스캔을 차단한다.
iptables -A INPUT -m psd -j DROP

# 만약서버가 해킹당해 DOS공격지로 사용될때 적용시킴.
# DNS 쿼리이외에 UDP 패킷이 나가는 것을 방지
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp ! --dport 53 -m state --state NEW -j DROP

# 이외 모든 접근을 차단한다.
iptables -A INPUT -j DROP
===========================================================


2. 시스템 보안


1) sshd를 변경한다. (/etc/ssh/)
======================== sshd_config ========================
# LINE 13 - SSH 포트변경
Port 250
# Line 37 - root계정으로 접근을 제한
PermitRootLogin no
===========================================================

2) 보안상취약한 TELNET 서비스중지
-----------------------------------------------------------
# setup <-- TELNET 해제
# chkconfig --list | grep telnet
krb5-telnet: 해제 <-- 확인
-----------------------------------------------------------

3) 명령어 보안

3-1) ADMIN그룹 사용자만 su 를 사용할 수 있도록 함
-----------------------------------------------------------
# groupadd admin
# useradd -g admin -c 'root 접근가능계정' jjaiwook79
# chgrp admin /bin/su
# chmod o-x /bin/su
-----------------------------------------------------------

3-2) 불법사용자가 다른 서버로 부터 파일을 가져 오지 못하게 제한한다
- 환경이 같으면 다른 서버의 바이너리파일을 가져와 사용할 수 있다
-----------------------------------------------------------
# cd /usr/bin
# chmod 700 scp wget curl lynx
-----------------------------------------------------------

3-3) 불법사용자가 해킹에 사용할 수 있는 명령어들의 권한을 제한한다.
-----------------------------------------------------------
# which nc (또는 netcat)
# chmod 700 /usr/bin/nc
# which gcc
# chmod 700 /usr/bin/gcc
# which cc
# chmod 700 /usr/bin/cc

# chgrp admin /usr/bin/ssh
# chmod o-x /usr/bin/ssh <-- 어드민사용할 수 있도록함. 경유지가되는 것을 막음.
-----------------------------------------------------------

4) 디렉터리보안

4-1) 커널취약성을 대비하여 불법사용자가 프로세스를 실행 못하게 한다.
-----------------------------------------------------------
# echo chmod 700 /proc >> rc.local <-- 부팅시마다 권한이 변하므로 rc.local에 등록해준다.
# chmod 700 /proc
-----------------------------------------------------------

4-2) 해킹에 자주악용되는 /tmp, /var/tmp, /dev/shm 등을 주기적으로 모니터링한다. 이상한 파일이 존재하는지 확인.


3. 보안도구 사용


1) modsecurity (http://www.modsecurity.org)]

웹서버 앞단에서 웹서버로 들어가는 URL요청들을 필터링 할 수 있다.


SecServerSignature " Microsoft-IIS/5.0"
SecFilterSelective THE_REQUEST "wget"
SecFilterSelective THE_REQUEST "lynx"
SecFilterSelective THE_REQUEST "mkdir"
SecFilterSelective THE_REQUEST "/tmp"
SecFilterSelective THE_REQUEST "/bin"
SecFilterSelective THE_REQUEST "/etc/passwd"
SecFilterSelective THE_REQUEST "/\.bash_history"


웹서버의 정보를 바꾸고 (Microsoft-IIS로 표시), 웹해킹에 자주사용되는 명령어 및 디렉터리들을 요청하는 http 접근을 차단한다.


2) promiscan (http://www.securityfriday.com/tools/promiscan_sla.html)

SNIFFING을 탐지할 수 있다.


3) chkrootkit, rkhunter

rootkit을 탐지 할 수 있다.


4) john the Ripper (http://www.openwall.com/john/)

알기쉬운 비밀번호를 사용하는 사용자를 체크한다.

BIND 최신버전으로 업그레이드

Posted 2008. 11. 6. 17:39

BIND 최신버전으로 업그레이드

 

1. 최신 소스 다운로드 받기 [bind 9.5.0]

 

먼저 보안에 노출된 버젼은 받지 마시기 바랍니다.

현재 보안상 문제가 없는 bind-9.5.0rc1 로 예를 들어보겠습니다.

  

[root@localhost tmp]# ftp ftp.isc.org

Name (ftp.isc.org:root): ftp

 

패스워드는 그냥 아무거나 적으시면 됩니다.

 

ftp> cd isc

ftp> cd bind9

ftp> cd 9.5.0rc1

ftp> bi

200 Switching to Binary mode.

 

ftp> get bind-9.5.0rc1.tar.gz

 

[root@localhost tmp]#tar zxvf bind-9.5.0rc1.tar.gz

 

  

2. 백업 받아 놓기 

 

[root@localhost tmp]# cp /etc/named.conf named.conf-20080519

[root@localhost tmp]# /usr/sbin/named -v

BIND 9.2.1

[root@localhost tmp]# cp /usr/sbin/named /usr/sbin/named-921

 

 

3. 컴파일하기 

 

[root@localhost tmp]# cd bind-9.5.0rc1

[root@localhost bind-9.5.0rc1]# vi  bin/named/include/named/globals.h

 

EXTERN const char *             ns_g_defaultpidfile     INIT(NS_LOCALSTATEDIR

                                                             "/run/named.pid");

EXTERN const char *             lwresd_g_defaultpidfile INIT(NS_LOCALSTATEDIR

                                                            "/run/lwresd.pid");

이부분을 

  

EXTERN const char *             ns_g_defaultpidfile     INIT(NS_LOCALSTATEDIR

                                                             "/named.pid");

EXTERN const char *             lwresd_g_defaultpidfile INIT(NS_LOCALSTATEDIR

                                                            "/lwresd.pid");

 

로 수정

 

[root@localhost bind-9.5.0rc1]# ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var/run/named --enable-threads

  

컴파일후 바로 데몬을 확인하시길 바랍니다.

가끔 데몬이 죽는경우가 생기기 때문입니다.

 

[root@localhost bind-9.5.0rc1]# ps -ef | grep named
named    13608     1  0 May19 ?        00:00:00 /usr/sbin/named -u named
root     24320 23450  0 18:15 pts/1    00:00:00 grep named


[root@localhost bind-9.5.0rc1]# service named restart  혹은

[root@localhost bind-9.5.0rc1]# /usr/sbin/named restart

 

[root@localhost bind-9.5.0rc1]# /usr/sbin/named -v
BIND 9.5.0rc1

 

[root@localhost bind-9.5.0rc1]# rndc reload
server reload successful

 

이렇게 하시면 업그레이드는 끝이 납니다.


find 유용한 사용법

Posted 2008. 11. 6. 16:52

유용한 find 사용 방법  


출처 : http://linuxer.mireene.com/bbs/zboard.php?id=tips&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=40


* / 는 최상위 디렉터리를 뜻함. 만약 찾고자 하는 디렉터리가 있다면 그걸로 대체

- 파일 이름에 foobar 가 들어간 파일 찾기
   find / -name "foobar" -print

- 특정 사용자(foobar) 소유의 파일을 찾기
   find / -user foobar -print | more

- 최근 하루동안에 변경된 파일을 찾기
   find / -ctime -1 -a -type f | xargs ls -l | more

- 오래된 파일(30일 이상 수정되지 않은 파일) 찾기
   find / -mtime +30 -print | more

- 최근 30일안에 접근하지 않은 파일과 디렉터리를 별도의 파일로 만들기
   find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.txt

- 하위 디렉터리로 내려가지 않고 현재 디렉터리에서만 검색하기
   find . -prune ...

- 퍼미션이 777 인 파일 찾기
   find / -perm 777 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾기
   find / -perm -2 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾아 쓰기 권한을 없애기
   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

- 빈 파일(크기가 0 인 파일) 찾기
   find / -empty -print | more
      또는
   find / -size 0 -print | more

- 파일 크기가 100M 이상인 파일을 찾기
   find / -size +102400k -print | xargs ls -hl

- 디렉터리만 찾기?
   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

- *.bak 파일을 찾아 지우기
   find / -name "*.bak" -exec rm -rf {} \;

- *.bak 파일을 찾아 특정 디렉터리로 옮기기
   mv `find . -name "*.bak"` /home/bak/

- 여러개의 파일에서 특정 문자열을 바꾸기
   find / -name "*.txt" -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \;




출처 : http://blog.empas.com/rootmankr/19974627

--------------------------------------------------------
1. find 명령과 관련된 기본적인 옵션 사항들
--------------------------------------------------------
(1) -name pattern    
      화일의 이름이 pattern과 일치하면 참, pattern은 셸 메타문자 *,[] ?를 포함할 수 있다.


(2) -perm oct          
      화일의 허가 플래그의 8진수 표현이 oct와 일치하면 참


(3) -type ch            
      화일의 유형이 ch(b=block, c=char등)이면 참


(4) -user userId
      화일의 소유자가 userId이면 참
  

(5) -group groupId    
      화일의 그룹이 groupId이면 참


(6) -atime count      
      화일이 count 날 수 이내에 접근되었으면 참

  
(7) -mtime count      
      화일의 내용이 count 날 수 이내에 수정되었으면 참


(8) -ctime count      
      화일의 내용이 count 날 수 이내에 수정되었고,  화일의 속성이 바뀌었으면 참

  
(9) -exec cmd        
      수행중인 command의 종료 코드가 0이면 참. 명령은 ; 에 의해서 끝내야한다.
      만일 {}를 명령의 인수로 지정하면, 현재 화일의 이름으로 치환


(10) -print                
      현재 화일명을 프린트하고 참값을 반환


(11) -ls                    
       현재 화일의 속성을 보여주고 참값을 반환


(12) -cpio device      
       현재 화일을 cpio 형식으로 device에 쓰고 참값을 반환


(13) -!expression      
       expression의 논리 부정을 반환


(14) exp1 [-a] expr2  
      단축형 and: 만일 expr1이 거짓이면 거짓을 돌려주고, expr2는 수행하지 않고, 만일 expr1이 참이면 expr2의 값을 반환


(15) expr1 -o expr2    
      단축형 or: 만일 expr1이 참이면 참을 반환. 만일 expr1ㅣ 거짓이면 expr2의 값을 반환


--------------------------------------------------------
2. find 동작 예시
--------------------------------------------------------
(1) [root@root /root]# find / -name "*.c" -print
     : 최상위 디렉토리로 부터 모든 C 소스를 출력


(2) [root@root /root]# find / -mtime 5 -ls
     : 최상위 디렉토리에서 5일동안 수정된 화일들을 표시


(3) [root@root /root]# find / -name "*.bak" -exec rm -f {} ; 2>/dev/null
     : 최상위 디렉토리로부터 bak로 끝나는 화일들을 삭제처리함


(4) [root@root /root]# find / (-name "*.c" -o -name "*.bak" ) -print
     : 최상위 디렉토리에서 *.c 나 *bak 화일로 끝나는 모든 화일들의 이름을 출력


(5) [root@root /root]# find / -name "*.o" -o -name "*.tmp"
     : 파일 이름이 *.o 또는 *.tmp 와 일치하는 파일들에 대해서 참으로 평가


(6) [root@root /root]# find / -type f -atime +30 -print
     : 30일 이상 읽혀지지 않은 모든 파일들을 출력한다


(7) [root@root /root]# find / -atime +5 ( -name "*.o" -o -name "*.tmp" )
     : access 시간이 5일 이상이고 이름이 .o 나 .tmp 로 끝난다.


(8) [root@root /root]# find / ! -atime +5 ( -name "*.o" -o -name "*.tmp" )
     : 4번과의 반대로 의 결과를 얻는다. 








Find 용법 Sysadmin 
2007/03/12 19:49


http://blog.naver.com/dreamworkers/70015231124

출처 : 유닉스 파워툴


* / 는 최상위 디렉터리를 뜻함. 만약 찾고자 하는 디렉터리가 있다면 그걸로 대체

- 파일 이름에 foobar 가 들어간 파일 찾기
find / -name "foobar" -print

- 특정 사용자(foobar) 소유의 파일을 찾기
find / -user foobar -print | more

- 최근 하루동안에 변경된 파일을 찾기
find / -ctime -1 -a -type f | xargs ls -l | more

- 오래된 파일(30일 이상 수정되지 않은 파일) 찾기
find / -mtime +30 -print | more

- 최근 30일안에 접근하지 않은 파일과 디렉터리를 별도의 파일로 만들기
find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.txt

- 하위 디렉터리로 내려가지 않고 현재 디렉터리에서만 검색하기
find . -prune ...

- 퍼미션이 777 인 파일 찾기
find / -perm 777 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾기
find / -perm -2 -print | xargs ls -l | more

- others 에게 쓰기(write) 권한이 있는 파일을 찾아 쓰기 권한을 없애기
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

- 빈 파일(크기가 0 인 파일) 찾기
find / -empty -print | more
또는
find / -size 0 -print | more

- 파일 크기가 100M 이상인 파일을 찾기
find / -size +102400k -print | xargs ls -hl

- 디렉터리만 찾기?
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

- *.bak 파일을 찾아 지우기
find / -name "*.bak" -exec rm -rf {} \;

- *.bak 파일을 찾아 특정 디렉터리로 옮기기
mv `find . -name "*.bak"` /home/bak/

- 여러개의 파일에서 특정 문자열을 바꾸기
find / -name "*.txt" -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \;

find에 대한 참고문

find는 유닉스 및 리눅스 환경에서 중요한 유틸리티 중 하나이다. find는
파일의 이름부터 시작해서 수정 시간에 이르기까지 주어진 파라미터들과
일치하는 파일들을 찾아준다.

여기에서는 find에 대해 일부분만 다룬다. 조금더 알고싶은 유저는 한빛미디어
"유닉스 파워툴"을 참조하시기 바란다.

find의 기본문법

find path operators

path는 경로이다. 이 부분에 대해선 다음부분에서 약간 더 자세하게
설명할 것이다.
operators 는 연산자이다. 쉽게 풀이하자면 옵션인 셈이다. 여기에 들어갈
수 있는 것은 지금부터 소개할 것이다.

-name filename

우리가 가장 일반적으로 사용하는 옵션이다. filename에는 와일드 카드(별표)
가 들어갈 수 있지만 쉘이 변환하지 않도록 인용부호 쿼트(")로 둘러싼다

-perm mode

주어진 액세스 모드를 가진 파일을 찾는다. 액세스 모드는 8진수 값을 갖는다.
뒤에서 다시 설명한다

-type c

지정된 타입에 관해서 파일을 찾는다. c는 한글자로 된 코드이다. 예를 들면,
f는 일반 파일, b는 블록 특수 파일, l은 심볼릭파일을 나타낸다. 뒤에서 다시
설명한다.

-user name

이 옵션은 name에 해당하는 사용자 파일을 찾는다. name에는 사용자 id뿐만 아니라
사용자의 UID도 들어갈 수 있다.

-group name

이 옵션은 name에 해당하는 그룹의 파일을 찾는다. name에는 그룹명 뿐만 아니라
GID가 들어갈 수도 있다.

-size n

해당되는 사이즈의 파일을 찾는다. n은 블록길이의 파일을 찾는다. 한 블록은 512와 같다.
+n 이란 표시가 들어가면 n 블록보다 더 긴 파일을 찾는다라는 뜻이다. 파일이 클때
유용하다. nc라는 표현은 n 문자 길이의 파일들을 찾는다는 의미이다. ++nc는 무엇을
뜻할까? 뒤에서 다시 다룬다

-inum n

inode 번호가 n인 파일을 찾는다. 그다지 자주 사용되는 옵션은 아니여서 자세한
설명은 요약한다.

-atime n

n일 전에 액세스한 파일들을 찾는다. +n은 n일 이전에 액세스한(즉 n일 동안 액세스
하지 않은)파일들을 찾는다는 의미이다. 그러면 -n은 무엇을 의미할까? (즉, n일 동안
액세스한) 파일들을 찾는다" 의미이다. 뒤에서 다시 언급한다

-mtime n

파일의 내용이 수정된 시간을 검사한다는 것을 제외하고는 atime과 유사하다.

-ctime n

inode의 마지막으로 변경된 시간을 확인한다는 것을 제외하고는 atime과 유사하다.
"변경되다"라는 것은 파일이 수정되거나 그 특성 중의 하나가 변경되었다는 것(예를
들면, 그 소유자)을 의미한다.

-newer file

주어진 file보다 더 최근에 수정된 파일을 찾는다.

그런데 여기까기 find의 옵션을 살펴 보았는데 때때로 여러분은 조건을 만족하는
파일을 찾기 원할 것이다. 이럴때 쓰는 연산자가 있다. 다음이 그 연산자이다.

operator1 -a operator2

and 연산에 해당한다. -a는 생략이 가능하다. 두개의 검색 패턴이 같이 쓰여지면
find는 2개 모두와 일치하는 파일들을 원하는 것으로 가정한다.

operator1 -o operator2

or 연산에 해당한다. 둘 중 하나가 속하는 파일을 찾는다.

! operator

not 연산에 해당한다. operator에 해당하지 않는 파일들을 찾는다.

\(expression\)

논리 우선순위를 의미한다. 복잡한 표현식에서 위와 같이 지정해 주면 이 부분을
나머지 부분보다 빨리 계산한다. 여기서 (를 \( 로 표현했는데. 쉘이 해석할 수
있기 때문이다. php를 사용해 보신분이라면 무슨 얘기인지 대충 감 잡으셨을 것이다.

이번 부분은 find가 파일들을 찾았을때의 행위를 지정하는 그룹의 연산자들이다.

-print

파일의 이름을 표준출력으로 출력한다. 뒤에서 조금 더 다룬다..

-exec command

찾은 파일들을 command로 처리한다. command에서 찾은 파일의 경로명을 포함
시키려면 중괄호를 사용한다 {} command는 명령을 실행시키고 난 뒤에는 반드시
백슬래시와 세미콜론을 사용한다. (\;)

-ok command

기본적으로 -exec 옵션과 같다. 그러나 해당 command를 실행하기 전에 명령을
실행할지에 대해 물어본다. 일반적으로 find를 테스트하는 데 많이 쓰인다고 한다.

위 옵션은 가장 일반적인 옵션들이지만 때때로 막강한 시스템 관리자들은 추가 또는
삭제하여 사용하기도 하니 여러분의 시스템에서 man find를 하게 되면 더 많은 옵션을
볼 수 있을 것이다.

1. 깊은 디렉토리 파고 들어가기

find의 가장 분명한 용도는 오래되고 큰 자료를 찾는 것이다. 또는 사용되지 않는
파일들의 위치를 찾아내는 능력이다. 그러나 근본적으로 가장 중요한 find의 특징은
서브 디렉토리로 내려가는 것이다.

보통 쉘은 인자 목록을 명령어에 제공해 준다. 그것은 UNIX 프로그램들에게 디렉토리명이
아닌 파일명들이 주어지는 이유이다. 단지 몇몇 프로그램들만이 디렉토리 이름을 받아서
서브디렉토리의 이름을 받아서 검색해서 내려갈 수 있다. find, tar, du, 그리고 diff 같은
프로그램이 그렇게 한다. chmod, chgrp, ls, rm 그리고 cp의 몇몇 버전들도 -r이나 -R
옵션이 주어질 때는 그럴 수 있다.

일반적으로는 대부분의 명령어들은 디렉토리 구조를 완전이 이해하지 못하며 쉘이 와일드
카드를 디렉토리 명으로 확장해 주는데 의존한다. 그러므로 어떤 디렉토리 그룹에서 .o로
끝나는 모든 파일들을 삭제하려면 다음과 같이 입력할 수 있다

find *.o */*.o */*/*.o

이렇게 하는 것은 입력하기 귀찮을 뿐 아니라 검색하는 모든 파일들을 찾을 수 없을지도
모른다. 쉘은 어떤 맹점이 있다. 점으로 시작하는 이름을 가진 디렉토리 내의 파일들은
찾을 수 없을 것이다. 그리고 */*/*/*.o 로 찾아지는 파일들이 있다면 삭제되지 않을 것이다.

또 다른 문제점은 위와 같이 입력하게 되면 Arguments too long이라는 에러 메시지를 내 뱉는다.
이것은 여러분이 입력한 와일드 카드를 쉘이 너무 많은 인자들로 확장했음을 의미한다.

find는 이런 문제점에 대한 해결책이다.

find의 가장 간단한 예는 다음이다

find . -print

find의 첫번째 인자는 디렉토리 또는 파일들의 경로이다. 위의 예제는 해당 디렉토리의
모든 파일들을 찾아준다. 경로명 뒤의 인자들은 항상 - 부호 (하이픈또는 대시라고 부른다)가
붙게 된다. 이것에 유의하기 바란다. 그리고 이 인자는 find가 무엇을 찾았을 때 어떤 행동을
취하는 가에 대해 명시한다. 그리고 다른 말로 이것은 검색 연산자들이다. 이경우엔 파일명이
출력된다. 특정 경로 이외에 C쉘에서는 틸드(~)도 사용할 수 있다. 예를 들어본다

find ~ ~barnett /usr/local -print

그리고 만약 따분하다면 다음과 같이 명령을 내릴 수도 있다

find / -print

위의 예제는 디스크에 있는 모든 파일들을 검색한다. 이 예제는 자신이 쓰는 워크스테이션에선
상관 없겠지만 여러 사람이 쓰는 웍 스테이션이나 서버에서는 범죄 행위일 정도로 디스크를
공회전 하게 낭비한다. 왠만해선 참아주기 바란다. 그러나 정말 필요하다고 생각될 시엔
/* 를 사용해 주기 바란다.

find는 결과를 표준 출력(stdin)으로 뿌리게 되니 발견한 파일의 목록을 다른 명령어로 보낼 수 있다.
이 기능을 사용한 한가지 방법은 치환이다. 다음 예제를 보자.

ls -ld 'find . -print'

find의 명령어의 실행 결과 출력이 역 인용부호 전체를 대신한다. ls는 find의 결과를 볼뿐 find
가 사용되었다는 것을 모른다. 또 다른 명령어는 xargs를 사용하는 방법이 있으나
여기에서 더 다루지 않겠다. 관심있는 유저는 한빛미디어 "유닉스 파워툴"을 보기 바란다.

2. -print 를 잊지 말자..

가끔 나는 find에 -print를 붙이는 것을 잊는다. 이것을 붙이지 않으면 검색결과가 출력되지 않는다.
(물론 GNU 버전에서는 그렇지 않으나 GNU 버전이 아닌 find에서는 꼭 붙여주어야 한다. 일부 버전에서는
-ls도 사용한다)
이것은 오래된 시스템 관리자도 가끔 잊고 초보 사용자들이 가장 잘 실수하는 내용 중 하나이니 조심하자
그리고 일부 버전은 -print를 추가해 주기도 하지만 기대해선 안된다.

3. 특정한 이름을 가진 파일 찾기

find 명령을 내릴때 메타 문자를 사용할 수 있는데 정규 표현식(grep과 같진 않다)를 사용할때 -name
연산자의 인자로 사용해서 그것들이 변경되지 않고 find로 넘겨지게 하려면 인용 부호로 감싸야 한다.
여기서 인용부호로는 어떤것을 사용해도 관계 없다.

find . -name \*.o -print
find . -name '*.o' -print
find . -name "[a-zA-Z]*.o" -print

파일 경로의 디렉토리들은 -name 연산자와 일치하지 않고 경로의 마지막에 있는 이름만이 일치한다.
예를 들어, 위의 명령어들은 ./subdir/afile이란 경로명과 일치하진 않지만 ./subdir/prog.o와는 일치한다.

경로의 중간에 있는 디렉토리과 일치하는 방법이 있다.

alias ff "find . -name '*\!{*}*' -ls"

파일이나 디렉토리의 이름을 넘겨주면 이 앨리어스는 그 인자를 포함하는 모든 파일이나 디렉토리
이름의 목록을 출력할 것이다.

4. 오래된 파일 찾기

7일된 파일을 찾고 싶으면 -mtime 연산자를 사용하면 된다

find . -mtime 7 -print

또 다른 방법은 시간의 범위를 지정하는 것이 있다.

find . -mtime +6 -mtime -8 -print

mtime은 파일의 최종 수정 시간이다. 사용되지 않은 파일을 찾아보려면 -atime 인자로 액세스 시간을 확인
하면 된다. 30일 이상 읽혀지지 않은 파일을 찾으려면 다음과 같이 하면 된다.

find . -type f -atime +30 -print

find 명령어가 디렉토리의 시간을 수정하기 실제로 액세스 되지 않은 디렉토리를 찾기란 어렵다. 각 파일과
관련된 연관된 또 하나의 시간이 있는데. ctime이라 불리는 inode 변경 시간이다. 그러나 여기에선 더 이상
자세하게 다루지 않는다.

5. find 검색의 최고봉이 되어보기

find는 확실히 까다롭다. 그러나 그 능력을 자유롭게 다루면 그 까다로움에 감사하게 될 것이다.(아직 필자는
그런 능력을 가지고 있지 않다)

find의 명령어들은 명령행의 복잡도와 상관없이 실제로는 위와 같은 것의 변형들일 뿐이다. 많은 다른 이름을
명시할 수 있고 오래된 파일들을 찾을 수 있다. 그 복잡함에 관계없이 실제로는 시작점이 어디이고 어떤
파라메터를 주고, 그리고 찾아낸 파일들을 어떻게 처리할 것인지 대해 명시하는 것 뿐이다.

더 복잡한 방법으로 find를 사용하는 것의 핵심은, 검색 파라미터는 실제로는 find가 평가하는 "논리 표현식(logical
expression)이라는 것을 깨닫는 것이다.(실제 find를 사용하는 대 부분의 유저는 논리 표현식을 사용하지 않는다)

즉. find는
한번에 하나씩 모든 파일들을 본다(솔직히 이것은 사실이다. 그러나 우리눈에 보일정도로 느리진 않다)
명령행 연산자가 제공한 표현식을 평가하기 위해 indoe에 들어있는 정보를 사용한다.(앞서 inode는 많이 사용하지
않는다는 얘기를 들어 생략했다)
표현식의 값이 참이면 지정된 행동을 한다.(예를 들면 파일의 이름을 출력하기 위해)

예를 들어 다음 표현식은 참이다
find / -name "*.c"

이런식으로 생각하게 되면 논리 연산자도 쉽다. 다음 표현식은 2개의 확장자에 해당되는 파일을 찾는다

-name "*.o" -o -name "*.tmp" -print

위 예제는 *.o와 *.tmp로 끝나는 파일들을 찾는다. 그럼 위의 확장자를 가진 파일을 찾는다면 다음의 표현식을
넣어 액세스 시간이 맞는지 검색한다

-atime +5 \( -name "*.o" -o -name "*.tmp" \)

find 안에 괄호를 넣으면 해당 부분을 먼저 계산한다. 앞에서 잠깐 설명했지만 괄호 앞에 \ 를 넣은건
서브 쉘 연산자로 의식하지 말라고 넣은 것이다.

그러나 위의 예제를 다음과 같이 바꾸면 참이 아니다.

atime +5 -name "*.o" -o -name "*.tmp"

위의 예제는 이름이 *.tmp로 끝난다. 이면 참이라는 틀린 식이 된다. 이 잘못된 표현식은 .tmp로 끝나는
모든 파일들에 대해 그 파일이 언제 액세스 되었간 간에 참이 될 것이다. 즉 -atime이 적용되지 않는다.
그러나 위의 표현식은 틀린 식이 아니다. 그러나 우리가 원하는 일을 하지 않을 뿐이다.

위의 예제를 조금 더 응용해서 현재 디렉토리에 있는 파일들을 찾으려면 다음과 같이 내리면 된다.

find . -atime +5 \( -name "*.o" -o -name "*.tmp" \) -print

그러나 반대로 위의 파일들만 찾지 않는다면 ! 연산자를 사용하면 된다..

find . ! -atime +5 \( -name "*.o" -o -name "*.tmp" \) -print

그러나 위의 표현식은 -atime 연산자에 대해서만 적용한다. 모든 연산자에 사용하려면 -atime 연산자에도
괄호를 아래와 같이 사용하면 된다.

find . ! \( -atime +5 \( -name "*.o" -o -name "*.tmp" \) \)-print

-print도 표현식이다. 이것은 항상 참으로 평가된다. 이외에 -ok, -exec 도 항상 참으로 평가된다.
이 표현식들이 좋게 사용될 때가 있긴 하다. 뒤에서 다시 다룬다.

그리고 여러분들이 find를 사용할 때 실수 하는 것 중 하나는 공백을 넣지 않는 것이다. 모든 연산자에는
공백이 필요함을 기억하기 바란다.

find가 찾는 시간들

일반적으로 -atime 부류의 연산자들에 대해서는 아쉽게도 문서화가 되어 있지 않다. 이 시간들은 일반적으로
일 단위이다.

부호없는 숫자. 예를 들어 3은 정확하게 3일 전에 끝난 24시간을 의미한다.(달리 말하면 96시간과 72시간 전 사이)

마이너스 부호를 가진 숫자는 그 시간 이후의 기간을 가리킨다. 예를 들어, -3은 지금과 3일 전 사이의 모든 시간이다.
(달리 말하면 0시간 전과 72시간 전 사이)

플러스 부호가 붙은 숫자는 그 시간 전의 24시간 기간을 가리킨다. 예를 들면 +3은 3일 이상 된 시간이다. (달리 말하면
96시간 이상)

정확한 파일 비교

"이 부분에 대해서는 언급을 생략한다. 위에서 언급한 책을 보면 자세하게 잘 나와있으니 참고하기 바란다."

찾은 파일 실행하기

find에서 찾은 파일을 실행할 수 있는데 여기서 -exec 연산자는 끝 부분에 항상 \;를 넣는다. 그러나 find가 다르게
취급하는 인자가 있는데 이 인자는 바로 중괄호이다. {} 이 두문자들은 find가 발견하는 파일의 이름을 갖는 변수이다.
예제를 보면 더 확실할 것이다. 다음 예제는 간단한 경우로써 -print 연산자를 흉내내는 echo 연산자가 있다.

find . -exec echo {} \;

c쉘은 {} 문자를 사용하지만 {}를 바꾸진 않으므로 이 문자를 인용부호로 덮어쌓일 필요는 없다. 그러나 \;에서 \는
''로 대체가 가능하다. 세미 콜론은 항상 ';'로 C쉘에서는 하는 걸로 익히자..

그리고 find안에 또 다른 find의 호출이 가능하다

여기에선 또 다른 호출에 대해서는 생략한다

-exec 커스터 테스트하기

-exec 연산자를 이용해서 커스템 테스트를 할 수 있는데 앞서 잠시 얘기했지만 되도록 -exec 연산자를 피하는게 좋다
사용해야 한다면 -ok 를 사용하는 방법과 확실히 그걸 실행해야 하는지 확인해 본다. 그리고 -exec 연산자는 꼭 find
명령의 뒤쪽에 놔두도록 한다.

HandTip

여기엔 기재하지 않았지만 \ 를 줄 바꿈 연산자로 사용할 수 있다. SQL에서도 사용가능하니 유용할 것이다. 다량의
명령어를 내릴때 상당히 유용한 기능이다.

find의 진정한 역할?

find의 진짜 역활은 파일의 위치를 찾는 것이 아니라 표현식을 평가하는 것이다. 그렇다. find는 확실히 파일의 위치를
찾아준다. 그러나 그것은 부수적인 것이다. 이점을 이해하는 것이 find를 이용하는 데에 있어 이해가 빠르고 find를
훨씬 더 자유롭게 유용하게 만드는 개념적인 발전이 될 수도 있다.

-type 연산자의 유형들

b - 블록 특수 파일("장치 파일")
c - 문자 특수 파일("장치 파일")
d - 디렉토리
f - 일반파일
l - 심볼릭 파일
p - 이름 파이프 파일
s - 소켓 파일

// 이 아래부분에서 더 이상 설명를 다루지 않습니다.

find . -size 1234c -print

- 보다 더 작은 , + 보다 더 큰

find . -name \*.o -perm 664 -print

find . -type d -perm 777 -print

----w---- 패턴은 -20과 같다.

퍼미션 8진 값
rwxrwxrwx 777
rwxrwxr-x 775
rw-rw-rw- 666
rw-rw-r-- 664
rw-rw---- 660

find . -perm -100 -print

실행가능한 --x------ 파일을 찾는다.

-perm 인자가 마이너스 부호를 가지게 되면 setuid 설정 비트를 포함한 모든 퍼미션 비트들이 검사된다.


« PREV : 1 : 2 : 3 : 4 : 5 : NEXT »