1

好的,这是我的问题。

我正在本地工作站上工作。我在防火墙后面有一些机器,我需要从 java 代码登录到这台机器。为此,我想使用 JSch 库。如果我将这台机器的 ip 地址输入到网络浏览器,我将被重定向到防火墙登录页面,当我输入我的凭据时,我可以使用 ssh 使用以下代码登录到这台机器:

public void authenticate(String ip, String user, String password) {
    JSch jsch=new JSch();
    try {
        Session session = jsch.getSession(user, ip, 22);
        session.setPassword(password);
        session.setUserInfo(new UserInfoImpl(password));
        session.connect();
        System.out.println("Yes!!");
        session.disconnect();
    } catch (JSchException e) {
        e.printStackTrace();
    }
}

private class UserInfoImpl implements UserInfo{

    private String password;
    public UserInfoImpl(String password){
        this.password = password;
    }

    @Override
    public String getPassphrase() { return null;}
    @Override
    public String getPassword() {return password;}
    @Override
    public boolean promptPassphrase(String arg0) {return true;}
    @Override
    public boolean promptPassword(String arg0) {return true;}
    @Override
    public boolean promptYesNo(String arg0) {return true;}
    @Override
    public void showMessage(String arg0) {}

}

但是我的程序也应该自动登录到防火墙。如果我在 Windows 命令行中使用 telnet(端口 23)而不是 ssh(端口 22),则可以从那里登录到此防火墙。

是否可以从 Java 代码(使用 JSch 或其他一些 Java 库)登录到此防火墙?

4

2 回答 2

2

盲目地连接到端口 22 可能不会将您定向到防火墙的网页,因此 JSch 不会为您处理。连接时,您将引发异常。抓住这一点,然后您可以使用正常的 http 调用端口 80 触发防火墙重定向,然后获取重定向,解析结果并使用正确的表单数据发送 HTTP POST。

如果防火墙形式和地址始终相同,您可以在尝试连接到 SSH 之前直接发送 POST。

您可以为此使用标准类,请参阅 Java - 通过 POST 方法轻松发送 HTTP 参数

于 2013-03-20T14:15:09.437 回答
0

令人惊讶的是,一旦您登录到您的代理,您就可以访问远程机器的 22 端口,但无论如何......

JSch 不会帮助您,但您可以使用能够处理正确代理身份验证机制的 HTTP 客户端轻松模拟 Web 浏览器在 java 中的操作。

从 Java 6 开始,提供的 URLConnection 可以处理 NTLM(除了 SOCKS 和 HTTP 代理)。无论如何,我建议使用HttpClient 4.2.x,它将提供更多选项和灵活性来帮助您调试任何问题。

于 2013-03-20T14:19:44.680 回答