2012-10-31
java Framework/jsp 프로그래밍/common.net을 이용한 FTP client 프로그램
소스영역 :::
/**
* 참조 사이트 목록
* http://www.okjsp.pe.kr/seq/51685
* http://benelog.springnote.com/pages/1468338
* 참조해서 작업 해 본것임.
* apache 의 common.net api 사용
* ftp batch 작업을 위한 용도
* 2009.03.26
* 인자 : -H:server ip, -P:server port, -UI:user id, -UP:user pw, -PM:passive-mode
*/
package net.nchannel.ftp;
/**
* @author snipper
*
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
//import org.apache.commons.net.ftp.FTPListParseEngine;
//import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
public class FCBatch {
// protected static final Log logger = LogFactory.getLog(FCBatch.class);
/**
*
*/
public FCBatch() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 인자는 -H, -P, -ui, -up, -path, -pm 이 존재
String host = "";
String port = "";
String id = "";
String pw = "";
String rpath = "";
String pm = "";
String fileNm = ""; //"JeusServer_"+getDate(-1)+".log"; //현재 이전 날짜의 파일 가져오기 위한 파일명 구하기
String lpath = ""; //"d:\\jeuslogs\\JeusServer_"+getDate(-1)+".log"; //현재 이전 날짜의 파일 가져오기 위한 파일명 구하기
FileOutputStream fos = null;
// System.out.println("입력 인자 수 : " + args.length);
// System.out.println("파일 명 : " + fileNm);
// 입력된 인자 값을 각 의미 변수에 할당.
for(int i=0; i < args.length; i++) {
if(args[i].indexOf("-H")!=-1)
host = args[i].substring(2);
if(args[i].indexOf("-P")!=-1)
port = args[i].substring(2);
if(args[i].indexOf("-UI")!=-1)
id = args[i].substring(3);
if(args[i].indexOf("-UP")!=-1)
pw = args[i].substring(3);
if(args[i].indexOf("-RP")!=-1)
rpath = args[i].substring(3);
if(args[i].indexOf("-LP")!=-1)
lpath = args[i].substring(3);
if(args[i].indexOf("-FN")!=-1)
fileNm = args[i].substring(3);
if(args[i].indexOf("-PM")!=-1)
pm = args[i].substring(3);
}
if(port.equals("")) port = "21"; //접속 포트 번호, 기본 21번 포트 사용
if(rpath.equals("")) rpath = "/home/tmax/jeus5/logs/ECOWEB/"; //원격 기본 디렉토리 설정, 제우스를 기본으로 했음.
if(lpath.equals("")) lpath = "c:\\jeuslogs\\"; //로컬 기본 디렉토리 설정, 로컬 디렉토리가 없을 경우.... 현재 폴더로 해도 되나 그냥 위와 같이 함.
if(fileNm.equals("")) fileNm = "JeusServer_"+getDate(-1)+".log"; //가져올 기본 파일명 설정
if(pm.equals("")) pm = "Y"; // 패시브모드 on(기본모드)
// System.out.println("host = " + host);
// System.out.println("port = " + port);
// System.out.println("id = " + id);
// System.out.println("pw = " + pw);
// System.out.println("remote path = " + rpath);
// System.out.println("local path = " + lpath);
// System.out.println("file name = " + fileNm);
// System.out.println("passive mode y/n = " + pm);
FTPClient ftp = null;
try {
ftp = new FTPClient();
ftp.setControlEncoding("euc-kr"); // ftp 인코딩을 EUC-KR 로 설정.
// if(logger.isDebugEnabled()) {
System.out.println("FTP Client Test Progrma with Commons NET");
System.out.println("test by 2009.03.26");
System.out.println("FCBatch main() start");
// System.out.println("host = " + host);
// System.out.println("port = " + port);
// System.out.println("id = " + id);
// System.out.println("pw = " + pw);
// System.out.println("remote path = " + rpath);
// System.out.println("passive mode y/n = " + pm);
// }
//
if(!host.equals("") && !port.equals("") && !id.equals("") && !pw.equals("")) {
// ftp 연결
ftp.connect(host,Integer.parseInt(port));
// if(logger.isDebugEnabled()) {
System.out.println("connected to " + host +":"+port);
// }
// if(logger.isDebugEnabled()) {
System.out.println("login by user id : " + id +", password :"+pw);
System.out.println("ftp.login()");
// }
ftp.login(id, pw);
// if(logger.isDebugEnabled()) {
System.out.println("login success...");
// }
// 패시브 모드 설정 하기
if(pm.endsWith("Y")) {
// if(logger.isDebugEnabled()){
System.out.println("passive mode 설정");
System.out.println("passive mode 입력 값: " +pm);
// }
ftp.enterLocalPassiveMode();
// if(logger.isDebugEnabled()){
System.out.println("passive mode 설정 완료");
// }
}
//change directory
// if(logger.isDebugEnabled()) {
System.out.println("change directory : " + rpath );
System.out.println("ftp.changeWorkingDirectory("+rpath+")");
// }
ftp.changeWorkingDirectory(rpath);
// if(logger.isDebugEnabled()) {
System.out.println("경로 변경 : " + rpath);
// }
// if(logger.isDebugEnabled()) {
System.out.println("파일 전송 타입 설정 : setFileType" );
System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
// }
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// if(logger.isDebugEnabled()) {
System.out.println("파일 전송 타입 설정 완료 " );
// }
// ftp 사이트 리스팅.
// ftpList(ftp, path);
/*
try{
// if(logger.isDebugEnabled()) {
System.out.println("서버 디렉토리 리스팅 : " );
System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
// }
FTPListParseEngine engine = ftp.initiateListParsing("unix",path);
System.out.println("" + StringUtils.rightPad("Name", 30) + StringUtils.leftPad("Size", 10) + " ");
System.out.println("" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10,"-") + "-");
int idx=0;
while(engine.hasNext()) {
FTPFile[] files = engine.getNext(25);
idx += files.length;
for(int i=0; i < files.length; i++) {
FTPFile file= files[i];
System.out.println(StringUtils.rightPad(" "+file.getName(),30) + StringUtils.leftPad(""+file.getSize(), 10) + " ");
}
}
System.out.println("-" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10, "-") + "-");
System.out.println(" total : " + idx);
System.out.println(" ");
// if(logger.isDebugEnabled()) {
System.out.println("서버 디렉토리 리스팅 : " + path + "완료" );
// }
} catch (Exception e) {
System.out.println("ftp 리스팅 실패");
e.printStackTrace();
System.exit(-1);
}
*/
// 파일 내려 받기 ??
try {
fos = new FileOutputStream(lpath+fileNm);
ftp.retrieveFile(fileNm, fos);
} catch(IOException e) {
System.out.println("IO Exception : " + e.getMessage());
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
System.out.println("IO Exception : " + e.getMessage());
}
}
}
System.out.println(fileNm + "파일 다운로드 완료 !!!");
} else { // host, port, id, pw 없으면 에러 발생.
System.out.println("usage : FCBatch -Hhost -P[port] -UIid -UPpw -RP[remote path] -LP[local path] -FN[file name] -PM[passive mode] ");
System.out.println("options ");
System.out.println("-H : Host [Name | IP] ");
System.out.println("-P : 접속할 포트 번호 , Default : 21 ");
System.out.println("-UI : User ID ");
System.out.println("-UP : User Password");
System.out.println("-RP : FTP Server Path, Default : /home/tmax/jeus5/logs/ECOWEB/");
System.out.println("-LP : Localhost Path, Default : c:\\jeuslogs\\");
System.out.println("-FN : Download 할 File Name , Default : JeusServer_"+getDate(-1)+".log ");
System.out.println("-PM : Passive Mode 사용 여부 [Y/N], Default: Y ");
// throw new Exception("접속에 필요한 필수 정보를 입력하지 않으셨습니다.");
}
} catch (Exception e) {
// System.out.println("ftp 로그인 실패");
e.printStackTrace();
} finally {
// ftp 연결 해제.
// System.out.println("ftp 연결해제");
if(ftp != null && ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException e) {
System.out.println("IOException : " + e.getMessage());
}
}
// 프로그램 종료
System.exit(-1); // 종료
}
}
/*
public static void ftpList(FTPClient ftp, String path) {
try{
if(logger.isDebugEnabled()) {
System.out.println("서버 디렉토리 리스팅 : " );
System.out.println("ftp.setFileType(FTP.BINARY_FILE_TYPE)");
}
FTPListParseEngine engine = ftp.initiateListParsing("unix",path);
System.out.println("" + StringUtils.rightPad("Name", 30) + StringUtils.leftPad("Size", 10) + " ");
System.out.println("" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10,"-") + "-");
int idx=0;
while(engine.hasNext()) {
FTPFile[] files = engine.getNext(25);
idx += files.length;
for(int i=0; i < files.length; i++) {
FTPFile file= files[i];
System.out.println(StringUtils.rightPad(" "+file.getName(),30) + StringUtils.leftPad(""+file.getSize(), 10) + " ");
}
}
System.out.println("-" + StringUtils.leftPad("-", 30, "-") + StringUtils.leftPad("-", 10, "-") + "-");
System.out.println(" total : " + idx);
System.out.println();
if(logger.isDebugEnabled()) {
System.out.println("서버 디렉토리 리스팅 : " + path + "완료" );
}
} catch (Exception e) {
System.out.println("ftp 리스팅 실패");
e.printStackTrace();
System.exit(-1);
}
}
*/
/**
*
* @param day
* @return
*/
public static String getDate(int day){
Calendar temp = Calendar.getInstance();
StringBuffer sDate = new StringBuffer();
temp.add(Calendar.DAY_OF_MONTH, -1);
int iYY = temp.get(Calendar.YEAR);
int iMM = temp.get(Calendar.MONTH)+1;
int iDD = temp.get(Calendar.DAY_OF_MONTH);
sDate.append(iYY);
if(iMM <10)
sDate.append("0");
sDate.append(iMM);
if(iDD < 10)
sDate.append("0");
sDate.append(iDD);
return sDate.toString();
}
}
라벨:
자바,
프로그래밍,
common.net,
ftp,
java,
programing
2012-10-22
2012-10-06
[DBMS/MySQL/FreeBSD]proftp와_mysql연동하기
이글은 www.godisgreen.com/wikix/index.php 에서 인용한 글을 기초로 작성된것입니다.
OS : FreeBSD 5.3R
System : intel P3-850 dual
Memory : 512M
HDD : Ultra SCSI 9G*2
FreeBSD(이 하 프비)5.3R의 설치가 되었다고 가정하고 시작합니다.
데몬이나 어플리케이션의 설치는 PORTS 설치를 기본으로 합니다.
Proftp설치
1.proftp를 설치합니다.
# cd /usr/ports/ftp/proftpd-mysql
=> 포트 디렉토리에 보면 proftp와 proftp-mysql이 있습니다. 저는 proftp-mysql을 기준으로 설명합니다.
# make install
(만 약 proftpd에서 설치시
make install clean WITH_MYSQL
과 같이 WITH_MYSQL 옵션을 줘야 한답니다.)
MYSQL설치
2. mysql을 설치합니다.
# cd /usr/ports/databases/mysql40-server
--> mysql 버전이 5.x 가 있지만 proftpd포트 설치시 mysql4.x 클라이언트
를 설치하므로 버전을 맞추기 위해 4.x 를 설치하기로 합니다.
# make install clean WITH_CHARSET=euc_kr BUILD_OPTIMIZED=yes
(
mysql41-server 의 경우 WITH_CHARSET옵션의 값이 euckr로 변경됨.
mysql 4.1버전의 경우
# make install clean WITH_CHARSET=euckr BUILD_OPTIMIZED=yes
)
# /usr/local/bin/mysql_install_db
==> 처음으로 mysql을 사용하기 전에 시스템 DB를 만들기 위한 스크립트를
실행합니다.
위 명령은 mysql을 설치한 후 반드시 한번만 하시기 바랍니다.
3. 설치 확인 작업
# /usr/local/bin : mysql바이너리 파일들이 있나 확인
# /usr/local/etc/rc.d/mysql-server.sh : mysql 기동 스크립트
# /var/db/mysql : mysql 데이터베이스 파일
4. 데몬 시작및 중지하기
4.1. 시작하기
# /usr/local/etc/rc.d/mysql-server.sh start 혹은
/usr/local/bin/mysqld_safe -user=mysql &
4.2 중지하기
# /usr/local/etc/rc.d/mysql-server.sh stop 혹은
/usr/local/bin/mysqladmin -u root shutdown
5. mysql 데이터베이스를 사용하기 전에
반드시 루트 암호를 생성하고 사용하시기 바랍니다.
#/usr/local/bin/mysqladmin -u root password '새로운 비밀번호'
#/usr/local/bin/mysqladmin -u root -h 호스트명 password '새로운 비밀번호'
6. 데이터베이스 사용하기
#/usr/local/bin/mysql -u root -p
password :
** 만약 위와같이 작업시 에러발생하는 경우
5번 작업시 에러발생시에는
1. 우선 mysql서버 데몬을 죽인다.
# kill mysql_pid 혹은
/usr/local/etc/rc.d/mysql-server.sh stop
2. /usr/local/etc/rc.d/mysql-server.sh 파일을 편집해서
========================
편 집내용.
/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} --language=korean > /dev/null &
를 다음과 같이 수정합니다 .
/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} --language=korean --skip-grant > /dev/null &
========================
3. mysql서버 데몬을 다시 시작한다.
# /usr/local/etc/rc.d/mysql-server.sh start
4. 위와같이 하면 권한 테이블을 사용하고 데몬을 띄우게 됩니다.
5. mysql에 접속하여
# /usr/local/bin/mysql -u root -p
6. root의 암호를 변경합니다.
mysql> use mysql;
mysql> select * from user where user = 'root';
mysql> update user SET password = PASSWORD('newpassword');
7. 권한 테이블을 다시 읽는다.
mysql> flush privileges;
8. mysql을 종료
mysql> \q
9. mysql 서버 데몬 죽입니다.
#/usr/local/etc/rc.d/mysql-server.sh stop
10./usr/local/etc/rc.d/mysql-server.sh 파일을 편집해서
========================
편집내용.
/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} -language=korean --skip-grant > /dev/null &
를 다음과 같이 수정합니다 .
/usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR}
--pid-file=${PIDFILE} -language=korean > /dev/null &
========================
다 시 원상복귀 합니다.
11. mysql 서버를 다시 시작합니다.
#/usr/local/etc/rc.d/mysql-server.sh start
12. 정상적으로 mysql을 사용가능합니다.
proftpd 를 위한 mysql설정하기
1.mysql설정을 한뒤 'proftp'데이터베이스 생성합니다.
#/usr/local/bin/mysqladmin -u proftp -p create proftp
==> 왠일인지 mysqladmin 이 mysql서버에 접근을 못하게 되어있다. 그래서 직접 mysql로 서버에 접속을 한다음 쿼리문장으로 처리
1.1 db유저 생성
1.1.1 db테이블에 proftp사용자 등록
mysql> insert into db values('%', 'proftp', 'proftp', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');
1.1.2 user테이블에 proftp사용자의 권한 추가
mysql>INSERT INTO user VALUES('localhost','proftp',PASSWORD('proftpdeamon'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0');
mysql>INSERT INTO user VALUES('lnx68.thesoft.co.kr','proftp',PASSWORD('proftpdeamon'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0');
mysql>INSERT INTO user VALUES('%','proftp',PASSWORD('proftpdeamon'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0');
mysql>INSERT INTO host VALUES('localhost','proftp','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql>INSERT INTO host VALUES('lnx68.thesoft.co.kr','proftp','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
1.1.3 proftp DB생성
mysql> create database proftp;
mysql> flush privileges;
2. DB생성 후에 테이블 구조를 해당 DB(proftp DB)에 만들어 줍니다.
##테이블 groups
##################
# 테이블 groups
##################
Create Table groups(
gname varchar(12) NOT NULL default ''
, gid int(10) unsigned default NULL
, members text
, primary key (gname)
) TYPE=MyISAM;
##################
# 테이블 users
##################
Create Table users(
userid varchar(12) NOT NULL default ''
, uid int(10) unsigned NOT NULL auto_increment
, gid int(10) unsigned default '1000'
, passwd varchar(63) default NULL
, shell varchar(255) default '/bin/sh'
, homedir varcahr(255) default '/home/data'
, count int(10) unsigned NOT NULL default '1'
, valid int(10) unsigned default '0'
, email varchar(50) default NULL
, name varchar(30) binary NOT NULL default ''
, reg_date datetime default NULL
, ip varchar(17) default NULL
, primary key(userid)
, key uid_primary(uid)
, key index_name(name)
) TYPE=MyISAM;
** mysql은 탭을 구분하지 못하므로 스페이스로 구분하여 입력하기 바랍니다.
피드 구독하기:
글 (Atom)