2013-03-20 37 views
1

好的,這是我的問題。如何從java程序中通過防火牆

我正在使用本地工作站。我在防火牆後面有一些機器,我需要從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) {} 

} 

但我的程序也應該autmaticly登錄到防火牆。如果我從我的Windows命令行使用telnet(端口23)而不是ssh(端口22),則可以從此處登錄到此防火牆。

是否有可能從java代碼(使用JSch或其他java庫)登錄到防火牆?

+0

你可能可以,但方法取決於你的程序試圖連接的協議。 Java的庫從Sockets級別低到Http Client級別。那麼你連接到什麼服務或流程?什麼是防火牆用於驗證您的身份驗證協議? – bell0 2013-03-20 14:28:47

回答

2

盲目連接到端口22可能不會引導您進入防火牆的網頁,所以JSch不會爲您處理。當你連接時,你會引發異常。抓住這個,然後你可以用普通的http調用端口80觸發防火牆重定向,然後抓取重定向,解析結果併發送一個具有正確表單數據的HTTP POST。

如果防火牆表單和地址始終相同,則可以在嘗試連接到SSH之前直接發送POST。

您可以使用標準的類的是,看到 Java - sending HTTP parameters via POST method easily

0

這是很令人驚訝的是,一旦你登錄到您的代理,你可以訪問遠程計算機的端口22,但無論如何...

JSch不會幫你,但你可以很容易地使用一個能夠處理正確的代理驗證機制的HTTP客戶端來模擬你的web瀏覽器在java中的功能。

從Java 6開始,提供的URLConnection可以處理NTLM(除SOCKS和HTTP代理之外)。無論如何,我會推薦使用HttpClient 4.2.x,它將提供更多的選項和靈活性來幫助您調試任何問題。