JAVA 连接sftp服务器,用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)
生活随笔
收集整理的這篇文章主要介紹了
JAVA 连接sftp服务器,用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JAVA 連接sftp服務器,用戶名密碼方式鏈接
- 添加maven依賴:
- 鏈接SFTP
- 關閉連接 server
- SFTP上傳
- 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 block var 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;}}總結
以上是生活随笔為你收集整理的JAVA 连接sftp服务器,用户名密码方式链接(类似于FinalShell以ssh方式链接LINUX)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UG NX 12 草图 (基础知识)
- 下一篇: 【第135期】游戏策划:给@蒙蒙水雾的简