JAVA应用】java通过jsch连接sftp是属于长连接么?

2020-04-09 17:01发布

1条回答
小猪仔
2楼 · 2020-10-13 13:56

当系统与系统之间的通信需要大文件共享数据,并且是远程的关系,很多时候都会用到安全的文件传输协议SFTP。

       到目前为止,碰到了两种关于SFTP的链接方式:

  • 基于用户名密码的方式连接SFTP;

  • 基于密匙的方式连接SFTP(可以无密码登陆);

        两种的主要区别在于后者需要有SFTP服务器的密匙文件、以专网IP(SFTP服务端只允许报备过的IP访问)开放的形式获取文件,这样的安全性应该更高些。

 

以下是基于jsch的两种连接方式:

Java代码  收藏代码

  1. /** 用户名密码的方式连接SFTP 

  2.  * @param host 

  3.  * @param port 

  4.  * @param username 

  5.  * @param password 

  6.  * @return 

  7.  */  

  8. public ChannelSftp connect(String host, int port, String username, String password) throws JSchException{  

  9.     ChannelSftp csftp = null;  

  10.     JSch jsch = new JSch();  

  11.     Session sshSession = jsch.getSession(username, host, port);  

  12.   

  13.     sshSession.setPassword(password);  

  14.     Properties sshConfig = new Properties();  

  15.     sshConfig.put("StrictHostKeyChecking""no");  

  16.     sshSession.setConfig(sshConfig);  

  17.     sshSession.connect();//可设置超时时间  

  18.   

  19.     Channel channel = sshSession.openChannel("sftp");  

  20.     channel.connect();//可设置超时时间  

  21.   

  22.     csftp = (ChannelSftp)channel;  

  23.     return csftp;  

  24. }  

  25.   

  26. /** 

  27.  * 支持密钥的方式登陆 

  28.  * @param ip 

  29.  * @param username 

  30.  * @param password 非必须 

  31.  * @param port 

  32.  * @param privateKey 必须,由远程SFTP服务器生成提供并存放在客户端服务器上 

  33.  * @param passphrase 非必须 

  34.  */  

  35. public ChannelSftp connectWithKey(String ip, String username, String password, int port, String privateKey, String passphrase) throws Exception{  

  36.     JSch jsch = new JSch();  

  37.     if (privateKey != null && !"".equals(privateKey)) {//设置密钥和密码  

  38.         if (passphrase != null && "".equals(passphrase)) {//设置带口令的密钥  

  39.             jsch.addIdentity(privateKey, passphrase);  

  40.         } else {  

  41.             jsch.addIdentity(privateKey);//设置不带口令的密钥  

  42.         }  

  43.     }  

  44.   

  45.     Session session = null;  

  46.     if(port <=0){//连接服务器,采用默认端口  

  47.         session = jsch.getSession(username, ip);  

  48.     }else{//采用指定的端口连接服务器  

  49.         session = jsch.getSession(username, ip ,port);  

  50.     }  

  51.     if (session == null) {//如果服务器连接不上,则抛出异常  

  52.         throw new Exception("session is null");  

  53.     }  

  54.     if(StringUtils.isNotBlank(password))//密码不为空则设置密码  

  55.         session.setPassword(password);  

  56.   

  57.     Properties sshConfig = new Properties();  

  58.     sshConfig.put("StrictHostKeyChecking""no");//设置第一次登陆的时候提示,可选值:(ask | yes | no)  

  59.     session.setConfig(sshConfig);  

  60.     session.connect();//设置登陆超时时间  

  61.     Channel channel = (Channel)session.openChannel("sftp");//创建sftp通信通道  

  62.     channel.connect();  

  63.     ChannelSftp sftp = (ChannelSftp)channel;  

  64.     return sftp;  

  65. }  

  66.   

  67. /** 

  68.  * 密钥方式调用示例 

  69.  * 其中"/usr/local/.ssh/xxx_remote_rsa"为SFTP服务器生成并提供给调用客户端服务器,并存放在客户端服务器上 

  70.  * @return 

  71.  * @throws SftpException  

  72.  */  

  73. public void doVisit(){  

  74.     try{  

  75.         ChannelSftp sftp = ftp.connectWithKey(host, username, null, port, "/usr/local/.ssh/xxx_remote_rsa",null);//支持密钥的方式登陆  

  76.     }catch(Exception e){  

  77.         e.printStackTrace();  

  78.     }  

  79. }  


相关问题推荐

  • 回答 20

    100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 400 语义有误,当前请求无法被服务器理解。 401 当前请求需要用户验证...

  • 回答 5
    已采纳

    1、相同点(1)都是表现层框架,都是基于MVC设计模型(2)底层都离不开 Servlet API(3)处理请求的机制都是一个核心控制器2、不同点(1)SpringMVC的入口是Servlet,而Struts2的入口是Filter(2)SpringMVC是基于方法设计的,而Struts2是基于类(3)SpringMV...

  • 回答 22
    已采纳

    类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结...

  • 回答 23
    已采纳

    (1)idea启动时会有两个快捷方式,安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次...

  • 回答 12
    已采纳

    获取Map集合中所有的key可以通过map集合的keySet()方法获取例如:    Map map = new HashMap();    map.put(xx,xx); //存放数据    //.... 省略    Set set = map.keySet();    //可以通过迭代器进行测试    Iterator iter = set.iter...

  • 回答 4
    已采纳

    Java中有八种数据类型,基础数据类型分别是:byte,short,int,long,float,double,char,boolean,引用数据类型分别是:数组,类和接口。方法传参的时候我们有两种,一种是形式参数(定义方法时写的参数),一种是实际参数(调用方法时给的具体值)。首先...

  • 回答 15
    已采纳

    现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。分布式架构其实就是分布式系...

  • 回答 10

    1、监控GC的状态使用各种JVM工具,查看当前日志,分析JVM参数的设置,分析堆内存快照和GC日志,根据实际的各区域的内存划分和GC的执行时间,判断是否需要进行优化2、分析结果、判断是否需要优化如果各项参数设置合理,系统没有超时的日志出现,GC频率也不高,...

  • 回答 9
    已采纳

    从两个方面对ElasticSearch和Solr进行对比,从关系型数据库中的导入速度和模糊查询的速度。单机对比1. Solr 发布了4.0-alpha,试了一下,发现需要自己修改schema,好处是它自带一个data importer。在自己的计算机上测试了一下,导入的性能大概是:14分钟导入 ...

  • 回答 10
    已采纳

    操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进 程协调、通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能 继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,谁也不能解 ...

  • 回答 6

    MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以...

  • 回答 6

    学vue应该要先学习javascript 的基础知识和用法。

  • 回答 7

    synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 2. 修饰一个方法,被修饰的方法称为同步方法,其作用...

  • 回答 9

    是一个文件服务器,用来上传下载文件.它是一个分布式集群的.分2个角色调度和存储.上传时配置调度后上传.用的时候需要搭建.如果不会搭建想省事还可以选择阿里的oss .项目中应用还是比较多的因为一般项目都有文件上传和下载.选择目前就这2种方案.根据公司情况选...

  • 回答 8

    使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。...

  • 回答 6

    一、装箱和拆箱原始类型转换为对象类型就是装箱,反之就是拆箱。原始类型byte,short,char,int,long,float,double,boolean对应的封装类为Byte,Shor,Character,Integer,Long,Float,Double,Boolean.二、源码解读自动装箱时编译器调用valueOf将原始类型值转换成对...

没有解决我的问题,去提问