`

java语言连接sftp服务器的一些总结

    博客分类:
  • java
阅读更多
写道
package com.zznode.ngn.sa.psm.probe.sftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.sshtools.vfs.SftpClientFactory;
import com.zznode.e2e.log.Logger;

/**
* SFTP客户端工具,提供从远程服务器下载文件功能
* apache 类包应用
*/
public class SftpClient {

private static final Logger logger = Logger.getLogger(SftpClient.class);
/**
* FTP客户端,实现从服务器上下载文件。
*/
private ChannelSftp sftp;
private Session sshSession;

private String userName;
private String password;
private String hostName;
private int port;
/**
* 密钥文件路径
*/
private String privateKey;

/**
* 密钥的密码
*/
private String passphrase;

public SftpClient(String hostName, int port, String userName, String password) {
this.hostName = hostName;
this.port = port;
this.userName = userName;
this.password = password;
sftp=new ChannelSftp();
}

/**
* 使用密钥方式
* @param hostName
* @param port
* @param userName
* @param privateKey
* @param passphrase
*/
public SftpClient(String hostName, int port, String userName, String privateKey,String passphrase) {
this.hostName = hostName;
this.port = port;
this.userName = userName;
this.privateKey = privateKey;
this.passphrase = passphrase;
sftp=new ChannelSftp();
}
/**
* 连接sftp服务器
* @param host 主机
* @param port 端口
* @param username 用户名
* @param password 密码
* @return
*/
public synchronized void login(){
try {

// SFTPUtil sftputil = new SFTPUtil(userName,password,hostName,port);
// sftp = sftputil.connectServer();
com.jcraft.jsch.Logger jslogger = new SettleLogger();
JSch.setLogger(jslogger);

JSch jsch = new JSch();
sshSession = jsch.getSession(userName, hostName, port); // 根据用户名,主机ip,端口获取一个Session对象

Properties sshConfig = new Properties();// 为Session对象设置properties
sshConfig.put("StrictHostKeyChecking", "no");
logger.debug("--->password:"+password);
sshSession.setPassword(password);// 设置密码
sshSession.setConfig(sshConfig);
sshSession.setTimeout(30000); // 设置timeout时间
sshSession.connect(); // 通过Session建立链接

Channel channel = sshSession.openChannel("sftp");
channel.connect();// 建立SFTP通道的连接
sftp = (ChannelSftp) channel;
logger.info("Connected to sftp " + hostName + " sucess !!!");

} catch (Exception e) {
StringBuffer msg = new StringBuffer();
msg.append("Cannot connect to sftp server '");
msg.append(hostName + ":" + port).append("', cause by ");
msg.append(e.getMessage());
logger.error(msg.toString());
e.printStackTrace();
}
}

/**
* 连接sftp服务器
* 使用RSA密钥方式
*/
public synchronized void login4RSA(){
com.jcraft.jsch.Logger jslogger = new SettleLogger();
JSch.setLogger(jslogger);
Channel channel = null;

JSch jsch = new JSch();
//设置密钥和密码
try {
if(privateKey != null && !"".equals(privateKey)){
if(passphrase != null && !"".equals(passphrase)){
jsch.addIdentity(privateKey, passphrase);
}else{
jsch.addIdentity(privateKey);
}
}else{
throw new Exception("privateKey is null or empty!");
}
if(port <= 0){
sshSession = jsch.getSession(userName, hostName);
}else{
sshSession = jsch.getSession(userName, hostName, port);
}
if(password != null && !password.equals("")){
sshSession.setPassword(password);
}
sshSession.setConfig("StrictHostKeyChecking", "no");
sshSession.connect();

channel = sshSession.openChannel("sftp");
channel.connect();// 建立SFTP通道的连接
sftp = (ChannelSftp) channel;
logger.info("Connected to sftp " + hostName + " sucess !!!");

} catch (Exception e) {
logger.debug("--->error!!!"+e);
e.printStackTrace();
}

}

/**
* 注销登录,并断开到SFTP服务器的网络连接
*/
public synchronized void logout() {
if (sftp != null && sftp.isConnected()) {
sftp.disconnect();
logger.info("sftp is closed !!!");
}
if(sshSession!=null && sshSession.isConnected()){
sshSession.disconnect();
logger.info("sshSession is closed !!!");
}
}
/**
* 判断sftp是否连接
* @return
*/
public synchronized boolean isConnected()
{
if(sftp!=null)
{
return sftp.isConnected();
}
return false;
}

/**
* 列出dir路径下的文件
* @param dir
* @return
*/
public synchronized String[] listFileNames(String dir){
try {
Vector v = sftp.ls(dir);
String[] names;
if(v != null && v.size()>0){
int count = v.size();
names = new String[count];
for(int i = 0;i < count;i++){
LsEntry lsEnt = (LsEntry)v.get(i);
names[i] = lsEnt.getFilename();
}
logger.debug("-->"+dir+" contain file number "+count);
return names;
}else{
return null;
}
} catch (SftpException e) {
e.printStackTrace();
return null;
}
}
/**
* 上传文件
* @param directory 上传的目录
* @param uploadFile 要上传的文件
* @param sftp
*/
public void upload(String remotePath, String sftpFileName, String localPath, String fileName) {
try {
sftp.cd(remotePath);
File file=new File(localPath+fileName);
sftp.put(new FileInputStream(file), sftpFileName);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 批量上传文件
* @param remotePath 远程保存目录
* @param localPath 本地上传目录(以路径符号结束)
* @param del 上传后是否删除本地文件
* @return
*/
public boolean bacthUploadFile(String remotePath, String localPath, boolean del) {
try {
File file = new File(localPath);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile() && files[i].getName().indexOf("bak") == -1) {
upload(remotePath, files[i].getName(),localPath, files[i].getName());
if (del) {
deleteFile(localPath + files[i].getName());
}
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
logout();
}
return false;
}

/**
* 下载文件
* @param directory 下载目录
* @param downloadFile 下载的文件
* @param saveFile 存在本地的路径
* @param sftp
*/
public boolean download(String directory, String downloadFile, String localPath, String saveFile) {
try {
sftp.cd(directory);
if(localPath!=null){
saveFile=localPath + saveFile;
}
File file=new File(saveFile);
mkdirs(saveFile);
sftp.get(downloadFile, new FileOutputStream(file));
return true;
} catch (Exception e) {
logger.error("no such file:"+downloadFile);
return false;
// e.printStackTrace();
}
}

/**
* 下载文件
* @param localFile
* @param remoteFile
* @return
*/
public boolean download(String localFile, String remoteFile){
String remoteFileName = remoteFile.substring(remoteFile.lastIndexOf("\\")+1);
String remoteDir = remoteFile.substring(0, remoteFile.lastIndexOf("\\"));
String localFileName = localFile.substring(localFile.lastIndexOf("\\")+1);
String localDir = localFile.substring(0, localFile.lastIndexOf("\\"));
logger.debug("-->ready to download the file "+remoteFileName+" from "+remoteDir+"... download to "+localDir+" "+localFileName);
return this.download(remoteDir, remoteFileName, localDir, localFileName);

}
/**
* 批量下载文件
*@param remotPath 远程下载目录(以路径符号结束)
* @param localPath 本地保存目录(以路径符号结束)
* @param fileFormat 下载文件格式(以特定字符开头,为空不做检验)
* @param del 下载后是否删除sftp文件
* @return
*/
public boolean batchDownLoadFile(String remotPath, String localPath, String fileFormat, boolean del) {
try {
Vector v = listFiles(remotPath);
for(Iterator it = v.iterator();it.hasNext();) {
LsEntry entry = (LsEntry) it.next();
String filename = entry.getFilename();
SftpATTRS attrs = entry.getAttrs();
if (!attrs.isDir()) {
if (fileFormat != null && !"".equals(fileFormat.trim())) {
if (filename.startsWith(fileFormat)) {
download(remotPath, filename, localPath, filename);
if (del) {
deleteSftpFile(remotPath, filename);
}
}
} else {
download(remotPath, filename,localPath, filename);
if (del) {
deleteSftpFile(remotPath, filename);
}
}
}
}
return true;
} catch (SftpException e) {
e.printStackTrace();
} finally {
logout();
}
return false;
}
/**
* 如果目录不存在就创建目录
*@param path
*/
public void mkdirs(String path) {
File f = new File(path);
String fs = f.getParent();
f = new File(fs);
if (!f.exists()) {
f.mkdirs();
}
}
/**
* 删除服务器文件
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
* @param sftp
*/
public void deleteSftpFile(String directory, String deleteFile) {
try {
sftp.cd(directory);
sftp.rm(deleteFile);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除本地文件
* @param filePath
*
*/
public boolean deleteFile(String filePath) {
File file = new File(filePath);
if (!file.exists()) {
return false;
}
if (!file.isFile()) {
return false;
}
return file.delete();
}
/**
* 列出目录下的文件名
* @param directory 要列出的目录
* @param sftp
* @return
* @throws SftpException
*/
public Vector listFiles(String directory) throws SftpException{
return sftp.ls(directory);
}

public static void main(String[] args) throws SftpException {
SftpClient sf = new SftpClient("58.248.11.212",22,"wnm_rms","Rms#2013");
String directory = "/home/wnm_rms/";
String uploadFile = "D:\\tmp\\upload.txt";
String downloadFile = "upload.txt";
String saveFile = "D:\\tmp\\download.txt";
String deleteFile = "delete.txt";
sf.login();
// ChannelSftp sftp=sf.sftp;
Vector cc=sf.listFiles(directory);
for(Iterator ii=cc.iterator();ii.hasNext();){
System.out.println(ii.next());
}

// sf.upload(directory, uploadFile);
// sf.download(directory, downloadFile, saveFile);
// sf.delete(directory, deleteFile);
try{

}catch(Exception e){
e.printStackTrace();
}
}

}

 最近在工作中用户提出需求,从服务器下载文件,不能使用ftp必须使用sftp。原因是该服务器不支持ftp连接。然后我从网上找了一些例子,自己动手写出来了。

   现记录下来以便自己以后回顾以及跟大家分享:

 

 

        对于上面这个工具类做个简单的分析:

              1、sftp类涉及到的第三方工具包:最主要的包是jsch-0.1.39.jar,还有一个打日志的包e2elog.jar包(公司内部封装的,便于排错的,没啥大用)

               2、支持登录sftp的方式:

                                           2.1、密码登录方式(login())

                                           2.2、密钥登录方式(login4RSA())

               3、sftp的一些简单操作:比如列出服务器上的文件,下载文件,上传文件等等,这些具体见代码

               4、有啥不明白的欢迎留言,希望和大家多多讨论,共同进步

分享到:
评论

相关推荐

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    4. 在Java中,通过JSch库连接到SFTP服务器时,需要先建立一个JSch对象,然后创建一个Session(会话),并设置Session的配置属性。 5. 接着通过Session对象获取一个Channel(通道),并打开SFTP通道。此时可以利用...

    基于Java的实例源码-用Java写的SFTP代码.zip

    2. **连接SFTP服务器**:使用JSch,首先需要创建一个`JSch`对象,然后通过`Session`类建立到SFTP服务器的连接。这通常涉及设置主机名、端口、用户名和密码(或私钥)。 3. **身份验证**:JSch支持多种身份验证方式...

    java 开发sftp下载上传

    1. **连接SFTP服务器**:首先,我们需要创建一个`JSch`实例,并使用用户名、密码或私钥建立到SFTP服务器的连接。以下是一个简单的示例: ```java JSch jsch = new JSch(); Session session = jsch.getSession(...

    java代码sftp和ftp上传下载文件

    本文将深入探讨如何使用Java实现SFTP(Secure File Transfer Protocol)和FTP(File Transfer Protocol)进行文件的上传与下载,以满足在Linux服务器上的操作需求。 首先,FTP是一种用于在网络之间传输文件的标准...

    用java写的SFTP代码源码下载

    Java作为一种广泛使用的编程语言,拥有丰富的库来支持各种网络协议,包括SFTP。在Java中实现SFTP,我们通常会使用JSch库,这是一个开源的Java SSH2库,它提供了对SFTP的支持。 首先,我们需要引入JSch库到我们的...

    使用Java向服务器上传文件压缩包并实现解压缩

    JSch是一个纯Java实现的SSH2库,它允许用户连接到SFTP服务器,进行文件传输、创建目录、删除文件等操作。首先,我们需要在项目中引入JSch库,然后创建一个`Session`对象,设置用户名、密码或密钥对,并连接到SFTP...

    java sftp文件上传

    Java SFTP文件上传是通过Java编程语言实现与Secure File Transfer Protocol(SFTP)服务器进行交互,将本地文件安全地传输到远程服务器的过程。SFTP是一种基于SSH的安全文件传输协议,它提供了在不安全网络上安全...

    java上传文件到linux服务器,操作linux服务器上文件,下载linux服务器文件,删除linux服务器文件

    Linux服务器是一种基于Linux操作系统并提供网络服务的计算机系统,而Java作为一种跨平台的编程语言,能够通过SSH(Secure Shell)协议与Linux服务器进行通信。SSH是一种安全的网络协议,用于在网络中传输命令和数据...

    java实现sftp上传下载文件

    1. **建立SSH连接**:首先,我们需要通过JSch类的`Session`对象建立一个到SFTP服务器的安全连接。这涉及到设置主机名、端口、用户名和密码(或者私钥)。 ```java JSch jsch = new JSch(); Session session = jsch....

    用java写的SFTP代码项目资料

    1. **Java基础**:首先,你需要熟悉Java语言的基础,包括类、对象、接口、异常处理、输入/输出流等概念。这些是编写任何Java应用程序的基础。 2. **JSch库**:JSch库是Java实现SFTP的核心。它允许开发者连接到支持...

    基于Java的用Java写的SFTP代码.zip

    2. **建立连接**:通过`session.connect()`方法建立与SFTP服务器的连接。确保正确设置了连接参数,如超时时间。 3. **创建SFTP通道**:连接成功后,使用`session.openChannel("sftp")`创建一个SFTP通道,并将其转换...

    Java运用ganymed-ssh2-build210.jar包远程连接操作linux服务器

    本文档的标题是"Java 运用 Ganymed-SSH2 库远程连接操作 Linux 服务器",这意味着我们将使用 Java 语言来远程连接 Linux 服务器,并使用 Ganymed-SSH2 库来实现远程连接和文件传输。 描述解释 描述部分提到使用 ...

    基于java的用java写的SFTP代码.zip

    2. **连接SFTP服务器**: 要连接到SFTP服务器,你需要提供主机名、用户名、密码或私钥信息。以下是一个基本的连接示例: ```java JSch jsch = new JSch(); Session session = jsch.getSession("username", ...

    java源码:用java写的SFTP代码.rar

    Java是一种广泛使用的编程语言,尤其在企业级应用和服务器端开发中占据主导地位。源码是程序员交流技术、学习新知识的重要方式。本压缩包"java源码:用java写的SFTP代码.rar"包含了使用Java实现SFTP(Secure File ...

    java连接服务器,对服务器命令操作,文件上传和文件下载工具

    总结,Java连接服务器并进行命令操作、文件上传下载是运维工作中的常见任务,而Sigar库则提供了丰富的系统监控功能。通过学习和掌握这些技术,开发者可以更好地进行远程服务器管理和自动化运维。在实际项目中,应...

    Java远程连接Linux服务器并执行命令及上传文件功能

    本文主要介绍了如何使用Java语言远程连接Linux服务器并执行命令及上传文件的功能。该功能主要通过使用JSch库和Apache Commons Logging库来实现远程连接和文件上传。 第一点,关于Java远程连接Linux服务器的知识点:...

    java sftp文件上传代码

    2. **连接SFTP服务器** 要连接到SFTP服务器,你需要创建一个`JSch`实例,然后建立一个`Session`。在这个过程中,你需要提供服务器的IP地址、端口号、用户名和密码。 ```java JSch jsch = new JSch(); Session ...

    java sftp tools

    Java SFTP工具可以帮助开发者实现这一功能,通常包括连接到SFTP服务器、列出目录、上传下载文件、管理文件权限等功能。 在描述中提到的“博文链接:https://messon619.iteye.com/blog/922052”,这可能是一个关于...

    Java FTP 指定下载文件和上传文件到指定的服务器目录

    在本篇文章中,我们将详细介绍如何使用Java编程语言通过FTP(文件传输协议)实现文件的上传与下载功能,并能够将文件指定上传或下载到特定的服务器目录下。此方法已经过测试验证,能够满足基本的需求,并且代码易于...

    Sftp文件上传demo

    除此之外,还有一些其他的SFTP客户端工具,如WinSCP(Windows)、FileZilla(跨平台)等,它们提供图形化界面,使得非程序员也能方便地进行SFTP文件传输。 在生产环境中,为了提高安全性,通常会使用密钥对认证而...

Global site tag (gtag.js) - Google Analytics