제큐리티
쉘 스크립트 바이너리로 변환 후 자동화 본문

#!/bin/sh : 스크립트 실행시킬 쉘
SERVER="ftp서버IP"
PORT="21" //ftp세션 연결 포트가 21번이기 때문
USER="ftp서버의 사용자ID"
PWD="ftp서버 사용자의 비밀번호"
#FILE_NAME="원하는 파일의 이름"
DOWN_DIR="ftp서버에서 원하는 파일이 있는 경로"
LOCAL_DIR="다운 받을 경로"
ftp -in $SERVER $PORT << sess
(ftp는 interactive기 때문에 복수의 파일을 전송 중에 대화형 묻기 기능을 사용함)
ex) yum으로 설치할 때 y 눌러주는 것과 같음
여기서는 -i, n 옵션만 주어 interactive를 사용하지 않고 초기 연결 시 자동 로그인을 생략
또한 << 뒤는 세션의 시작을 나타내므로 아무 이름으로 써도 무방
| 옵션 | 설명 |
| -v | 원격 서버 응답 표시하지 않음 |
| -n | 초기 연결 시 자동 로그인 생략 |
| -i | 복수 파일 전송 중에 대화형 묻기 기능 사용하지 않음 |
| -d | 디버깅 사용 |
| -g | 파일 이름에 와일드카드 사용하지 않음 |
| -s:filename | ftp 명령이 들어 있는 텍스트 파일 지정(ftp가 시작된 후에 자동으로 실행) |
| -a | 데이터 연결을 바인딩할 때 로컬 인터페이스 사용 |
| -A | 익명으로 로그인 |
| -x:send sockbuf | 기본 SO_SNDBUF 크기인 8192 재정의 |
| -r:recv sockbuf | 기본 SO_RCVBUF 크기인 8192 재정의 |
| -b:async count | 기본 비동기 개수인 3 재정의 |
| -w:windowsize | 기본 전송 버퍼 크기인 65535 재정의 |
| host | 연결할 원격 호스트의 호스트 이름 또는 IP주소 지정 |
user $USER $PWD //ftp로그인 과정
(아래의 FileZilla에서 사용자명, 비밀번호 넣는 란이라고 생각하면 됨)

bin //바이너리전송 모드
| 전송 모드 | 설명 |
| ASCII | 일반적인 텍스트 문서 전송 |
| Binary | 그림이나 실행파일 등 모든 형식 파일 지원 |
#prompt // ftp 연결할 때 -i 옵션을 주지 않았다면 interactive모드를 끄기 위해 삽입해주어야 함
#get $FILE_NAME //파일이 1개일 때 get으로 받음
mget *.log // log로 끝나는 파일을 여러개 받음
bye //ftp 종료
sess //세션 종료
시행착오
1. 파일을 받을 서버에 ftp client가 설치되어 있어야함
- yum -y install ftp
2. ftp:connect: Connection refused오류
- ftp서버에서 ftp 서비스가 구동 중인지 확인(ps -ef | grep vsftpd, systemctl status vsftpd)
- ftp 서비스가 구동 중이지만 ftp 연결되지 않으면
- ftp서버의 ftp 포트 확인(21번 포트 사용하지 않으면 오류 발생)
- 21번 포트를 사용하는데도 오류가 발생한다면 현재 연결을 시도하는 서버의 /etc/services파일에 ftp 항목 확인
(ftp값이 기본 21번으로 설정되어 있지 않은 경우 외부 연결할 때도 포트 명시해주어야 함)
스크립트에 대한 설명은 끝났고 스크립트를 바이너리로 변환 후 자동화
1. shc 압축 파일 다운
wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
2. 파일 압축 해제
tar -xf shc-3.8.9b.tgz
3. 설치파일(setup) 설치
make install
4. 스크립트 파일 바이너리로 변환
shc -f "스크립트가 있는 경로"

경로에 이렇게 파일이 생김
(원래는 ftp.sh.x 생성되지만 가독성을 위해 ftp로 이름 바꿔줌 - mv ftp.sh.x ftp)
5. crontab -e로 자동화 주기 설정
| 명령어 | 설명 |
| crontab -e | 명령을 등록, 편집 |
| crontab -d | 등록된 명령 삭제 |
| crontab -l | 현재 등록된 리스트 출력 |
| crontab -l -u otheruser | otheruser 사용자가 등록한 crontab 리스트 출력 |
| crontab -r | 현재 사용자가 등록한 crontab 전체 삭제 |
| 주기 | 명령어 |
| 매분 실행 | * * * * * /root/ftp |
| 특정 시간 실행 | 45 5 * * 5 /root/ftp 매주 금요일 오전 5시 45분에 실행 |
| 반복 실행 | 0,20,40 * * * * /root/ftp 매일 매시간 0분, 20분, 40분에 실행 |
| 범위 실행 | 0-30 1 * * * /root/ftp 매일 1시 0분부터 30분까지 매분 실행 |
| 간격 실행 | */10 * * * * /root/ftp 매 10분마다 실행 |

분(0-59) 시(0-23) 일(1-31) 월(1-12) 요일(0-6) 스크립트 경로
>& /dev/null //명령어를 실행 후 출력은 백그라운드로, 출력이 필요 없으므로 /dev/null로 전송
6. crond 재시작(변경 후 반드시 cron 다시 실행)
service crond restart
7. 전송 확인
