1、Maven引入jar

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

2、Test类

package com.tandaima.pub;

import java.io.*;
import java.util.Properties; import com.jcraft.jsch.*; /**
* User longpizi
* Date: 2019/10/30
* Time: 14:40
*/
public class SftpUtil {
public static final String CHANNELTYPE_SFTP="sftp";
public static final String CHANNELTYPE_EXEC="exec";
private Session session;//会话
private Channel channel;//连接通道
private ChannelSftp sftp;// sftp操作类
private JSch jsch;
protected static String host=getLinuxParam()[0];
protected static String port=getLinuxParam()[1];
protected static String user=getLinuxParam()[2];
protected static String password=getLinuxParam()[3]; private static String[] getLinuxParam(){
Properties props=new Properties();//读取文件类型创建对象。
try {
ClassLoader classLoader = SftpUtil.class.getClassLoader();// 读取属性文件
InputStream in = classLoader.getResourceAsStream("linux.properties");
props.load(in); /// 加载属性列表
if(in!=null){
in.close();
}
} catch (Exception e) {
System.out.println("Linux连接参数异常:"+e.getMessage());
}
String[] str={"","","",""};
str[0]=props.getProperty("file.host");
str[1]=props.getProperty("file.port");
str[2]=props.getProperty("file.user");
str[3]=props.getProperty("file.password");
return str;
}
/**
* 断开连接
*/
public static void closeConnect(Session session, Channel channel, ChannelSftp sftp){
if (null != sftp) {
sftp.disconnect();
sftp.exit();
sftp = null;
}
if (null != channel) {
channel.disconnect();
channel = null;
}
if (null != session) {
session.disconnect();
session = null;
}
System.out.println("连接已关闭");
} /**
* 连接ftp/sftp服务器
*
* @param sftpUtil 类
*/
public static void getConnect(SftpUtil sftpUtil,String openChannelType) throws Exception {
Session session = null;
Channel channel = null; JSch jsch = new JSch();
session = jsch.getSession(user, host, Integer.parseInt(port));
session.setPassword(password);
// 设置第一次登陆的时候提示,可选值:(ask | yes | no)
// 不验证 HostKey
session.setConfig("StrictHostKeyChecking", "no");
try {
session.connect();
} catch (Exception e) {
if (session.isConnected())
session.disconnect();
System.out.println("连接服务器失败");
}
channel = session.openChannel(openChannelType);
try {
channel.connect();
} catch (Exception e) {
if (channel.isConnected())
channel.disconnect();
System.out.println("连接服务器失败");
}
sftpUtil.setJsch(jsch);
if(openChannelType.equals(CHANNELTYPE_SFTP)){
sftpUtil.setSftp((ChannelSftp) channel);
}
sftpUtil.setChannel(channel);
sftpUtil.setSession(session); } /**
* 上传文件
*
* @param directory 上传的目录-相对于SFPT设置的用户访问目录
* @param uploadFile 要上传的文件全路径
*/
public static boolean upload(String directory, String uploadFile) {
boolean resultState=false;
SftpUtil sftpUtil = new SftpUtil();
try{
getConnect(sftpUtil,CHANNELTYPE_SFTP);//建立连接
Session session = sftpUtil.getSession();
Channel channel = sftpUtil.getChannel();
ChannelSftp sftp = sftpUtil.getSftp();// sftp操作类
try {
sftp.cd(directory); //进入目录
} catch (SftpException sException) {
if (ChannelSftp.SSH_FX_NO_SUCH_FILE == sException.id) { //指定上传路径不存在
sftp.mkdir(directory);//创建目录
sftp.cd(directory); //进入目录
}
}
File file = new File(uploadFile);
InputStream in = new FileInputStream(file);
sftp.put(in, file.getName());
in.close();
closeConnect(session, channel, sftp);
resultState=true;
}catch (Exception e){
System.out.println("上传文件异常");
}
return resultState;
} /**
* 获取已连接的Sftp
* @return SftpUtil
*/
public static SftpUtil getConnectSftp(){
SftpUtil sftpUtil=new SftpUtil();
try {
getConnect(sftpUtil,CHANNELTYPE_SFTP);//建立连接
return sftpUtil;
}catch (Exception e){
System.out.println("下载文件异常");
}
return null;
} /**
* 删除文件
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
*/
public static boolean delete(String directory, String deleteFile){
boolean resultState=false;
SftpUtil sftpUtil=new SftpUtil();
try {
getConnect(sftpUtil,CHANNELTYPE_SFTP);//建立连接
Session session = sftpUtil.getSession();
Channel channel = sftpUtil.getChannel();
ChannelSftp sftp = sftpUtil.getSftp();// sftp操作类
sftp.cd(directory); //进入的目录应该是要删除的目录的上一级
sftp.rm(deleteFile);//删除目录
closeConnect(session,channel,sftp);
resultState=true;
}catch (Exception e){
System.out.println("删除文件异常");
}
return resultState;
} /**
JSch有三种文件传输模式:
(1)OVERWRITE:完全覆盖模式。JSch的默认文件传输模式,传输的文件将覆盖目标文件。
(2)APPEND:追加模式。如果目标文件已存在,则在目标文件后追加。
(3)RESUME:恢复模式。如果文件正在传输时,由于网络等原因导致传输中断,则下一次传输相同的文件
时,会从上一次中断的地方续传。
*/
/**
* 追加文件内容
* @param remoteFile 原文件路径
* @param in 追加内容
* @return true成功,false失败
*/
public static boolean appendFileContent(String remoteFile, InputStream in){
boolean resultState=false;
SftpUtil sftpUtil = new SftpUtil();
try{
getConnect(sftpUtil,CHANNELTYPE_SFTP);//建立连接
Session session = sftpUtil.getSession();
Channel channel = sftpUtil.getChannel();
ChannelSftp sftp = sftpUtil.getSftp();// sftp操作类
OutputStream out = sftp.put(remoteFile, ChannelSftp.APPEND);
int bufferSize=1024;
byte[] buff = new byte[bufferSize]; // 设定每次传输的数据块大小
int read;
if (out != null) {
do {
read = in.read(buff, 0, buff.length);
if (read > 0) {
out.write(buff, 0, read);
}
out.flush();
} while (read >= 0);
}
if(out!=null){
out.close();
}
closeConnect(session, channel, sftp);
resultState=true;
}catch (Exception e){
System.out.println("写入文件异常");
}
return resultState;
} /**
* 创建文件
* @param fileDir 文件路径
* @param fileName 文件名称
* @return
*/
public static boolean createFile(String fileDir,String fileName){
try{
execute("mkdir -p "+fileDir+"\n" +
"touch "+fileDir+"/"+fileName);
}catch (Exception e){
return false;
}
return true;
} /**
* 创建文件夹
* @param fileDir 文件路径
* @return true成功/false失败
*/
public static boolean createFileDir(String fileDir){
try{
execute("mkdir -p "+fileDir+"");
}catch (Exception e){
return false;
}
return true;
} /**
* 压缩文件夹为ZIP
* @param fileDir 文件路径
* @param fileName 文件名称
* @param additionalName 压缩附加名
* @return
*/
public static boolean zipDir(String fileDir,String fileName,String additionalName){
try{
execute("cd "+fileDir+"\n" +
"zip -r "+fileDir+"/"+fileName+additionalName+".zip "+fileName);
}catch (Exception e){
return false;
}
return true;
} /**
* 获取文件大小 单位(K)
* @param fileDir 文件路径
* @return 文件大小
*/
public static long getFileSize(String fileDir){
return Long.parseLong(execute("ls -l "+fileDir+" | awk '{ print $5 }'"));
}
/**
* 执行liunx 命令
* @param command 命令内容
* @return 命令输出
*/
private static String execute(String command){
SftpUtil sftpUtil=new SftpUtil();
StringBuffer strBuffer=new StringBuffer();
try {
getConnect(sftpUtil,CHANNELTYPE_EXEC);
// Create and connect session.
Session session = sftpUtil.getSession(); // Create and connect channel.
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command); channel.setInputStream(null);
BufferedReader input = new BufferedReader(new InputStreamReader(channel
.getInputStream())); channel.connect();
System.out.println("命令: " + command);
// 获取命令的输出
String line;
while ((line = input.readLine()) != null) {
strBuffer.append(line);
}
input.close();
closeConnect(session,channel,null);
} catch (Exception e) {
e.printStackTrace();
}
return strBuffer.toString();
}
// public static void main(String[] args) throws FileNotFoundException {
// String window_dir="C:\\Users\XXX\\Desktop\\test\\test.txt";
// String liunx_dir="/usr/local/longpizi";
// try {
//// System.out.println(upload(liunx_dir,window_dir));
//// System.out.println(download(liunx_dir,"test.txt","C:\\Users\\XXX\\Desktop\\test"));
//// System.out.println(delete(liunx_dir,"test.txt"));
//
//// InputStream inputStream = new ByteArrayInputStream("this is test".getBytes());
//// System.out.println(appendFileContent(liunx_dir+"/test.txt",inputStream));
//
//// String command="touch /usr/local/longlin/longpizi.sh\nmkdir -p sss";
//// System.out.println(execute(command));
//
//// System.out.println(createFile("/usr/local/longlin/test/sfdsfdf","sss.txt"));
// } catch (Exception e) {
// e.printStackTrace();
// }
// } public JSch getJsch() {
return jsch;
} public void setJsch(JSch jsch) {
this.jsch = jsch;
} public Session getSession() {
return session;
} public void setSession(Session session) {
this.session = session;
} public Channel getChannel() {
return channel;
} public void setChannel(Channel channel) {
this.channel = channel;
} public ChannelSftp getSftp() {
return sftp;
} public void setSftp(ChannelSftp sftp) {
this.sftp = sftp;
}
}

Java使用Sftp实现对跨服务器上传、下载、打包、写入相关操作的更多相关文章

  1. .NET文件跨服务器上传下载

    环境说明:两台服务器服务器为A,服务器为B,服务器B为文件服务器 1.在A和B上创建用户docshareuser,用户名和密码保持一致 2.B服务器上设置附件文件夹Attachments共享,添加用户 ...

  2. jersey实现跨服务器上传

    1.导入跨服务器上传文件jar文件 <dependency> <groupId>commons-io</groupId> <artifactId>com ...

  3. 关于nutz跨服务器上传文件

    关于nutz跨服务器上传文件  发布于 578天前  作者 yong9664  770 次浏览  复制  上一个帖子  下一个帖子  标签: 无 是这样的,项目在一台服务器,文件要存储到另外一台服务器 ...

  4. 阶段3 3.SpringMVC·_05.文件上传_5 文件上传之跨服务器上传分析和搭建环境

    使用这个jar包来跨服务器上传 搞两个tomcat.一个springmvc一个fileupload 选中tomcat server点击左边的加号 需要改端口和JMX pport这个端口 部署文件上传的 ...

  5. idea 内置tomcat jersey 跨服务器 上传文件报400错误

    报错内容 com.sun.jersey.api.client.UniformInterfaceException: PUT http://.jpg returned a response status ...

  6. Android连接socket服务器上传下载多个文件

    android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { ;// 端口号,必须与客户端一致 ...

  7. 向linux服务器上传下载文件方式收集

    向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...

  8. Linux下不借助工具实现远程linux服务器上传下载文件

    # Linux下不借助工具实现远程linux服务器上传下载文件 ## 简介 - Linux下自带ssh工具,可以实现远程Linux服务器的功能- Linux下自带scp工具,可以实现文件传输功能 ## ...

  9. 【转】Android 服务器之SFTP服务器上传下载功能 -- 不错

    原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...

随机推荐

  1. PHP开发-模板的使用

    通过今天晚上半个多小时的赵老师对模板的介绍,大致对模板的使用.结构以及开发模板的思想有了个大致的了解. 为什么要开发模板:模板就是将PHP发过过程中使用到.需要操作的事物封装成对象.以便在使用到的时候 ...

  2. ServletConfig详解

    ServletConfig是Servlet中的init()方法的参数类型,服务器会在调用init()方法时传递ServletConfig对象给init()方法.   ServletConfig对象封装 ...

  3. V-Distpicker不能完整显示内容

    V-Distpicker插件在列表中,或者在dialog中只显示了第一次的内容,第二次就开始报错.这个和前篇中的地图问题其实如出一辙. 解决办法,重加载,局部刷新. <el-form-item ...

  4. 基于Ambari Server部署HDP集群实战案例

    基于Ambari Server部署HDP集群实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署Ambari Server端 博主推荐阅读: https://www.c ...

  5. 996.ICU 爆发,互联网从业者难逃“高薪陷阱”

    从 3 月 27 日开始,截止本文发稿,GitHub 上面的项目 996.ICU 的 Star 数量已经超过 18 万,这场由程序员发动的轰轰烈烈的公开反对 996 工作制的运动,早已突破互联网圈层而 ...

  6. ES6 - 装饰器 - Decorater

        注意,修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时.这意味着,修饰器能在编译阶段运行代码.也就是说,修饰器本质就是编译时执行的函数.   修饰器是一个对类进行处理的函数.修饰器函 ...

  7. 翻译小工具制作,Python简单破解有道JS加密!

    写这篇文章之前,我记得我以前好像公布一次.百度翻译的接口把版本号修改可以得到老版本,而老版本是没JS加密的,有道的呢也是一样的. ! 不过今天的教程不会这么low,咱们今天就老老实实把有道翻译的JS破 ...

  8. 在div中注入html代码

    直接开始: <div id="content"class="modal-body"> </div> 在angularjs中使用如下代码, ...

  9. Swift实现iOS录音与播放音频功能

    作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 #import <AVFoundation/AVFound ...

  10. vmware桥接模式-无法内网通-克隆机要删除的文件-ssl

    网卡太多自动模式有时候无法正常通信需要绑定外部网卡 rm /etc/udev/rules.d/-persistent-ipoib.rules vmware报错 Microsoft Runtime DL ...