当前位置: 首页 > article >正文

sshj使用代理连接服务器

之前我是用jsch连接服务器的,但是没办法使用私钥连接,搜了一下似乎是不支持新版的SSH-rsa,并且jsch很久没更新了,java - "com.jcraft.jsch.JSchException: Auth fail" with working passwords - Stack Overflow

没办法只好使用sshj来连接,但是sshj并没有找到任何和proxy相关的方法,我在网上也没找到任何sshj使用代理的文章,只好去看git上的源码,发现在老版本是有proxy方法的,在0.33分支上废弃后删掉了,这个信息后来也删除了,只有看history才能看到,实属有点坑

可以看出来要通过注入SocketFactory来实现代理,sshj连接的代码我就不放了,网上都有,就放代理相关的代码

自定义ProxySocketFactory

import javax.net.SocketFactory;
import java.io.IOException;
import java.net.*;

public class ProxySocketFactory extends SocketFactory {

    private final Proxy proxy;

    public ProxySocketFactory(Proxy proxy) {
        this.proxy = proxy;
    }

    @Override
    public Socket createSocket() {
        return new Socket(proxy);
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
        Socket socket = new Socket(proxy);
        socket.connect(new InetSocketAddress(host, port));
        return socket;
    }

    @Override
    public Socket createSocket(InetAddress address, int port) throws IOException {
        Socket socket = new Socket(proxy);
        socket.connect(new InetSocketAddress(address, port));
        return new Socket(address, port);
    }

    @Override
    public Socket createSocket(String host, int port, InetAddress clientAddress, int clientPort) throws IOException, UnknownHostException {
        Socket socket = new Socket(proxy);
        socket.bind(new InetSocketAddress(clientAddress, clientPort));
        socket.connect(new InetSocketAddress(host, port));
        return socket;
    }

    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) throws IOException {
        Socket socket = new Socket(proxy);
        socket.bind(new InetSocketAddress(clientAddress, clientPort));
        socket.connect(new InetSocketAddress(address, port));
        return socket;
    }
}

在SSHClient.connect之前注入

if(!StringUtils.isEmpty(proxy)){
    //proxy=127.0.0.1:2100
    String[] split = proxy.split(":");
    sshClient.setSocketFactory(new ProxySocketFactory(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(split[0], Integer.valueOf(split[1])))));
}
sshClient.connect(host,port);


http://www.kler.cn/news/308726.html

相关文章:

  • as 类型断言
  • 动手学深度学习(四)卷积神经网络-下
  • 飞书项目管理使用攻略
  • MySQL基于GTID同步模式搭建主从复制
  • Spring Boot-API版本控制问题
  • 【Linux修行路】信号的产生
  • AI与自然语言处理(NLP):中秋诗词生成
  • ffmpeg硬件解码一般流程
  • 关于RabbitMQ重复消费的解决方案
  • 大数据新视界 --大数据大厂之数据挖掘入门:用 R 语言开启数据宝藏的探索之旅
  • 图数据库的力量:深入理解与应用 Neo4j
  • Vue2知识点
  • makefile 的语法(7):函数 word wordlist words firstword lastword ;
  • SurrealDB:现代应用的端到端云原生数据库解决方案
  • Golang | Leetcode Golang题解之第401题二进制手表
  • 【图像拼接】基于SIFT/SURF特征算法的图像拼接,matlab实现
  • 【重学 MySQL】三十三、流程控制函数
  • 探索未来游戏边界:AI驱动的开放世界RPG引擎与UGC平台
  • 【每日一题】LeetCode 2332.坐上公交的最晚时间(数组、双指针、二分查找、排序)
  • 大数据新视界 --大数据大厂之Kafka消息队列实战:实现高吞吐量数据传输
  • Wophp靶场漏洞挖掘
  • 如何在webots中搭建一个履带机器人
  • RISC-V交叉编译器下载
  • 誉龙视音频综合管理平台 RelMedia/FindById SQL注入漏洞复现
  • 如何为聊天机器人添加检索功能:增强响应能力
  • 已开源!无限场景生成和高效数据迁移:3D金字塔扩散模型斩获ECCV24 Oral
  • 错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
  • 设计模式 桥接模式(Bridge Pattern)
  • MySQL——数据库的高级操作(三)权限管理(1)MySQL 的权限
  • 基于微信小程序的高校实验室管理系统的设计与实现