1.sftp的Ganymed SSH-2 for Java开发:
api地址:http://www.cleondris.ch/opensource/ssh2/javadoc/
下载地址:http://www.cleondris.ch/opensource/ssh2/
linux下密钥和公钥生产方法:
一直Enter确认下去
说明:
命令格式:#ssh-keygen -t rsa
id_rsa是私钥,id_rsa.pub是公钥
代码实现:
/*
* 从sftp服务器上下载某个文件
* ip:sftp服务器ip地址
* port:sftp服务器端口号
* username:访问sftp服务器用户名
* pwd:访问sftp服务器密码
* passPhrase:密钥口令
* privateKey:私密钥文件(即是指定id_rsa文件)
* filename:sftp服务器上的要下载的文件名
* servicePath:sftp服务器文件路径
* locPath:文件保存在本机的路径
*/
public void xDownload(String ip,int port,String username,String pwd ,String privateKey,String passPhrase,String filename,String servicePath,String locPath){
Connection con = new Connection(ip,port);
try{
con.connect();//建立连接
DataInputStream input = new DataInputStream(new FileInputStream(privateKey));//打开密钥文件
char[] val = new char[input.available()];
for(int idx=0;idx<val.length;idx++){
val[idx] = (char) input.read();
}
//登录身份验证
if(con.autherticateWithPublicKey(username,val,pwd)){
SFTPv3Client client = new SFTPv3Client(con);//建立SFTP客户端
DataOutputStream dataout = new DataOutputStream(new FileOutputSteam(locPath + File.separator + filename));
SFTPv3FileAttributes atts =client.lstat(servicePath+File.separator+filename);
SFTPv3FileHandle handle = client.openFileRO(servicePath+File.separator+filename);
byte[] buff = new byte[1024];
int curoffset = 0;
do {
int rlen = 0;
rlen = client.read(handle, curoffset, buff, 0, buff.length);
curoffset += rlen;
dataout.write(buff, 0, rlen);
} while (curoffset != attrs.size);
dataout.flush();
dataout.close();
}
con.close();
}catch(RuntimeException e){
}finally{
con.close();
}
}
2.sftp之jsch代码实现
jsch官网地址:http://www.jcraft.com/jsch/
/*
* 从sftp服务器上下载某个文件
* ip:sftp服务器ip地址
* port:sftp服务器端口号
* username:访问sftp服务器用户名
* pwd:访问sftp服务器密码
* passPhrase:密钥口令
* privateKey:私密钥文件(即是指定id_rsa文件)
* filename:sftp服务器上的要下载的文件名
* servicePath:sftp服务器文件路径
* locPath:文件保存在本机的路径
*/
public void xDownload(String ip,int port,String username,String pwd ,String privateKey,String passPhrase,String filename,String servicePath,String locPath){
Session session = null;
Channel channel = null;
ChannelSftp sftp = null;
try {
JSch jsch = new JSch(); //创建JSch对象
//使用密钥验证方式,密钥可以使有口令的密钥,也可以是没有口令的密钥
if (privateKey != null &&!"".equals(privateKey)) {
if (passPhrase != null && !"".equals(passPhrase)) {
jsch.addIdentity(privateKey, passPhrase);
}else {
jsch.addIdentity(privateKey);
}
}
//根据用户名,主机ip,端口获取一个Session对象
session = jsch.getSession(username, ip, port);
if (pwd != null && !"".equals(pwd)) {
session.setPassword(pwd); // 设置密码
}
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config); // 为Session对象设置properties
session.setTimeout(60000); // 设置timeout时间
session.connect(); // 通过Session建立链接
channel = session.openChannel("sftp"); // 打开SFTP通道
channel.connect(); // 建立SFTP通道的连接
sftp = (ChannelSftp) channel;
sftp.cd(servicePath);
sftp.get(filename, locPath);
sftp.disconnect();
channel.disconnect();
session.disconnect();
}catch (JSchException e) {
e.printStackTrace();
throw new RuntimeException("SFTP操作发生异常!",e);
} catch (SftpException e) {
e.printStackTrace();
throw new RuntimeException("SFTP操作发生异常!",e);
}finally {
if (sftp != null) {
sftp.disconnect();
}
if (channel != null) {
channel.disconnect();
} if (session != null) {
session.disconnect();
}
}
}
欢迎纠错,谢谢