sftp免密用java怎么调用

Python024

sftp免密用java怎么调用,第1张

import java.io.File

import java.io.FileInputStream

import java.io.FileNotFoundException

import java.io.FileOutputStream

import java.io.IOException

import java.util.ArrayList

import java.util.Iterator

import java.util.List

import java.util.Properties

import java.util.Vector

import org.apache.commons.lang.ArrayUtils

import com.huawei.bme.commons.om.log.DebugLog

import com.huawei.bme.commons.om.log.LogFactory

import com.huawei.icity.commons.constants.KeyConstant

import com.huawei.icity.commons.constants.NumberConstant

import com.huawei.icity.commons.exception.SPMException

import com.huawei.icity.commons.log.IcityLogFactory

import com.huawei.icity.commons.log.IcityRuntimeLog

import com.huawei.icity.commons.sysconfig.StaticInitData

import com.huawei.icity.commons.utils.StringTools

import com.huawei.icity.omp.common.util.CommonTools

import com.huawei.icity.omp.interfaces.hint.constant.TimetaskConstants

import com.huawei.mdmc.bfm.cms.assist.common.domain.SingleTableModel

import com.jcraft.jsch.Channel

import com.jcraft.jsch.ChannelSftp

import com.jcraft.jsch.ChannelSftp.LsEntry

import com.jcraft.jsch.JSch

import com.jcraft.jsch.JSchException

import com.jcraft.jsch.Session

import com.jcraft.jsch.SftpException

/**

* SFTP公共处理类 〈提供SFTP文件上传,下载,获取指定目录 下文件名集合, 获取指定目录 下文件集合等方法>

*

* @author mKF75022

* @version iCity Manager V100R002 2012-7-3

* @since iCity Manager V100R002C01

*/

public class SFTPTool

{

/**

* 调测日志记录器。

*/

private static final DebugLog DEBUGGER = LogFactory.getDebugLog(SFTPTool.class)

/**

* 运行日志记录器。

*/

private static final IcityRuntimeLog RUNTIMELOGGER = IcityLogFactory

.getRuntimeLog(SFTPTool.class)

/**

* Sftp客户端对象

*/

private ChannelSftp sftp = null

/**

* SFTP IP地址

*/

private String ip

/**

* SFTP 端口

*/

private String port

/**

* SFTP 用户名

*/

private String userName

/**

* SFTP 密码

*/

private String password

/**

* SFTP上传模式:BINARY

*/

// private static final int BINARY_FILE_TYPE = 2

/**

*

* 获取实例

*

* @return SFTPTool newinstance实例

*

*/

public static SFTPTool getNewInstance()

{

return new SFTPTool()

}

/**

* 初始化连接参数

*

* @param sftpIP

*IP

* @param sftpPort

*端口

* @param sftpUsername

*用户名

* @param sftpPassword

*密码

*/

public void init(String sftpIP, String sftpPort, String sftpUsername, String sftpPassword)

{

// 获取SFTP连接信息

this.ip = sftpIP

this.port = sftpPort

this.userName = sftpUsername

this.password = sftpPassword

}

/**

* 从SFTP将符合约定命名的文件都下载到本地 .

*

* @param sftpDir

*SFTP服务器文件存放路径

* @param locDir

*本地文件存放路径

* @param regex

*指定文件名的格式

* @param needBackup

*是否需要文件备份(true:是false:否)

* @param needFullMatch

*是否要求全局匹配(true:是false:否)

* @param deleteFtpFile

*the delete ftp file

* @return 下载到本地的文件列表

*/

public List<File>synSFTPFileToLocal(String sftpDir, String locDir, String regex,

boolean needBackup, boolean needFullMatch, boolean deleteFtpFile)

{

List<File>files = new ArrayList<File>(KeyConstant.INITIAL_NUMBER)

try

{

this.connect(ip, Integer.parseInt(this.port), userName, password)

// 获得FTP上文件名称列表

List<String>ftpFileNameList = this.listFiles(sftpDir, regex, needFullMatch)

File localFile = null

int size = ftpFileNameList.size()

// 根据每个FTP文件名称创建本地文件。

for (int i = 0i <sizei++)

{

// 下载源文件

localFile = this.download(sftpDir, locDir, ftpFileNameList.get(i), deleteFtpFile)

if (localFile.exists())

{

files.add(localFile)

}

if (needBackup)

{

// 备份源文件生成默认备份文件路径(据请求文件路径,生成同级目录的备份文件夹绝对路径)

String parentDir = sftpDir.substring(NumberConstant.INT_0,

sftpDir.lastIndexOf("/") + 1)

String backupDir = parentDir + TimetaskConstants.DEFAULT_BACKUP_DIRNAME

boolean bakExists = openDir(backupDir)

if (bakExists)

{

this.uploadFile(backupDir, localFile)

}

else

{

boolean parentExists = openDir(parentDir)

if (parentExists)

{

sftp.mkdir(TimetaskConstants.DEFAULT_BACKUP_DIRNAME)

this.uploadFile(backupDir, localFile)

}

else

{

DEBUGGER.error("sftp parentDir no exisits ")

}

}

}

}

}

catch (Exception e)

{

DEBUGGER.error("synSFTPFileToLocal Exception", e)

}

finally

{

this.disconnect()

}

return files

}

/**

* 连接sftp服务器

*

* @param sftpip

*ip地址

* @param sftpport

*端口

* @param sftpusername

*用户名

* @param sftppassword

*密码

* @return channelSftp

* @throws SPMException

*/

public ChannelSftp connect(String sftpip, int sftpport, String sftpusername, String sftppassword)

{

sftp = new ChannelSftp()

try

{

JSch jsch = new JSch()

jsch.getSession(sftpusername, sftpip, sftpport)

Session sshSession = jsch.getSession(sftpusername, sftpip, sftpport)

RUNTIMELOGGER.info("Session created")

sshSession.setPassword(sftppassword)

Properties sshConfig = new Properties()

sshConfig.put("StrictHostKeyChecking", "no")

sshSession.setConfig(sshConfig)

// 设置超时时间为

sshSession.setTimeout(Integer.parseInt(StaticInitData.getFtpConnectTimeOut())

* NumberConstant.INT_1000)

sshSession.connect()

Channel channel = sshSession.openChannel("sftp")

channel.connect()

sftp = (ChannelSftp) channel

// 设置文件类型

// ftpClient.setFileType(BINARY_FILE_TYPE)

// 与防火墙相关

// ftpClient.enterLocalPassiveMode()

}

catch (JSchException e)

{

DEBUGGER.error("JSchException : {}", e)

}

return sftp

}

// /**

// * 创建指定文件夹

// *

// * @param dirName

// * dirName

// */

// public void mkDir(String dirName)

// {

// try

// {

// sftp.mkdir(dirName)

// }

// catch (SftpException e)

// {

// DEBUGGER.error("mkDir Exception : " + e)

// }

// }

/**

* 创建指定文件夹

*

* @param dirName

*dirName

*/

public void mkDir(String dirName)

{

String[] dirs = dirName.split("/")

try

{

String now = sftp.pwd()

for (int i = 0i <dirs.lengthi++)

{

boolean dirExists = openDir(dirs[i])

if (!dirExists)

{

sftp.mkdir(dirs[i])

sftp.cd(dirs[i])

}

}

sftp.cd(now)

}

catch (SftpException e)

{

DEBUGGER.error("mkDir Exception : " + e)

}

}

/**

* 打开指定目录

*

* @param directory

*directory

* @return 是否打开目录

*/

public boolean openDir(String directory)

{

try

{

sftp.cd(directory)

return true

}

catch (SftpException e)

{

DEBUGGER.error("openDir Exception : " + e)

return false

}

}

多次需要把文件上传到单独的服务器,而程序是在单独的服务器上部署的,在进行文件操作的时候就需要跨服务器进行操作包括:文件上传、文件下载、文件删除等。跨服务器文件操作一般是需要FTP协议和SFTP协议两种,现在就通过Java实现FTP协议的文件上传。要实现FTP操作文件需要引入jar包: commons-net-1.4.1.jar

参考资料来源:百度贴吧

String directory = "."

目测 /home/httpd/test/ 是*nix的路径,而你用的是Windows,一来,没有这个目录,二来SFTP服务器分配的目录应该也不是这个,所以改".",即当前目录试试,如果不行就留空,或者改"/"