JAVA實現SFTP檔案上傳和下載(利用JSCH.jar)
原文連結:https://my.oschina.net/hetiangui/blog/137357
如果你想用純JAVA實現SFTP檔案上傳或下載,或者是想純JAVA連線到SSH2伺服器上執行命令,那就使用JSch.jar包吧。這裡我們先描述實現SFTP協議的上傳和下載,上程式碼和詳細的程式碼註釋:
/**
* 利用JSch包實現SFTP下載、上傳檔案* @param ip 主機IP
* @param user 主機登陸使用者名稱
* @param psw 主機登陸密碼
* @param port 主機ssh2登陸埠,如果取預設值,傳-1
*/
public static void sshSftp(String ip, String user, String psw ,int port) throws Exception{
Session session = null;
Channel channel = null;
[java] view plain copy
JSch jsch = new JSch();
if(port <=0){
//連線伺服器,採用預設埠
session = jsch.getSession(user, ip);
}else{
//採用指定的埠連線伺服器
session = jsch.getSession(user, ip ,port);
}
//如果伺服器連線不上,則丟擲異常
if (session == null) {
throw new Exception("session is null");
}
//設定登陸主機的密碼
session.setPassword(psw);//設定密碼
//設定第一次登陸的時候提示,可選值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
//設定登陸超時時間
session.connect(30000);
try {
//建立sftp通訊通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//進入伺服器指定的資料夾
sftp.cd("domains");
//列出伺服器指定的檔案列表
Vector v = sftp.ls("*.txt");
for(int i=0;i<v.size();i++){
System.out.println(v.get(i));
}
//以下程式碼實現從本地上傳一個檔案到伺服器,如果要實現下載,對換以下流就可以了
OutputStream outstream = sftp.put("1.txt");
InputStream instream = new FileInputStream(new File("c:/print.txt"));
byte b[] = new byte[1024];
int n;
while ((n = instream.read(b)) != -1) {
outstream.write(b, 0, n);
}
outstream.flush();
outstream.close();
instream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.disconnect();
channel.disconnect();
}
/**
* 利用JSch包實現SFTP下載、上傳檔案
* @param ip 主機IP
* @param user 主機登陸使用者名稱
* @param psw 主機登陸密碼
* @param port 主機ssh2登陸埠,如果取預設值(預設值22),傳-1
* @param privateKey 金鑰檔案路徑
* @param passphrase 金鑰的密碼
*
*/
public static void sshSftp(String ip, String user, String psw
,int port ,String privateKey ,String passphrase) throws Exception{
Session session = null;
Channel channel = null;
JSch jsch = new JSch();
//設定金鑰和密碼
if (privateKey != null && !"".equals(privateKey)) {
if (passphrase != null && "".equals(passphrase)) {
//設定帶口令的金鑰
jsch.addIdentity(privateKey, passphrase);
} else {
//設定不帶口令的金鑰
jsch.addIdentity(privateKey);
}
}
if(port <=0){
//連線伺服器,採用預設埠
session = jsch.getSession(user, ip);
}else{
//採用指定的埠連線伺服器
session = jsch.getSession(user, ip ,port);
}
//如果伺服器連線不上,則丟擲異常
if (session == null) {
throw new Exception("session is null");
}
//設定登陸主機的密碼
session.setPassword(psw);//設定密碼
//設定第一次登陸的時候提示,可選值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
//設定登陸超時時間
session.connect(30000);
try {
//建立sftp通訊通道
channel = (Channel) session.openChannel("sftp");
channel.connect(1000);
ChannelSftp sftp = (ChannelSftp) channel;
//進入伺服器指定的資料夾
sftp.cd("domains");
//列出伺服器指定的檔案列表
Vector v = sftp.ls("*.txt");
for(int i=0;i<v.size();i++){
System.out.println(v.get(i));
}
//以下程式碼實現從本地上傳一個檔案到伺服器,如果要實現下載,對換以下流就可以了
OutputStream outstream = sftp.put("1.txt");
InputStream instream = new FileInputStream(new File("c:/print.txt"));
byte b[] = new byte[1024];
int n;
while ((n = instream.read(b)) != -1) {
outstream.write(b, 0, n);
}
outstream.flush();
outstream.close();
instream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.disconnect();
channel.disconnect();
}
}