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

java 复制代码
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之前注入

java 复制代码
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);
相关推荐
云飞云共享云桌面10 分钟前
东莞智能装备工厂数字化实践—研发部门10名SolidWorks设计共享一台云主机流畅设计
服务器·自动化·汽车·负载均衡·制造
专注API从业者20 分钟前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
xingyuzhisuan25 分钟前
稳定性考验:连续跑7天,哪家云主机不重启、不掉线?
服务器·人工智能·gpu算力
jsons131 分钟前
给每台虚拟机设置独立控制台密码
linux·运维·服务器
摇滚侠37 分钟前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql
keep one's resolveY1 小时前
SpringBoot实现重试机制的四种方案
java·spring boot·后端
天空属于哈夫克32 小时前
企业微信API常见的错误和解决方案
java·数据库·企业微信
云栖梦泽2 小时前
Linux内核与驱动:14.SPI子系统
linux·运维·服务器·c++
yipiantian2 小时前
在Claude项目中实现跨目录访问Skills
linux·运维·服务器
摇滚侠2 小时前
VMvare 虚拟机 Oracle19c 安装步骤,远程连接 Oracle19c,百度网盘安装包
java·oracle