728x90

서버에서 주기적으로 백업을 하거나, 소스 등을 수정했을 경우 파일을 특정 백업서버로 백업을 하는 게 좋다.


백업 서버로 백업을 하는 스크립트다.


#!/bin/bash

COMPANY_NAME=   // 회사의 영문 약어명
TODAY=`date +%Y%m%d`
BACKUP_DIR=/root/backup
DEST_SERVER_DIR=/backup/Chart/${COMPANY_NAME}
#########################################################
# 다른 패키지와 혼동되지 않도록 PATH 우선 설정
#########################################################
export PATH=/usr/local/apache/bin:/usr/local/mysql/bin:/usr/local/mysql/scripts:${PATH}

#########################################################
# 기존 파일 있으면 지우기
#########################################################
cd ${BACKUP_DIR}
rm -f *
#########################################################
# MySQL 덤프
#########################################################
echo "Dumping MySQL database..."
mysqldump -u아이디 -p패스워드 DB명 > ${BACKUP_DIR}/${COMPANY_NAME}_mysqldb_backup_${
TODAY}.sql
echo "${COMPANY_NAME}_mysqldb_backup_${
TODAY}.sql DB create !!\n\n"
sleep 1

########################################################
# Web Source 백업
########################################################
echo "source backup doing !!\n\n"
cd /usr/local/apache/
tar cvzf ${COMPANY_NAME}_srcbackup_${
TODAY}.tar.gz htdocs/
mv ${COMPANY_NAME}_srcbackup_${
TODAY}.tar.gz ${BACKUP_DIR}

sleep 1
#########################################################
# Secure FTP 백업
#########################################################
# 백업할 파일이 있는 디렉토리로 경로 변경
cd ${BACKUP_DIR}
echo "now ${BACKUP_DIR} backup doing !!\n\n"

FTP_HOST="IP주소"

/usr/bin/sftp root@${FTP_HOST} << EOF
cd ${DEST_SERVER_DIR}
mput *
exit
EOF

# 로컬 백업파일 삭제
cd ${BACKUP_DIR}
rm -f *

exit 0


블로그 이미지

Link2Me

,
728x90


1. 리눅스 파일/디렉토리 구조 파헤치기

1.1 /bin

/bin에는 필수적인 실행 명령어들이 모여 있다. 대부분이 모든 사용자가 실행 가능한 것들이며 우리가 쓰는 거의 모든 기본 명령어들이 담겨 있다. 예를 들어 cat, chmod, chown, cp, date, echo, kill, ln, ls, mkdir, more, mount, mv, ps, pwd, rm, sh, su, vi 등등등...


1.2 /boot

말 그대로 시스템 부팅에 관련된 모든 파일을 담고 있다. 단, lilo(LInux LOader)의 설정 파일은 /etc/lilo.conf 에 있으며, lilo 자체는 명령어로서 /sbin/lilo에 위치하고 있다. 특히 커널 이미지인 vmlinuz 가 위치하고 있는데, lilo 가 아닌 다른 부트로더 프로그램들 모두가 공통적으로 vmlinuz 를 이용해 시스템을 부팅하므로 이 디렉토리가 매우 중요하다고 할 수 있다. 이 디렉토리의 파일들은 직접 편집할 수 없으며 커널 컴파일 등의 과정으로부터 생성된다.


1.3 /dev

각종 디바이스 파일들이 위치해 있는데 크게 블록 디바이스와 캐릭터 디바이스로 나뉠 수 있다. 블록 디바이스란 HDD와 같은 주변 장치를 말하는데, 데이타가 블록 단위로 읽고 쓰여지며 랜덤하게 액세스할 수 있다. 반면 캐릭터 디바이스는 입출력이 한 바이트 단위로 이루어지며 데이터가 순차적으로 읽고 쓰여진다. 디바이스를 새로 만들 때에는 mknod 명령을 이용하면 되며, 물론 /bin 에 위치해 있다. mount를 할 때에 필요한 디바이스 몇 개만 소개한다.

플로피 디스크 디바이스

/dev/fd0

첫 번째 FDD의 디바이스로 두 번째의 경우는 0 대신 1을, 세 번째의 경우는 2를 써주면 된다.

IDE 하드 디스크 디바이스

/dev/hda or /dev/hda1

마지막 부분의 hda에서 'a'는 위치를 나타내는 것으로, 'a'는 primary master, 'b'는 primary slave, 'c'는 secondary master, 'd'는 secondary slave를 의미한다. 그리고 그 뒤에 숫자가 없을 경우에는 전체를 의미한다. 숫자를 달 경우에는 파티션을 의미한다.

SCSI 하드 디스크 디바이스

/dev/sda, /dev/sda1

IDE 하드 디스크 디바이스와 같으나 'h' 대신 's'를 쓴다.

하드웨어 관련 디바이스

/dev/cdrom

CD-ROM 디바이스이다.


1.4 /etc

시스템 설정 파일들이 모여 있다. 그런 만큼 시스템을 백업하고자 할 때는 꼭 이 디렉토리를 가장 먼저 백업해야 한다. 각 파일들에 대한 설명은 에디터로 파일을 열어보면 주석처리로 설명이 되어 있으므로, 참고하면 될 것이다.

/etc/(cshrc.login, cshrc.cshrc, profile)

bash 나 csh,tcsh 사용자가 로그인할 때 기본으로 읽어들여 초기화시키는 파일이다. 그러므로 모든 사용자에게 공통으로 적용할 쉘 관련 사항이 있다면 이 파일들을 수정하면 된다. 각 사용자들은 자신의 홈 디렉토리에 개별 설정 파일이 있으므로 역시 원하는 대로 설정할 수 있다.

/etc/fstab

시스템 부팅시 처리되는 마운트와 관련한 사항들이 기록되어 있다.


/dev/hda1 / ext2 defaults 1 1 /dev/hdb5 /home ext2 defaults 1 2 /dev/hdb2 /public ext2 defaults 1 2 /dev/hda2 /public2 ext2 defaults 1 2 /dev/hdb6 /sysbackup ext2 defaults 1 2 /dev/hdb3 swap swap defaults 0 0 /dev/fd0 /mnt/floppy ext2 owner,noauto 0 0 /dev/cdrom /mnt/cdrom iso9660 owner,noauto,ro 0 0 none /proc proc defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0


첫 번째 항목은 마운트될 디바이스가 적혀 있다. 디바이스 이름은 이미 보고 넘어갔으니 모르는 사람은 없겠죠? 두 번째 항목은 마운트시킬 마운트 포인트가 적혀 있다. 세 번째 항목은 해당 디바이스의 파일 시스템 타입이 적혀 있다. ext2는 리눅스에서 사용하는 파일 시스템이며, msdosvfat는 각각msdos와 windows에서 사용하는 파일 시스템이고, iso9660은 CD-ROM에서 지원되는 파일 시스템이다. 자세한 것은 mount를 참고하자.

/etc/group

사용자 그룹이 정의되어 있으며, 다음과 같은 형식으로 쓰여져 있다.


Group Name:Password:GID:Member


/etc/issue

시스템에 로그인할 때 나타나는 'login:' 위에 나타나는 메시지이다. 만약 로그인할 때 나타나는 메시지를 바꾸고 싶으면 /etc/rc.d/rc.local 파일의 맨 아래 부분에 #로 시작되는 주석을 참고하자.

/etc/motd

'message of the day'의 약자로 로그인 직후의 메세지를 담고 있다. 관리자가 공지를 띄우는 데 유용한 파일.

/etc/passwd

사용자들의 계정 정보와 패스워드, 홈 디렉토리에 대한 정보를 담고 있으며 다음과 같은 형식으로 쓰여져 있다.


user ID:passwd(암호화상태):UID:GID:사용자 정보:홈디렉토리:로그인쉘


/etc/shadow

쉐도우 패스워드 파일


1.5 /home

사용자들의 모든 홈 디렉토리가 담겨 있다.


1.6 /lib

공유 라이브러리와 커널 모듈들이 담겨있다. 이전에 짚고 넘어간 /bin과 /sbin디렉토리에 있는 실행 명령어들이 실행될 때 필요한 공유 라이브러리들이 존재한다.


1.7 /mnt

마운트 포인트 디렉토리로써 꼭 여기에만 마운트해야 하는 것은 아니다. 하지만 일부러 만들어 놓인 곳이니 이곳을 쓰자^^;


1.8 /proc

일종의 가상 파일 시스템으로 메모리 정보만을 담고 있다. 우리가 흔히 사용하는 ps 프로그램이 여기에서 프로세스 정보 등을 참조한다.


1.9 /root

root(수퍼 유저)의 홈 디렉토리. 뭐 그게 끝이지 뭐...^^;


1.10 /sbin

수퍼 유저가 사용하는 실행 명령어들이 거의 다 들어 있다. 그러므로 물론 일반 유저는 사용할 수 없다. 예를 들어 halt, reboot, fdisk, mkfs등이 있다.


1.11 /tmp

임시 디렉토리이다. 그러므로 임시 파일들의 간이 저장 창고 역할을 한다.


1.12 /usr

/usr 은 리눅스 시스템에서 가장 많은 용량을 차지하는 부분으로 대부분의 프로그램들이 여기에 깔린다.

/usr/X11R6

/usr/X11, /usr/X386 이 모두 /usr/X11R6 의 심볼릭 링크이다. /usr/X11R6/lib/X11 에는 X-윈도와 관련한 여러가지 파일 및 디렉토리가 있다.

/usr/bin

/bin 에서 짐작되듯이, 대부분의 사용자 실행 명령어들이 담겨 있다. gcc나 perl등의 개발도구도 여기에 담겨 있다.

/usr/doc

역시 doc에서 유추할 수 있듯이 각종 리눅스에 관한 문서들이 담겨 있다.

최신버젼의 문서를 보길 원한다면 kldp.org(Korea Linux Documentation Project)를 방문하면 많은 도움이 될 것이다.

/usr/include

C, C++ 프로그램의 헤더 파일들이 담겨 있다.

/usr/info

여기에는 여러가지 GNU 프로그램들(gcc, make, autoconf...)의 info 파일들이 담겨 있다. 이 디렉토리를 이용하는 방법은 단순히 'info 프로그램 - ex) info gcc -'라고 치면 된다. 상당히 유용하므로 기본적으로 알아두자.

/usr/local

새로운 프로그램들이 설치되는 곳으로 프로그램 관리를 용이하게 할 수 있도록 되어 있다. make install로 프로그램 설치시 기본 디렉토리가 대부분 /usr/local 로 되어 있는 이유가 바로 그것이다. M모사의 '창문들'이라는 OS에 있는 'Program Files'라는 디렉토리와 유사하다고 보면 된다.

/usr/man

info 와 비슷한 역할을 한다. 메뉴얼 페이지가 담겨 있는 것으로 역시 'man 프로그램'을 쳐서 이용할 수 있다. 모르는 명령어들은 꼭 한 번씩 man으로 확인하는 습관을 갖길...

/usr/src

프로그램 소스들이 보관되어 있는 것으로 리눅스 커널이 위치하고 있는 곳이다.


1.13 /var

이 디렉토리 아래에는 시스템 작동 중 변경되는 파일들이 담겨 있다. 로그 파일이나 스풀 파일들이 그것들인데, 즉 다른 시스템과 공유가 되지 않음을 의미한다.


출처 : http://coffeenix.net/doc/kuls/file_system-4.html

블로그 이미지

Link2Me

,
728x90

phpMyAdmin 에서 특정한 테이블만 삭제한다는 것을 실수로 DB 전체를 날려버렸다.

정신이 아득하다. 검색해서 실수로 날린 DB 복구방법으로 시도를 했는데 안된다.

아~~ 미처버리겠다는 생각이 들었고 나온 방법으로 수동 비슷하게도 복구를 시도해봤다.

그런데 문제는 PHP 소스코드 구현 방식에 약간 문제있는 부분이 있다는 걸 알게되었고, 이 방법으로는 정상적인 복구가 안된다.


최종적으로 복구를 한 방법을 적어둔다.


# cd /usr/local/mysql/data

에 가면 방금 삭제한 로그를 기록한 파일이 있다.

시간대를 보면 확인할 수 있다.

해당 파일을 보니 mysql-bin.000003 로 되어 있다.


복구방법에 보니까 이걸 한줄 한줄 실행해서 파일 하나로 합치라는 명령어가 있다.

그런데 이건 잘못된 듯하다.


/usr/local/mysql/bin/mysqlbinlog -d testdb mysql-bin.000003 > resque.sql

를 실행한다.

여기서 testdb 대신 실제 사용하는 DB명으로 수정해야 한다.

이렇게 하면 복구를 위한 1단계 준비는 되었다.


※ grep "insert" resque.sql > resque1.sql 이런거 하라고 되어 있는 곳도 있던데 이런거 하면 약간의 명령어는 나온다. 하지만 100% 복구 방법이 절대 아니다. 이거 해본다고 시간만 낭비했다.


2단계로 이 파일을 PC로 백업한다.

  mysql-bin.000003 파일도 PC로 복사를 해두는 편이 좋다고 생각하면 복사를 하라.

  테스트를 거치다보니 동일한 파일에 시간대가 달라지면서 계속해서 작업한 내용이 쌓이더라.


3단계로 이 파일을 EditPlus 로 열어서 맨 하단에 보면 drop table 이라고 표시된 부분이 보일 것이다.

  이 부분을 삭제 또는 주석처리 해주어야 한다.

  그런 다음에 저장하고 이 파일(rescue.sql )을 다른 이름으로 변경(rescue_modify.sql )하여 다시 서버에 복사를 한다.


4단계

# mysql -u 계정아이디 -p DB이름 < rescue_modify.sql
를 해주고 나면 패스워드 입력하고 나면 복구가 된다.


이렇게 복구하면 혹시라도 다시 만든 테이블이 있다면 삭제되어 버린다.

즉, 복구한 명령어를 가진 파일로 업데이트를 해버린다는 말이다.

'리눅스' 카테고리의 다른 글

sftp 파일 전송 shell script  (0) 2017.03.09
리눅스 파일/디렉토리 구조  (0) 2017.03.09
리눅스 날짜시간 변경  (0) 2016.10.24
2개의 APM(Apach + PHP + MySQL) 소스 설치  (0) 2016.07.17
SSH chroot 설정방법  (0) 2016.07.04
블로그 이미지

Link2Me

,
728x90

리눅스에서 날짜와 시간 변경 방법


수동으로 변경하는 방법

#date 월일시분년.초

로 입력해야 한다.

예시) date 102410202016.30


Time Server 와 동기화하는 방법

#rdate -s time.kriss.re.kr


H/W(하드웨어) BIOS 시간 확인

#hwclock --show


H/W BIOS 시간을 리눅스 시간으로 동기화하는 방법

#hwclock --systohc

블로그 이미지

Link2Me

,
728x90

리눅스를 호스팅업체에서 최신버전으로 설치를 해준 것이 있는 상태에서 다른 걸 테스트해야 할 경우가 있었다.

즉, 최신버전의 APM 에서는 동작이 되지 않았다.


고민하다가 호스팅업체에 문의를 해보니 이미 설치된 리눅스 버전의 이름을 변경하고 나서 다시 소스 컴파일을 해보면 된다고 했다.


그래서 소스 컴파일을 다시 해봤더니 잘 되었다.


변경해서 사용할 일(테스트)이 생기면 디렉토리 이름만 서로 변경하여 사용한다.

물론 변경하고 나면 DB 인식등은 새로 해주어야 한다.


1. 디렉토리 이름 변경전에 할일

   모든 웹서버 데몬 죽이기 : killall httpd

   MySQL 데몬 중지 :  /etc/init.d/mysqld stop


2. 새로운 APM 설치

    APM 이 설치되어 있지 않은 상태에서는

    먼저 기존 apache, php, mysql 디렉토리 이름에 날짜 또는 다른 식별자로 표시하여 디렉토리명을 변경한다.

    그 다음에 APM(Apache + PHP + MySQL)을 소스 컴파일한다.

    그러면 apache, php, mysql 디렉토리가 새로 생긴다.


3. 디렉토리 이름 서로 변경


4. 데몬 구동

    MySQL Start : /etc/init.d/mysqld start

    HTTPD Start : /etc/init.d/httpd start


5. MySQL root 비밀번호가 생각나지 않아서 접속해서 작업을 못하는 상황이 생겼다.

   이럴 경우에는

ps -ef | grep mysql
killall mysqld
cd /usr/local/mysql/bin/
./mysqld_safe --skip-grant &
# 대기모드 상태가 된다. 여기서 엔터키를 치면 대기모드에서 빠져나오므로
# 아래 작업이 끝나기 전에는 엔터키를 치지 말아야 한다.

# 또다른 콘솔창을 하나 더 띄운 상태에서 실행
mysql -u root -p
mysql> use mysql;
mysql> UPDATE user SET password=password('ROOT_비밀번호') WHERE user='root';
mysql> flush privileges;
mysql> quit

#### mysql 데몬 다시 구동
/etc/init.d/mysqld start



6. 새로운 DB 세팅 및 사용자 권한 부여 방법

    색상 표시를 한 부분은 원하는 형태로 변경하여 사용할 부분임

   // DB 생성
      create database webdb default character set utf8;

   // 새로운 Database 를 생성하고 사용자에게 권한을 부여하는 방법
      mysql > use mysql;
      mysql > create user web@localhost identified by 'passwdsetting';
   // 사용자(user)를 추가하면서 패스워드까지 설정
      mysql > grant all privileges on webdb.* to web@localhost;
      mysql > flush privileges;

   // 권한 회수
      revoke all on webdb.* from web@localhost;

   // 권한확인
   show grants for web@localhost;


블로그 이미지

Link2Me

,
728x90

FTP chroot 를 설정하여 FTP 홈 디렉토리 상위 디렉토리로 이동이 불가능해진다.
하지만 SFTP 로 접속하면 홈 디렉토리 상위 디렉토리로 이동이 가능하다.
따라서 SSH chroot 적용 방법으로 적용해야 한다.
- Chroot를 지정한 유저 또는 그룹은 SSH를 사용할 수 없다.
- SFTP에서 Chroot를 설정하면, FTP로서의 기능만 하게 된다.

1. Group 사용자 등록
groupadd sftponly
useradd -g sftponly test
usermod -s /bin/false test

// 사용자 계정을 그룹에 등록하는 방법
usermod -g sftponly user1  // sftponly 그룹에 user1 멤버 등록

※ 일반 계정을 추가하고 SSH 접속을 하면 접속이 되어버림
  그러나 sftponly 그룹에 추가하고 SSH 접속을 시도하면 접속이 차단됨.
  SCP 이용하려면 SSH 권한이 되어야 이용이 가능함.


vi /etc/group
// sftponly 그룹을 찾아서 제한할 걸 사용자 계정 추가 (계정 구분은 콤마(,))

※ 그룹 사용자 추가/삭제/변경 방법은 http://link2me.tistory.com/500 참조

2. 사용자 홈 디렉토리 만들기 및 권한 적용
cd /
mkdir -p /home/test
chown root:sftponly /home/test
chmod 0664 /home/test

# 하위 디렉토리를 추가하고 쓰기 권한을 부여한다. (테스트 목적)
cd /home/test
mkdir web             
chown root:sftponly /home/test/web
chmod 664 /home/test/web

※ 일반사용자(Other)와 그룹사용자(group)에게 실행권한이 설정되지 않게 파일은 644 또는 664 로 퍼머션 설정 필요

# 사용자 패스워드 변경
passwd user계정명

# 사용자의 홈디렉토리 확인
cat /etc/passwd
test:x:500:500::/home/test:/bin/bash


3. chroot 설정
- chroot 계정을 격리시킬 디렉토리를 생성한다.

vi /etc/ssh/sshd_config
// 중간에 Subsystem sftp 부분을 # 처리 해준다
// # Subsystem sftp /usr/lib/openssh/sftp-server 처리하면 SSH는 사용 가능, SFTP는 사용불가
// 맨 하단에 아래줄을 추가한다. Match 구분은 sshd_config 파일의 가장 마지막에 존재해야 함
// %h : 사용자의 홈디렉터리를 뜻함
Subsystem sftp internal-sftp

Match Group sftponly
    ChrootDirectory %h
    AllowTCPForwarding no
    X11Forwarding no
    ForceCommand internal-sftp

# SSH 재시작
service sshd restart

※ SFTP chroot 를 사용하려고 user를 추가하면 FTP 접속할 수 있는 계정이 생성되므로
  FTP 사용을 못하게 Port 20, 21 번을 방화벽에서 차단하는 것이 필요

블로그 이미지

Link2Me

,
728x90

호스팅업체에 APM 소스 설치를 해달라고 해서 사용하고 있는데 오늘 XML 파일 출력 테스트를 하는데 계속 문제가 나온다.

왜 그런지 도무지 이해가 안가서 구글링을 열심히 하고서 혹시나 하고 찾아봤더니 MySQL 환경설정 파일이 잘못되었다.


먼저 MYSQL 에서 명령어로 확인을 해본다.


SHOW VARIABLES LIKE 'c%'



이렇게 나온다.

서버와 클라이언트간에 통신을 utf8 로 맞춰서 하도록 해야 하는데 세팅이 그렇게 안되어 있다.


리눅스상에서

MySQL  설치 경로를 찾아야 한다.

# whereis mysql


cd /usr/local/mysql

에 설치된 것을 확인할 수 있다.

이제 해당 디렉토리로 이동한 다음 ls 명령어로 파일을 찾는다.

my.cnf 파일을 찾을 수 있다.


my.cnf 파일에 추가해준다.

[mysqld] 항목 하단에


collation-server=utf8_general_ci
character_set_server=utf8
#collation_server=euckr_korean_ci;
#character_set_server=euckr;

[client]
default-character-set=utf8
#default-character-set=euckr


저장하고 나서 MySQL을 재기동해준다.

# service mysqld restart



이런 메시지가 나오면 my.cnf 파일에 잘못 추가된 내용이 있다는 것이므로 수정해서 다시 재기동을 해봐야 한다.

성공이면 이제 MySQL 상태 정보를 다시 확인해보자..



SHOW VARIABLES LIKE 'c%'


이미 생성된 DATABASE의 문자셋 바꾸기
mysql> SET character_set_client = utf8;
mysql> SET character_set_results = utf8;
mysql> SET character_set_connection = utf8;
mysql> ALTER DATABASE [DB명] DEFAULT CHARACTER SET utf8;


블로그 이미지

Link2Me

,
728x90

PHP 를 매일 일정한 시간에 주기적으로 실행해야 할 경우가 있다.

 

먼저 whereis php 로 PHP의 경로를 알아야 한다.

/usr/bin/php 라면 이걸 적어야 하고

/usr/local/php/bin/php 라면 이걸 적는다.

 

리눅스의 crontab 기능을 이용하여 PHP 파일을 실행하기 위해 알아야 할 사항

1. PHP 코드에 DB 연결하는 파일 정보는 절대경로로 적어야 한다.

    include "/home/httpd/db.info.php";
    include "/home/httpd/dbClass.php";

 

2. PHP 코드 상단에 한줄 적어줄 내용

    !#/usr/local/php/bin/php -q

    <?php

        include "/home/httpd/db.info.php";
        include "/home/httpd/dbClass.php";

 

        PHP 소스코드

     ?>

 

 

※ crontab 에서 직접 PHP 코드를 호출해서 돌리는 경우에는 위와 같이 하면 된다.

   첫줄 !#/usr/local/php/bin/php -q 은 PHP 파일의 절대경로인데

   파일의 위치를 모르면

   리눅스 Shell 상에서 whereis php 로 찾으면 된다.

   그리고 해당 경로로 들어가서 실제 php 파일이 있는 곳을 확인해야 한다.

 

이제 crontab 에 스케쥴할 사항을 등록하자.

 

1. 크론탭 수정하는 방법
    crontab -e

    입력화면에서 입력하려면 i 를 눌러 insert 모드로 변경하고

    스케쥴링할 내용을 적어준다.

    15 23 * * * wget -O - -q -t 1 http://IP주소/xml/web_member.php

    를 붙여넣기 한 다음에 저장하고 나온다.

2. 크론탭 시작
    service crond start

 

이 두가지 사항만 하면 매일같이 정해진 시간(23시 15분)에 실행된다.

 

다른 방법으로 할 경우

shell 스크립트 파일을 작성해서 스크립트 파일을 돌리는 경우에는

shell script

15 23 * * * /home/httpd/xml/cron_member.sh

 

shell script 파일 안에는

echo "Insert and Update member table of MySQL database..."
/usr/local/php/bin/php -f  /home/httpd/xml/cron_member.php

처럼 작성된 코드가 포함되어야 한다.

 

cron_member.php 파일에는

DB 파일의 경로는 절대경로를 반드시 적어줘야 한다.

 

 

shell script 를 만들어서 사용하는 경우

몇가지 처리를 하나의 스크립트에서 해야 할 때 효과적이다.

 

2시 5분에 스크립트가 자동으로 실행된다.

5 2 * * * /usr/local/php/bin/php /usr/local/apache/htdocs/accessLog.php

 

만약 매 5분마다 실행하고 싶다면

*/5 * * * * /usr/local/php/bin/php /usr/local/apache/htdocs/accessLog.php

로 해주면 된다.

블로그 이미지

Link2Me

,
728x90

아파치 로그(Apache Log) 관리법
접속자가 많은 사이트에서는 아파치 로그를 관리하는 것도 만만치 않다.
불필요한 정보는 로그에 쌓이지 않도록 처리하는 것이 중요하다.
로그 파일이 크면 클수록 서버에 필요없는 무리를 주므로 날짜별로 분리하여 로그를 남기자.


아파치 환경설정 파일에서 <IfModule log_config_module> 부분을 찾아서 아래와 같이 수정해준다.


<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    # 그림 이미지, css, js는 기록하지 않게 처리
    SetEnvIfNoCase Request_URI "\.(jpg|png|gif|css|ico|js|swf)$" notloglist

    #CustomLog "logs/access_log" common
    #CustomLog "logs/access_log" combined
    #CustomLog "|/아파치 설치 경로/bin/rotatelogs /로그를 저장할 경로/파일명 %Y%m%d%H 86400 +540" combined
    # 날짜별로 로그기록 남기기
    CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log_%Y%m%d 86400 +540" combined env=!notloglist  
</IfModule>


※ 86400 + 540 : GMT 기준 + 9시간,  한국시간 0시 기준 파일 분할 목적


/usr/local/apache/conf/extra/httpd-vhosts.conf 파일이 같이 동작되는 경우에는

이곳에 적어준다.

즉, httpd.conf 파일 안에

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

라고 되어 있으면 /usr/local/apache/conf/extra/httpd-vhosts.conf 에 적어준다.

virtualhost 에 적어주는 경우에는 access_log_%Y%m%d 보다는 사이트명을 식별할 수 있는 구분자를 넣어주는게 좋다.


블로그 이미지

Link2Me

,
728x90

주기적으로 반복작업이 수행되게 하고 싶은 경우가 있다.

이럴 때 사용하는 것이 crontab 기능이다.

 

crontab 설치 여부 확인

ps -ef | grep cron

 

 

설치되어 있는 것을 확인할 수 있다.

 

크론탭 시작
service crond start


크론탭 중지
service crond stop


크론탭 재시작
service crond restart

# CentOS 7 에서
systemctl restart crond.service

 

현재 설정된 크론탭 확인하는 방법
crontab -l

크론탭 수정하는 방법
crontab -e

 

실행파일 권한 부여
chmod 100 backup.sh

크론탭 설정시 위치별 의미
* * * * *

* * * * *  수행할 명령어
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───────── 요일 (0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일)
│ │ │ └───────── 월 (1 - 12)
│ │ └───────── 일 (1 - 31)
│ └───────── 시 (0 - 23)
└───────── 분 (0 - 59)

예약설정은 분, 시, 일, 월, 요일, 명령어 순으로 설정하면 된다.

 

범위

 1

 분

 0-59

 2

 시

 0-23

 3

 일

 0-31

 4

 월

 1-12

 5

 요일

 0-7(일요일 :0 또는 7, 월요일 :1, 화요일:2 ...)

 6

 명령어

 실행할 명령

 

 

* crontab 등록 예



출처: http://fruitdev.tistory.com/10?category=554679 [과일가게 개발자]


0 1 15 * *  /bin/sh  /usr/local/backup_full.sh   <== chmod 100 으로 권한 미부여시
0 2 * * *  /usr/local/backup_part.sh   <== chmod 100 으로 권한 부여시

# 매 5분마다 실행
*/5 * * * * /root/sh/backup_photo.sh

※ 스크립트가 제대로 동작되지 않아서 구글링으로 확인해보니 /bin/sh 를 넣어주면 되는거 같아서 넣어줬더니 제대로 동작된다.

EditPlus 에서 스크립트 파일을 수정하고 동작여부를 확인했더니 계속 문제를 일으킨다.

명령어를 자세하 봤더니 \r 이 붙어있다.

원래 리눅스상에서 작성해야 하는데 편하게 작업하려고 EditPlus 에서 작성하고 수정했더니 문제를 일으켰다.

리눅스 Shell 상에서 dos2unix backup_part.sh 이런 식으로 해주면 \r 정보가 전부 삭제된다.

EditPlus 에서도 파일형식을 Unix 형식으로 저장하는 옵션이 있더라.

 

유닉스(Unix)/리눅스(Linux)에는, LF (헥사로는 0x0A에 해당) 문자로 줄바꿈을 하고
도스(DOS)/윈도우(Windows)에서는, CR-LF (헥사로는 0x0D 0x0A에 해당) 라는 2문자로 줄바꿈을 하고
맥(Mac)에서는, CR (헥사로는 0x0D 에 해당) 로 줄바꿈한다. "\n" 로 표현한다.

 

 

일정기간이 지난 파일을 삭제하는 방법은 find 명령어를 이용하여 삭제하면 된다.
예제 디렉토리가 "/home/tour/log" 라고 했을때 파일 삭제방법은 다음과 같다.

1. 30일이 지난 파일 삭제
find /home/tour/log -mtime +30 -print -exec rm -f {} \;

2. 10분이 지난 파일 삭제
find /home/tour/log -mmin +10 -print -exec rm -f {} \;

3. 30일이상 err_log 로 시작하고 확장자가 txt 파일인것들만 삭제
find /home/tour/log -mtime +30 -name "err_log*.txt" -print -exec rm -f {} \;

4. 파일 사이즈가 1MB 이상인 파일 삭제(KB로 입력)
find /home/tour/log -size +1024k -print -exec rm -f {} \;

 

# 매시 15분, 45분에 /root/every_30min.sh 를 수행 (하루에 48회[3])
15,45 * * * * /root/every_30min.sh

# 10분마다 /root/every_10min.sh 를 수행 (하루에 144회[4])
*/10 * * * * /root/every_10min.sh

#매일 02:00에/root/backup.sh 를 수행 (하루에 1회)
0 2 * * * /root/backup.sh

# 매 6시간마다 수행(00:30, 06:30, 12:30, 18:30)
30 */6 * * * /root/every_6hours.sh

# 1시부터 매 6시간마다 수행(01:30, 07:30, 13:30, 19:30)
30 1-23/6 * * * /root/every_6hours.sh

# 평일(월요일~금요일) 08:00
0 8 * * 1-5 /root/weekday.sh

# 주말(일요일, 토요일) 08:00
0 8 * * 0,6 /root/weekend.sh
블로그 이미지

Link2Me

,
728x90

홈페이지 접속경로의 디렉토리 정보가 보이는 경우가 있다.

호스팅업체에 설치를 해달라고 했는데도 불구하고 이런 정보를 세팅하지 않아서 생긴 문제점이었다.

리눅스를 소스설치로 설치를 해봤는데 이 경우에도 아래처럼 Indexes는 기본 설정이 되어 있다.



이렇게 디렉토리 정보가 보이는 증상은 왜 그럴까?

httpd.ini 환경설정 파일안에서

DocumentRoot "/usr/local/apache/htdocs"
<Directory "/usr/local/apache/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
    Require all granted
</Directory>


에서 Indexes 를 삭제해줘야 한다.

Indexes 란 해당 디렉토리의 내용과 리스트들을 보여주도록 허용하겠다는 옵션이다.


그러면


로 변경되어 보인다.


그 밖에 설정 참고할 사항으로는

<Directory "/usr/local/apache/htdocs">
    Options IncludesNoExec FollowSymLinks
    AllowOverride None
    <LimitExcept GET POST>
      Order allow,deny
      Allow from all
    </LimitExcept>
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>


<IfModule mime_module>
    AddType application/x-httpd-php .php .phtml .php3 .php4 .inc .do
</IfModule>



AddType application/x-httpd-php .php .phtml .php3 .php4 .inc 역할은

서버 디렉토리에 abc.inc 파일을 직접 접속하면 내용이 보이지 않는다.

하지만 여기에 등록되어 있지 않으면, abc.inc 파일은 다운로드 되거나 정보 내용이 그대로 노출되어 보안에 매우 취약해진다.

확장자를 모르게 하고 싶어 do 확장자로 변경하여 코딩을 하는 사람도 있다.


블로그 이미지

Link2Me

,
728x90

호스팅업체에 가상서버를 새로 할당 요청하여 APM(Apache + PHP + MySQL)을 소스 설치를 요청했다.

PHP는 버전 5.6 이상, MySQL 버전 5.6 이상으로 요청했다.


기존 홈페이지에서 데이터를 백업받아야 한다.

홈페이지가 설치된 폴더를 tar -cvzf backup.tag.gz 폴더명/

으로 압축했고 이 파일을 다운로드 받아서 새로운 서버에 업로드했다.

MySQL DB를 dump 받아서 새로운 DB에 접속해서 업로드했다.


에러가 나면서 접속이 안된다.

도메인 경로가 새로운 서버로 설정되지 않은 것 같아서 도메인을 등록한 호스팅업체에서 무료 DNS 를 설정했다.

그런데도 불구하고 제대로 접속이 안된다.

확인 결과, MySQL 사용자 패스워드를 잘못 입력했다. 변경하고 다시 접속을 시도했더니

화면에 timezone 에러가 발생했다.


php.ini 파일을 찾아서 파일을 열고

찾기(Ctrl + F)로 timezone을 입력하니까 해당 라인으로 이동된다.


date.timezone = "Asia/Seoul"

를 추가했다.


이제 아파치를 재기동해야 한다.

/etc/init.d/apachectl stop

/etc/init.d/apachectl start


아파치 재기동을 해주고 나서 에러메시지가 완전히 사라졌다.


PHP 에서 MySQL 접속방식도 MySQLi 로 접속해야 에러가 발생하지 않고 정상적으로 접속된다.

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/public_html/.../mysql.func.php on line 4


블로그 이미지

Link2Me

,
728x90

OpenSSH 4.8p1 버전부터는 chroot 기능을 자체적으로 지원하기 시작하였다.

호스팅 업체에 문의하니까 내가 사용하는 버전도 SSH chroot 기능이 지원된다고 하여 인터넷 검색하고 직접 테스트하여 설정하는 기능을 적용해봤다.


먼저 설치된 openssh 패키지 검색

# rpm -qa|grep openssh



chroot 설정을 위한 환경설정 파일 수정

# vi /etc/ssh/sshd_config



Match Group과 ChrootDirectory 옵션의 순서가 서로 뒤바뀌지 않도록 한다.

Match Group sshgroup 에서 sshgroup 은 실제 그룹을 뜻한다.

%u 는 로그인한 사용자의 계정을 말한다.


# groupadd sshgroup

# usermod -g sshgroup jsk005

# usermod -s /bin/false jsk005

# usermod -d /home/httpd/jsk005   // 홈디렉토리의 경로명 변경


# /etc/rc.d/init.d/sshd restart  // ssh 데몬 재시작


동작이 제대로 안된다. ㅠㅠ

블로그 이미지

Link2Me

,
728x90

리눅스 이동/이름변경 명령어 mv


리눅스에서 파일을 다른 디렉토리로 이동하거나 다른 이름으로 바꾸고자 할 때 mv 를 사용하면 된다

<기본문법>
mv [옵션] <file1> <file2> <file3> ....<file n> destination

mv [옵션] 원본디렉토리 옮길디렉토리


옵  션

기   능

-b

파일이 지워지기전에 백업파일 만듬

-f

대상파일이 있더라도 파일을 강제로 삭제

-i

대상파일이 있는 경우 덮어쓸 것인가 물어 봄

-r

서브 디렉토리 내에 있는 모든 파일까지 통채로 복사

-u

대상파일보다 원본파일이 새로운 것일 때

-v

파일 옮기기 전의 과정을 보여줌


경로가 동일하면 rename 이 되고

경로가 다르면 파일이 이동된다.


여러개의 파일을 동시에 옮기는 방법

mv filename* /home/test  

해석 : 현재 디렉토리의 filename으로 시작하는 모든 파일을 /home/test 로 옮긴다.


위 그림에서 현재 디렉토리를 확인(pwd)하고 ls 명령어로 어떤 파일과 서브디렉토리가 있는지 확인하고 나서,

mv *.php /home/http/test 로 현재디렉토리(/home/http/test/modules/plan/)에 있는 모든 php 파일을

/home/http/test 디렉토리로 옮기라고 명령했다.

모든 PHP 파일이 옮겨진 것을 확인할 수 있다.


_m* 으로 시작되는 파일을 하위디렉토리 modules/plan/ 으로 옮기라는 것을 실행해보고

경로를 이동하여 실제로 파일이 옮겨진 것을 확인할 수 있다.


mv /home/test/ab* /root/test 

해석 : /home/test/ 디렉토리에 존재하는 ab로 시작하는 모든 파일을 /root/test 디렉토리로 옮긴다.


위 그림에서 보면 디렉토리가 존재하지 않는 곳으로 파일을 옮기려고 했더니 디렉토리가 없다고 출력한다.

그래서 디렉토리가 존재하는 /root 로 파일을 옮기고 나서 확인했다.

파일이 옮겨진 것을 확인할 수 있다. (보안상 보여주면 안되는 사항은 검은색으로 처리함)



mv /home/http/test /home/http/test2

해석 : /home/http/test/ 디렉토리 자체를 /home/http/test2/ 디렉토리로 옮긴다.



파일을 디렉토리째로 다른 것으로 복사하려면 mv 처럼 뒤에 옵션을 붙이지 않는게 아니라 옵션을 붙여야 디렉토리째 복사가 된다.



현재 디렉토리 하위 디렉토리(plan/)의 전부를 /home/http/test/ 디렉토리로 옮겨봤다.

옮기고 나서 경로를 이동하여 옮겨진 것을 확인했다.

블로그 이미지

Link2Me

,
728x90

리눅스에서 운영중인 MySQL 버전을 확인하는 방법이다.


MySQL 로 접속해서 들어가서 select version; 이라고 입력하면 현재 운영중인 버전 정보가 출력된다.



블로그 이미지

Link2Me

,

파일의 날짜 변경

리눅스 2015. 4. 18. 00:22
728x90


touch는 파일의 날짜시간정보를 변경하는 명령어이다.


현재시간으로 파일 날짜정보 변경
# touch -c newfile


파일의 날짜정보를 마음대로 변경
# touch -t 201504081200 filename    // YYYYMMDDhhmm 형식


지정한 파일의 날짜시간정보를 지정한 다른 파일의 날짜시간정보와 동일하게 변경
# touch -r oldfile newfile    // newfile을 oldfile의 날짜정보와 같게 변경



블로그 이미지

Link2Me

,
728x90

리눅스 SSH 보안 설정(일반유저의 ssh 접속 제한 설정)


보안설정을 하기 위해서는 먼저

#cat /etc/passwd

를 이용하여 등록된 사용자 현황을 파악한다.

파일의 내용 마지막에 숫자 500:500 등이 나오면 그 부분이 바로 User를 추가한 부분이다.

User 는 500 번 이후부터 추가된다. 유분투는 1000번 이후부터 추가된다고 한다.


등록된 사용자가 많으면 SSH 에서 AllowGroups 로 설정하는게 좋고, 등록된 사용자가 적으면 AllowUsers 를 이용하여 등록하는게 좋다.


이제 VI 에디터로 sshd_config 로 직접 접속하여 환경설정값을 변경해준다.

원하는 것이 어디있는지 빨리 찾으려면 VI 에디터에서

/ 를 누른 다음 찾으려는 문자열을 입력하고 엔터키를 친다.

연속으로 찾으려면 n 을 입력. 역방향으로 찾으려면 N 을 입력. (리눅스에서는 대문자, 소문자를 식별함)

수정하려면 i 를 누르면 INSERT 모드로 변경되며, 화살표키와 역방향화살표키(보통 엔터키 위에 있음)를 눌러서 글자를 수정해서 변경하고 나서 ESC키를 누르면 원래 상태로 되돌아온다.

저장하고 나오는 것은 :wq


# vi /etc/ssh/sshd_config    // 설정파일 수정
Port 22    // 포트 변경을 하고 싶다면 포트번호1023 까지는 예약된 포트이므로 그 이후 값을 사용해야 함
IgnoreRhosts yes    // rhosts 를 무시
PermitRootLogin no    // ssh 접속시 root 로 로그인 금지

ClientAliveInterval 600   // 기본 0 보내지않음. 10분간격으로 클라이언트로 메시지를 보내고 응답
ClientAliveCountMax 3  // 클라이언트에서 응답이 없을 때 메시지를 보내는 횟수
#AllowGroups comnetlink    // comnetlink 그룹만 ssh 에 로그인 가능

AllowUsers user1 user2    // 등록한 user 만 접속 허용하고, user 등록 구분은 스페이스바로 구분하여 등록

                                  ※ AllowGroups 과 AllowUsers 는 둘 중에 하나를 선택해서 사용


* 접속제한 방법
AllowGroups : 등록된 group만 접속 가능
AllowUsers : 등록된 계정만 접속 가능
DenyGroups : 모두 접속 허용하고 등록된 group만 접속 거부
DenyUsers : 모두 접속 허용하고 등록된 계정만 접속 거부

# /etc/init.d/sshd restart       // ssh 데몬 재시작


를 해주면 환경설정 값이 변경 적용된다.





블로그 이미지

Link2Me

,
728x90

리눅스 root 권한으로 SSH 로그인 불가 처리


작업할 때는 반드시 SSH root 권한으로 접속했던 창을 띄워둔 상태에서 아래 명령어로 작업을 한 다음

새로운 창을 띄워서 제대로 동작하는지 체크하는 것이 매우 중요하다.


작업한 환경 : Cent OS 6.5


SSH 로그인 차단 설정

# vim /etc/ssh/sshd_config

42번째 줄 # PermitRootLogin yes 라고 되어 있는 걸

앞에 주석(#)을 없애고 PermitRootLogin no   변경

마지막 줄에 아래 추가

Allowusers jsk005  <-- jsk005 계정 사용자만 접속 허용 설정

:wq

로 저장하고 나옴

 

# SSH 재시작
service sshd restart



FTP chroot (홈 디렉토리 상위 접속 불가 설정)을 하고 SSH 접속 제한을 걸면 보안의 안정도가 높아진다.


아래 사항은 다른 방법이므로 참고적으로 알아두면 좋다.


특정 유저(wheel그룹)만 su 허락함

# vim /etc/group


wheel:x:10: 로 된 부분을 wheel:x:10:root,특정사용자

로 변경하고 :wq 로 저장하고 나옴


# chgrp wheel /bin/su   

# chmod 4750 /bin/su

# ls -la /bin/su 



# /etc/rc.d/init.d/sshd restart


이렇게 한 후 SSH 로 root 로 접속해보고 접속 불가 상태가 계속 나오면 작업은 성공할 것임

그리고 특정사용자 계정으로 접속하여 su 로 root 패스워드 입력하고 접속 성공하면 접속이 정상적으로 처리된 것임


블로그 이미지

Link2Me

,
728x90

리눅스에서 파일 내용을 검색하려면 어떻게 해야 할까?

파일 전부를 내려받아서 Eclipse 나 Total Commander 를 이용하여 검색한다는 것도 매우 불편한 짓이다.

 

리눅스 자체 명령어를 이용하여 파일 내용을 검색할 수가 있다.

먼저, 검색하고자 하는 디렉토리로 이동한다. 하위폴더를 포함하여 전체를 다 찾을 수 있다.

grep : 파일 내에서 또는 입력값에서부터 특정 패턴을 검색한다.

- v : 일치되는 내용이 없는 라인을 표시한다.

- c : 일치되는 내용이 있는 행의 개수를 표시한다.

- l : 일치되는 내용이 있는 파일의 이름만을 표시한다.

- h : 일치되는 내용을 찾은 파일의 이름을 표시하지 않는다.

- n : 일치되는 내용이 있는 행은 행번호와 함께 표시된다.

 

# grep -r "찾을 문자열" ./*

 

 

검색할 디렉토리에서 찾을 내용이 포함된 모든 파일명과 해당 검색어가 어떤 라인에 있는지 찾을 때

# grep -rn "찾을문자열"

# grep -rn letterMasking

 

파이프프로그램의 실행결과를 다른 프로그램의 입력으로 연결한다.

이렇게 둘 이상의 명령을 함께 사용하고, 한 명령어의 출력결과를 다른 명령어의 입력으로 전환하는 것을 파이프라 한다.

 

또다른 방법은

find [경로] -name "파일명" | xargs grep "찾을 문자열"

# find ./ -name "*.php" | xargs grep "getKRtoUTF"

로 찾을 수 있다.

 

검색어로 사용된 문자열 색을 달리 표시하고 싶다면

# find ./ -name "*.php" | xargs grep --color=auto "getKRtoUTF"

 

 

 

찾을 문자열이 포함된 파일명만 보고 싶다면

# find ./ -name "*.php" | xargs grep -l "getKRtoUTF"

 

 

내가 가장 보기 좋게 원하는 것은 파일명만 보이도록 찾는 것이다.

 

리다이렉션

리다이렉션을 이용하면 명령의 출력을 변경할 수 있다.기본적으로 명령어의 결과는 모니터에 출력된다. 하지만 리다이렉션을 이용하여 파일에 기록할 수 있다.명령어 > 파일 : 파일이 없다면 생성하고, 있다면 기존의 내용을 지운다.명령어 >> 파일 : 파일이 없다면 생성하고, 있다면 기존의 내용에 추가한다.명령어 < 파일 : 파일에서 표준입력 받는다.

 

블로그 이미지

Link2Me

,
728x90

포트 상태 점검 명령어


포트 상태 점검 명령어


# netstate -nlp


포트 상태를 주기적으로 체크하여 해킹이 의심되는 것이 있는지 확인해볼 필요가 있다.


블로그 이미지

Link2Me

,