channelsftp的put_java实现sftp客户端上传文件以及文件夹的功能代码

1.依赖的jar文件 jsch-0.1.53.jar

2.登录方式有密码登录,和密匙登录

代码:

主函数:

import java.util.Properties;

import com.cloudpower.util.Login;

import com.util.LoadProperties;

public class Ftp {

public static void main(String[] args) {

Properties properties = LoadProperties.getProperties();

Login.login(properties);

}

}

登陆页面的代码:

package com.cloudpower.util;

import java.io.Console;

import java.util.Properties;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.Session;

public class Login {

public static void login(Properties properties) {

String ip = properties.getProperty("ip");

String user = properties.getProperty("user");

String pwd = properties.getProperty("pwd");

String port = properties.getProperty("port");

String privateKeyPath = properties.getProperty("privateKeyPath");

String passphrase = properties.getProperty("passphrase");

String sourcePath = properties.getProperty("sourcePath");

String destinationPath = properties.getProperty("destinationPath");

if (ip != null && !ip.equals("") && user != null && !user.equals("")

&& port != null && !port.equals("") && sourcePath != null

&& !sourcePath.equals("") && destinationPath != null

&& !destinationPath.equals("")) {

if (privateKeyPath != null && !privateKeyPath.equals("")) {

sshSftp2(ip, user, Integer.parseInt(port), privateKeyPath,

passphrase, sourcePath, destinationPath);

} else if (pwd != null && !pwd.equals("")) {

sshSftp(ip, user, pwd, Integer.parseInt(port), sourcePath,

destinationPath);

} else {

Console console = System.console();

System.out.print("Enter password:");

char[] readPassword = console.readPassword();

sshSftp(ip, user, new String(readPassword),

Integer.parseInt(port), sourcePath, destinationPath);

}

} else {

System.out.println("请先设置配置文件");

}

}

/**

* 密码方式登录

*

* @param ip

* @param user

* @param psw

* @param port

* @param sPath

* @param dPath

*/

public static void sshSftp(String ip, String user, String psw, int port,

String sPath, String dPath) {

System.out.println("password login");

Session session = null;

JSch jsch = new JSch();

try {

if (port <= 0) {

// 连接服务器,采用默认端口

session = jsch.getSession(user, ip);

} else {

// 采用指定的端口连接服务器

session = jsch.getSession(user, ip, port);

}

// 如果服务器连接不上,则抛出异常

if (session == null) {

throw new Exception("session is null");

}

// 设置登陆主机的密码

session.setPassword(psw);// 设置密码

// 设置第一次登陆的时候提示,可选值:(ask | yes | no)

session.setConfig("StrictHostKeyChecking", "no");

// 设置登陆超时时间

session.connect(300000);

UpLoadFile.upLoadFile(session, sPath, dPath);

} catch (Exception e) {

e.printStackTrace();

}

System.out.println("success");

}

/**

* 密匙方式登录

*

* @param ip

* @param user

* @param port

* @param privateKey

* @param passphrase

* @param sPath

* @param dPath

*/

public static void sshSftp2(String ip, String user, int port,

String privateKey, String passphrase, String sPath, String dPath) {

System.out.println("privateKey login");

Session session = null;

JSch jsch = new JSch();

try {

// 设置密钥和密码

// 支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了

if (privateKey != null && !"".equals(privateKey)) {

if (passphrase != null && "".equals(passphrase)) {

// 设置带口令的密钥

jsch.addIdentity(privateKey, passphrase);

} else {

// 设置不带口令的密钥

jsch.addIdentity(privateKey);

}

}

if (port <= 0) {

// 连接服务器,采用默认端口

session = jsch.getSession(user, ip);

} else {

// 采用指定的端口连接服务器

session = jsch.getSession(user, ip, port);

}

// 如果服务器连接不上,则抛出异常

if (session == null) {

throw new Exception("session is null");

}

// 设置第一次登陆的时候提示,可选值:(ask | yes | no)

session.setConfig("StrictHostKeyChecking", "no");

// 设置登陆超时时间

session.connect(300000);

UpLoadFile.upLoadFile(session, sPath, dPath);

System.out.println("success");

} catch (Exception e) {

e.printStackTrace();

}

}

}

文件上传的代码:

package com.cloudpower.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.Scanner;

import com.jcraft.jsch.Channel;

import com.jcraft.jsch.ChannelSftp;

import com.jcraft.jsch.Session;

import com.jcraft.jsch.SftpException;

public class UpLoadFile {

public static void upLoadFile(Session session, String sPath, String dPath) {

Channel channel = null;

try {

channel = (Channel) session.openChannel("sftp");

channel.connect(10000000);

ChannelSftp sftp = (ChannelSftp) channel;

try {

sftp.cd(dPath);

Scanner scanner = new Scanner(System.in);

System.out.println(dPath + ":此目录已存在,文件可能会被覆盖!是否继续y/n?");

String next = scanner.next();

if (!next.toLowerCase().equals("y")) {

return;

}

} catch (SftpException e) {

sftp.mkdir(dPath);

sftp.cd(dPath);

}

File file = new File(sPath);

copyFile(sftp, file, sftp.pwd());

} catch (Exception e) {

e.printStackTrace();

} finally {

session.disconnect();

channel.disconnect();

}

}

public static void copyFile(ChannelSftp sftp, File file, String pwd) {

if (file.isDirectory()) {

File[] list = file.listFiles();

try {

try {

String fileName = file.getName();

sftp.cd(pwd);

System.out.println("正在创建目录:" + sftp.pwd() + "/" + fileName);

sftp.mkdir(fileName);

System.out.println("目录创建成功:" + sftp.pwd() + "/" + fileName);

} catch (Exception e) {

// TODO: handle exception

}

pwd = pwd + "/" + file.getName();

try {

sftp.cd(file.getName());

} catch (SftpException e) {

// TODO: handle exception

e.printStackTrace();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

for (int i = 0; i < list.length; i++) {

copyFile(sftp, list[i], pwd);

}

} else {

try {

sftp.cd(pwd);

} catch (SftpException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

System.out.println("正在复制文件:" + file.getAbsolutePath());

InputStream instream = null;

OutputStream outstream = null;

try {

outstream = sftp.put(file.getName());

instream = new FileInputStream(file);

byte b[] = new byte[1024];

int n;

try {

while ((n = instream.read(b)) != -1) {

outstream.write(b, 0, n);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} catch (SftpException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

try {

outstream.flush();

outstream.close();

instream.close();

} catch (Exception e2) {

// TODO: handle exception

e2.printStackTrace();

}

}

}

}

}

读取配置文件的代码:

package com.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

public class LoadProperties {

public static Properties getProperties() {

File file = new File(Class.class.getClass().getResource("/").getPath()

+ "properties.properties");

InputStream inputStream = null;

try {

inputStream = new FileInputStream(file);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Properties properties = new Properties();

try {

properties.load(inputStream);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return properties;

}

}

代码目录结构:

测试运行时配置文件放在项目的bin目录下(打包成可运行jar文件的时候要删除,打包完成后将配置文件和jar包放在同级目录下即可):

properties.properties

ip=

user=

pwd=

port=22

privateKeyPath=

passphrase=

sourcePath=

destinationPath=/home/dbbs/f

打包可运行jar文件:

Export->java->Runnabe JAR file

完成后

在控制台运行java -jar  导出jar包的名字.jar 即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qtmessagebox对话框里自定义按钮文本_按钮你可以这样设计

作者&#xff1a;Michal Malewicz译者&#xff1a;Matrix审稿&#xff1a;afang原文链接&#xff1a;https://uxdesign.cc/design-better-buttons-a5c90a113280文章由交译所成员翻译&#xff0c;如需转载&#xff0c;请先申请授权。译文如下&#xff1a;按钮是触发它所描述功能…

zabbix入门之添加主机

添加主机的方法有两种&#xff1a;手动添加、自动发现 前提是&#xff1a;在被监控主机中安装zabbix-agent、zabbix-sender组件&#xff0c;并配置好启动服务。 手动添加&#xff1a; 自动发现&#xff1a; 这里等待1分钟左右即可发现主机 开启默认的动作 等待几分钟后即可在“…

程序5

【程序5】 题目&#xff1a;利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间的用B表示&#xff0c;60分以下的用C表示。 1.程序分析&#xff1a;(a>b)?a:b这是条件运算符的基本例子。方法一&#xff1a;    function…

[html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?

[html] 页面上的登录表单记住了密码&#xff08;显示星号&#xff09;&#xff0c;但我又忘了密码&#xff0c;如何找回这个密码呢&#xff1f; 将密码input的type改为text或者为空&#xff0c;则会显示输入框值。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识…

如何保持连接_工高连城 | 连接器连接失效的原因有哪些

【温馨提示】本公众号是工高电子旗下工高连城中国连城双电商平台的官方公众号&#xff0c;简称工高连城连接器商城 中国连城平台定位&#xff1a;中国连接器行业专业供应链服务平台中国连接器行业的阿里巴巴永不落幕的online线上慕尼黑连接器展会。中国连城官网&#xff1a;w…

centos7删除文件命令_干货 | 玩转云文件存储——利用CFS实现web应用的共享访问...

京东云文件服务(Cloud File Service,以下简称&#xff1a;CFS)是一种高可靠、可扩展、可共享访问的全托管分布式文件系统。它可在不中断应用服务的情况下&#xff0c;根据您对文件系统的使用&#xff0c;按需扩展或缩减&#xff0c;并按照实际用量计费。采用NFS协议&#xff0c…

1-4dockerfile基本使用

1.创建一个文件夹 mkdir mynginxcd mynginxtouch Dockerfile [rootVM_0_10_centos mynginx]# cat Dockerfile FROM nginx:1.17 #第一次镜像RUN echo echo <h1>Hello, zjy!</h1> > /usr/share/nginx/html/index.html1-1、如果说没有第一层镜像&#xff0c;是…

[html] 移动端如何设置页面以全屏模式运行?

[html] 移动端如何设置页面以全屏模式运行&#xff1f; <meta name"apple-mobile-web-app-capable" content"yes" /> 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

zTree v2.6 - v3.0 文件对比

转载于:https://www.cnblogs.com/MyFlora/archive/2012/06/05/2536377.html

cocos creator 数组_CoCos Creator中的数据类型

常用到的基本数据类型有Integer、String、Vec2、Color&#xff0c;下面的是它们最基本的使用展示&#xff1a;properties: {myNumber:{default:0,type:cc.Integer,},myString:{default:HaHa,},myVec2:{default:cc.Vec2.ZERO,},myColor:{default:cc.Color.RED,},myOtherNumber:0…

lvs服务器需要开启web服务么_Centos7搭建LVS+Keepalived高可用Web

LVS Keepalived 高可用集群Keepalived的设计目标是构建高可用的LVS负载均衡的集群&#xff0c;可以调用ipvsadm工具创建虚拟机&#xff0c;不仅仅用作双机热备&#xff0c;还可以使用keepalived构建更加方便快捷的节点&#xff0c;进行相关的健康检查&#xff0c;自动移除失效…

1-5docker私有镜像仓库

1、简单操作 1、在 https://cloud.docker.com 免费注册一个 Docker 账号 2、登录 docker login #命令登录 Docker Hub。 3、注销docker logout # 退出登录。 拉取镜像 4、docker search #命令来查找官方仓库中的镜像 5、docker pull 命令来将它下载到本地。#推送镜像到自己…

[html] 写html代码时,如果缺少了结束标签,你如何检测及如何预防?

[html] 写html代码时&#xff0c;如果缺少了结束标签&#xff0c;你如何检测及如何预防&#xff1f; HTML是一门宽松式语言。即使在语法上出现了错误&#xff0c;浏览器还是会直接解析并显示结果。 2, 为了预防类似缺少结束标签这类错误。可以用过由W3C提供的标记验证服务。通…

最长上升子序列——动态规划

这个是用动态规划做的一道题&#xff0c;先学习一下动态规划的概念吧。 用动态规划解题&#xff0c;就是要把问题分解为一个个子问题&#xff0c;对子问题进行求解&#xff0c;而子问题又可以继续进行分解&#xff0c;直到一定小的规模。DP与递归类似&#xff0c;但递归会导致…

NCoreCoder.Aop详解

于今天&#xff0c;功能终于完善度到比较满意的程度了 准备好好写一篇文章&#xff0c;而不是之前的流水账&#xff0c;分享一下最近这些天的踩坑 一开始AOP选的微软提供的DispatchProxy 关于这个&#xff0c;有大佬的文章&#xff0c;可以看看&#xff0c;了解一下 https://ww…

主类网络号怎么算_一文了解网络文化经营许可证的审批范围

3月10日&#xff0c;北京市文化和旅游局发布《关于电商类、教育类、医疗类、培训类、金融类、旅游类、美食类、体育类、聊天类不需要申请办理的特别提示》(以下简称《特别提示》)。《特别提示》指出&#xff0c;随着互联网技术的快速发展&#xff0c;利用互联网从事文化经营活动…

idea命令行运行多个客户端_推荐一款神仙颜值的 Redis 客户端工具,开源啦

日常开发过程中&#xff0c;项目常常都会使用Redis来做缓存或者Session服务器&#xff0c;为了更直观方便&#xff0c;开发者常常会使用一些可视化工具&#xff0c;如 Redis Desktop Manager、Redis Clent等&#xff0c;但界面UI做得不尽人意&#xff0c;作为当今时代&#xff…

[html] 写html代码时,如果缺少了结束标签,你如何检测及如何预防?

[html] 写html代码时&#xff0c;如果缺少了结束标签&#xff0c;你如何检测及如何预防&#xff1f; 现在的编辑器如vscode就有语法检测 可以装一些代码自动完成插件预防此类事件个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

使用matlab判断CDMA接收码片

CDMA码分多址matlab计算 Contents 运算前工作原题表述:码片长度m发送序列为数据分析:运算前工作 clc clear all close all原题表述: ▇4个站的码片序列是a,b,c,d disp(▇4个站的码片序列为:) a[-1 -1 -1 1 1 -1 1 1] b[-1 -1 1 -1 1 1 1 -1] c[-1 1 -1 1 1 1 -1 -1] d[-1 1 -1 …

docker 挂载主机目录 -v 和 --mount区别

使用-v 时&#xff0c;如果宿主机上没有这个文件&#xff0c;也会自动创建&#xff0c; 但是如果使用--mount时&#xff0c;宿主机中没有这个文件会报错找不到这个文件&#xff0c;并创建失败 转载于:https://www.cnblogs.com/zhaojingyu/p/11599473.html