使用java sftp: jsch
因為資安的關係,原本的 FTP 要改成 SFTP,本來想用 delphi 寫的,但是偏偏只有
EldoS Corporation 這家公司
的
SFTPBlackbox 元件有提供 sftp 的元件,而且是要付費的,殘念...
,轉向 java 搜尋,找到了 jsch (網站 http://www.jcraft.com/jsch/ )這個純 java 的 sftp 函式庫。
,轉向 java 搜尋,找到了 jsch (網站 http://www.jcraft.com/jsch/ )這個純 java 的 sftp 函式庫。
JSch 介紹 :
1.該函式庫需使用 Java Cryptography Extension (JCE) ,可以到 sun 的網站自行下載(
http://java.sun.com/products/jce/)
sun JDK 1.4.2 以上版本已內含 JCE,所以建議你的 jdk 最好是 1.4.2 以上版本 ^^
2.若還有需要用到資料傳送後壓縮功能,那你還必需
JZlib 可以到以下網站下載(
http://www.jcraft.com/jzlib/)
JSch 提使 sftp,ssh,ssh2 ,算是相當的完整,在 example 目錄下有一些範例可供參考。以下是使用 sftp 的範例: ,將 server 上 /mydata 目錄下的
檔案(不包含目錄)全部下載到 c:/temp 目錄下
try{
String ini_local_path,ini_local_path = "c://temp"; //下載到本機 c:/temp 目錄
String ini_server_path = "/mydata"; // 從伺服器 /mydata 目錄開始下載
String userid = "userid"; //帳號
String ini_server_path = "/mydata"; // 從伺服器 /mydata 目錄開始下載
String userid = "userid"; //帳號
String passwd = "passwd";
String sftp_ip = "127.0.0.1"; // ip
int port = 22; // port
JSch jsch=new JSch();
Session session =jsch.getSession(usrid,sftp_ip,port);
session.setPassword(passwd);
java.util.Properties config=new java.util.Properties();
config.put("StrictHostKeyChecking", "no"); //不驗証 HostKey
session.setConfig(config);
session.connect();
Channel channel=session.openChannel("sftp");
Channel channel=session.openChannel("sftp");
channel.connect();
ChannelSftp c=(ChannelSftp)channel;
c.cd(ini_server_path);
ChannelSftp c=(ChannelSftp)channel;
c.cd(ini_server_path);
Vector vt = c.ls(ini_server_path);
if (vt!=null){
for(int i=0;i<vt.size();i++){
if (vt!=null){
for(int i=0;i<vt.size();i++){
Object obj=vt.elementAt(i);
if(obj instanceof com.jcraft.jsch.ChannelSftp.LsEntry){
SftpATTRS arr = ((com.jcraft.jsch.ChannelSftp.LsEntry)obj).getAttrs();
String fileName = ((com.jcraft.jsch.ChannelSftp.LsEntry )obj).getFilename();
if (!fileName.equals("..") && !fileName.equals(".")) { //檔案名稱 . 和 .. 不做處理
if (!arr.isDir()){ //不是目錄才處理
c.get(ini_server_path + "/" + fileName ,ini_local_path + File.separator+ fileName );
}
}
arr = null;
}
obj = null;
}
}
String fileName = ((com.jcraft.jsch.ChannelSftp.LsEntry )obj).getFilename();
if (!fileName.equals("..") && !fileName.equals(".")) { //檔案名稱 . 和 .. 不做處理
if (!arr.isDir()){ //不是目錄才處理
c.get(ini_server_path + "/" + fileName ,ini_local_path + File.separator+ fileName );
}
}
arr = null;
}
obj = null;
}
}
c.quit();
c.exit();
session.disconnect();
}catch(Exception e){
e.printStackTrace();
}
c.exit();
session.disconnect();
}catch(Exception e){
e.printStackTrace();
}