1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > JAVA 连接sftp服务器 用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)

JAVA 连接sftp服务器 用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)

时间:2021-10-10 09:35:32

相关推荐

JAVA 连接sftp服务器 用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)

JAVA 连接sftp服务器,用户名密码方式链接

添加maven依赖:链接SFTP关闭连接 serverSFTP上传SFTP下载SFTP删除文件列出目录下的文件最终 SFTPUtils工具类业务类ImportSourceController

添加maven依赖:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.54</version></dependency>

链接SFTP

下面展示一些内联代码片

/*** 连接sftp服务器*/public static ChannelSftp login(String host, int port, String username, String password) {logger.info("SftpUtils login begin");Session session = null;String config = "Port "+port+"\n" +"\n" +"Host foo\n" +" User "+username+"\n" +" Hostname "+host+"\n" +"Host *\n" +" ConnectTime 3000\n" +" PerferredAuthentications Keyboard-interact,password,publicKey\n" +" #ForwardAgent yes\n" +" #StrictHostKeyChecking no\n" +" #identiyFile ~/.ssh/id_rsa\n" +" #UserKnownHostFile ~/.shh/known_hosts";ConfigRepository configRepository = null;try {configRepository = OpenSSHConfig.parse(config);JSch jSch = new JSch();jSch.setConfigRepository(configRepository);//"foo" is from "Host foo" in the above configsession = jSch.getSession("foo");session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect(18000);Channel channel = session.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel;logger.info("SftpUtils login end");return sftp;} catch (JSchException | IOException e) {logger.error("连接SFTP服务器失败", e);return null;}}

关闭连接 server

下面展示一些内联代码片

// A code blockvar foo = 'bar';

/*** 关闭连接 server*/public static void logout(ChannelSftp sftp){logger.info("SftpUtils logout begin");if (sftp != null) {Session session = null;try {session = sftp.getSession();if (sftp.isConnected()) {sftp.disconnect();}} catch (JSchException e) {logger.error("获取session失败", e);} finally {if (session != null) {session.disconnect();}}}logger.info("SftpUtils logout end");}

SFTP上传

下面展示一些内联代码片

/*** 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory* basePath 服务器的基础路径* directory 上传到该目录* sftpFileName sftp端文件名* in 输入流*/public static boolean upload(String host, int port, String username, String password, String basePath, String sftpFileName, InputStream input) {logger.info("SftpUtils upload begin");boolean success = true;ChannelSftp sftp = login(host, port, username, password);try {sftp.cd(basePath);} catch (SftpException e) {//目录不存在,则创建文件夹String [] dirs = basePath.split("/");String tempPath = "";for(String dir:dirs){if(null== dir || "".equals(dir)) {continue;}tempPath+="/"+dir;try {sftp.cd(tempPath);} catch (SftpException e1) {try {sftp.mkdir(tempPath);sftp.cd(tempPath);} catch (SftpException e2) {logger.error("创建文件夹失败", e2);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("创建文件夹失败"));}}try{sftp.cd(tempPath);}catch(SftpException e1){logger.error("SFTP服务器异常", e1);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("SFTP服务器异常"));}}}try {//上传文件sftp.put(input, sftpFileName);} catch (SftpException e) {// TODO Auto-generated catch blocklogger.error("上传文件失败", e);// throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("上传文件失败"));success = false;} finally {logout(sftp);}logger.info("SftpUtils upload end");return success;}

SFTP下载

下面展示一些内联代码片

/*** 下载文件。* directory 下载目录* downloadFile 下载的文件* saveFile 存在本地的路径*/public static boolean download(String host, int port, String username, String password, String filePath, final OutputStream outputStream) {logger.info("SftpUtils download begin");boolean downloaded = true;ChannelSftp sftp = login(host, port, username, password);String fileName = null;try {if (filePath != null && !"".equals(filePath)) {String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);}fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.get(fileName, outputStream);} catch (SftpException e) {downloaded = false;logger.error("FTP服务器异常", e);} finally {logout(sftp);}logger.info("SftpUtils download end");return downloaded;}

SFTP删除文件

下面展示一些内联代码片

/*** 删除文件* directory 要删除文件所在目录* deleteFile 要删除的文件*/public static boolean delete(String host, int port, String username, String password, String filePath){logger.info("SftpUtils delete begin");boolean success = true;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.rm(fileName);} catch (SftpException e) {logger.error("文件删除失败", e);success = false;} finally {logout(sftp);}logger.info("SftpUtils delete end");return success;}

列出目录下的文件

下面展示一些内联代码片

/*** 列出目录下的文件* directory 要列出的目录* sftp*/public static boolean isFileExist(String host, int port, String username, String password, String filePath) {boolean success = false;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);Vector<?> vector = sftp.ls(directory);for (Object obj : vector) {if (obj != null) {LsEntry lsEntry = (LsEntry) obj;if (fileName.equals(lsEntry.getFilename())) {success = true;break;}}}} catch (Exception e) {logger.error("sftp服务器异常");} finally {logout(sftp);}return success;}

最终 SFTPUtils工具类

import com.jcraft.jsch.*;import com.jcraft.jsch.ChannelSftp.LsEntry;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.Base64Utils;import org.springframework.util.StringUtils;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Properties;import java.util.Vector;/*** @author Administrator**/public class SFTPUtils {private final static Logger logger = LoggerFactory.getLogger(SFTPUtils.class);protected final static int CLIENT_TIMEOUT = 1000 * 180;/*** 连接sftp服务器*/public static ChannelSftp login(String host, int port, String username, String password) {logger.info("SftpUtils login begin");Session session = null;String config = "Port "+port+"\n" +"\n" +"Host foo\n" +" User "+username+"\n" +" Hostname "+host+"\n" +"Host *\n" +" ConnectTime 3000\n" +" PerferredAuthentications Keyboard-interact,password,publicKey\n" +" #ForwardAgent yes\n" +" #StrictHostKeyChecking no\n" +" #identiyFile ~/.ssh/id_rsa\n" +" #UserKnownHostFile ~/.shh/known_hosts";ConfigRepository configRepository = null;try {configRepository = OpenSSHConfig.parse(config);JSch jSch = new JSch();jSch.setConfigRepository(configRepository);//"foo" is from "Host foo" in the above configsession = jSch.getSession("foo");session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect(18000);Channel channel = session.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel;logger.info("SftpUtils login end");return sftp;} catch (JSchException | IOException e) {logger.error("连接SFTP服务器失败", e);return null;}}/*** 关闭连接 server*/public static void logout(ChannelSftp sftp){logger.info("SftpUtils logout begin");if (sftp != null) {Session session = null;try {session = sftp.getSession();if (sftp.isConnected()) {sftp.disconnect();}} catch (JSchException e) {logger.error("获取session失败", e);} finally {if (session != null) {session.disconnect();}}}logger.info("SftpUtils logout end");}/*** 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory* basePath 服务器的基础路径* directory 上传到该目录* sftpFileName sftp端文件名* in 输入流*/public static boolean upload(String host, int port, String username, String password, String basePath, String sftpFileName, InputStream input) {logger.info("SftpUtils upload begin");boolean success = true;ChannelSftp sftp = login(host, port, username, password);try {sftp.cd(basePath);} catch (SftpException e) {//目录不存在,则创建文件夹String [] dirs = basePath.split("/");String tempPath = "";for(String dir:dirs){if(null== dir || "".equals(dir)) {continue;}tempPath+="/"+dir;try {sftp.cd(tempPath);} catch (SftpException e1) {try {sftp.mkdir(tempPath);sftp.cd(tempPath);} catch (SftpException e2) {logger.error("创建文件夹失败", e2);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("创建文件夹失败"));}}try{sftp.cd(tempPath);}catch(SftpException e1){logger.error("SFTP服务器异常", e1);//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("SFTP服务器异常"));}}}try {//上传文件sftp.put(input, sftpFileName);} catch (SftpException e) {// TODO Auto-generated catch blocklogger.error("上传文件失败", e);// throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("上传文件失败"));success = false;} finally {logout(sftp);}logger.info("SftpUtils upload end");return success;}/*** 下载文件。* directory 下载目录* downloadFile 下载的文件* saveFile 存在本地的路径*/public static boolean download(String host, int port, String username, String password, String filePath, final OutputStream outputStream) {logger.info("SftpUtils download begin");boolean downloaded = true;ChannelSftp sftp = login(host, port, username, password);String fileName = null;try {if (filePath != null && !"".equals(filePath)) {String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);}fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.get(fileName, outputStream);} catch (SftpException e) {downloaded = false;logger.error("FTP服务器异常", e);} finally {logout(sftp);}logger.info("SftpUtils download end");return downloaded;}/*** 删除文件* directory 要删除文件所在目录* deleteFile 要删除的文件*/public static boolean delete(String host, int port, String username, String password, String filePath){logger.info("SftpUtils delete begin");boolean success = true;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));sftp.cd(directory);String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);sftp.rm(fileName);} catch (SftpException e) {logger.error("文件删除失败", e);success = false;} finally {logout(sftp);}logger.info("SftpUtils delete end");return success;}/*** 列出目录下的文件* directory 要列出的目录* sftp*/public static boolean isFileExist(String host, int port, String username, String password, String filePath) {boolean success = false;ChannelSftp sftp = null;try {sftp = login(host, port, username, password);String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);Vector<?> vector = sftp.ls(directory);for (Object obj : vector) {if (obj != null) {LsEntry lsEntry = (LsEntry) obj;if (fileName.equals(lsEntry.getFilename())) {success = true;break;}}}} catch (Exception e) {logger.error("sftp服务器异常");} finally {logout(sftp);}return success;}}

业务类ImportSourceController

package org.apache.dolphinscheduler.api.controller;import org.apache.dolphinscheduler.api.utils.SFTPUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.*;import java.io.*;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;/*** data source controller*/@RestController@RequestMapping("importSource")public class ImportSourceController extends BaseController {private static final Logger logger = LoggerFactory.getLogger(ImportSourceController.class);/*** sftp获取上传暂存文件* @param uploadFile 上传的文件路径* @param sftpFileName 存放的文件名称* @return* @throws SQLException*/@PostMapping("/getHeadBack")@ResponseBodypublic List<String> getHeadBack(@RequestParam("uploadFile") String uploadFile,@RequestParam("sftpFileName") String sftpFileName) throws FileNotFoundException {List<String> headlist = new ArrayList<String>();InputStream input = new InputStream() {@Overridepublic int read() throws IOException {return 0;}};File file = new File(uploadFile);String host = "192.168.1.92";String port = "22";String username = "root";String password = "rootroot";String basePath = "/opt/testSFTP/";//String sftpFileName = "wx";//上传文件SFTPUtils.upload(host,Integer.valueOf(port),username,password,basePath,sftpFileName,new FileInputStream(file));return headlist;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。