背景
Java 程序訪問第三方SFTP服務(wù)器下載文件备禀,第三方只提供賬號+私鑰(key.ppk
文件)
引入工具包(jsch)
建議引用最新版本洲拇,一開始版本過低,報錯了
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
DEMO
package com.ctrip.ibu.yzy.test.ftp;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.util.Properties;
import java.util.Vector;
public class FTPTest {
public static void main(String[] args) {
JSch jsch = new JSch();
Session session = null;
ChannelSftp channel = null;
String path = FTPTest.class.getProtectionDomain().getCodeSource().getLocation().getPath();
try {
jsch.addIdentity(path + "key.ppk");
session = jsch.getSession("username", "host", 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setTimeout(20000);
session.connect();
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
Vector vector = channel.ls("/infiles/");
for (Object obj : vector) {
if (obj instanceof ChannelSftp.LsEntry) {
ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) obj;
System.out.println(entry.getFilename());
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
channel.quit();
session.disconnect();
}
}
}
控制臺輸出infiles
目錄下所有 文件名
.
..
634_Hotel_report_20190521.csv.gz
634_Hotel_report_20190306.csv.gz
634_Hotel_report_20190412.csv.gz
634_POS_report_20190509.csv.gz
634_POS_report_20190512.csv.gz
634_Hotel_report_20190409.csv.gz
jsch 其他方法可以自行谷歌
踩坑
以上看起來沒有什么問題曲尸,當(dāng)我發(fā)布到測試環(huán)境(linux)的時候赋续,運(yùn)行報異常:
com.jcraft.jsch.JSchException: invalid privatekey: [B@392b0008
網(wǎng)上翻了好多帖子也沒有找到解決方案,猜測是秘鑰問題队腐,果然看到有說mac系統(tǒng)無法使用ppk遠(yuǎn)程登錄的帖子蚕捉。
解決方案
下載Puttygen
,將key.ppk
轉(zhuǎn)換成 key.pem
修改后的代碼柴淘,測試通過
boolean windows = System.getProperty("os.name").toLowerCase().contains("windows");
String path = getClass().getClassLoader().getResource(windows ? "key.ppk" : "key.pem").getPath();
......