好的,这是我的问题。
我在我的本地工作站上工作。我有一些机器在防火墙后面,我需要从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库)登录此防火墙?
答案 0 :(得分:2)
盲目连接到端口22可能不会将您引导到防火墙的网页,因此JSch不会为您处理。连接时,您将引发异常。捕获此然后您可以使用普通的http调用端口80触发防火墙重定向,然后获取重定向,解析结果并使用正确的表单数据发送HTTP POST。
如果防火墙表单和地址始终相同,您可以在尝试连接SSH之前直接发送POST。
您可以使用标准类,请参阅 Java - sending HTTP parameters via POST method easily
答案 1 :(得分:0)
令人惊讶的是,一旦您登录到您的代理,您就可以访问远程计算机的端口22,但无论如何......
JSch不会帮助您,但您可以使用能够处理正确代理身份验证机制的HTTP客户端轻松模拟您的Web浏览器在Java中所执行的操作。
从Java 6开始,提供的URLConnection可以处理NTLM(除SOCKS和HTTP代理之外)。无论如何,我建议使用HttpClient 4.2.x,它将提供更多选项和灵活性,以帮助您调试任何问题。