2013-03-04 3 views
0

JSCH를 사용하여 원격 서버에 연결하려고 시도하고 해당 서버에서 tcp/ip 포트를 통해 텔넷 세션을 엽니 다. 서버 A에 연결하고 연결되면 다른 포트를 통해 서버 B에 tcp 연결을 실행합니다. 내 웹 서버 로그에서 GET/GET/foo를 볼 수 있습니다. 내가 여기 놓친 게 있니?안전한 ssh 연결을 통한 TCP 연결

package com.tekmor; 

import com.jcraft.jsch.*; 

import java.io.BufferedReader; 
. 
. 

public class Siranga { 

    public static void main(String[] args){ 
     Siranga t=new Siranga(); 
      try{ 
       t.go(); 
      } catch(Exception ex){ 
       ex.printStackTrace(); 
     } 
    } 
    public void go() throws Exception{ 
     String host="hostXXX.com"; 
     String user="USER"; 
     String password="PASS"; 
     int port=22; 

     Properties config = new Properties(); 
     config.put("StrictHostKeyChecking", "no");  

     String remoteHost="hostYYY.com"; 
     int remotePort=80; 


     try { 
     JSch jsch=new JSch(); 
     Session session=jsch.getSession(user, host, port); 
     session.setPassword(password); 
     session.setConfig(config); 
     session.connect(); 
     Channel channel=session.openChannel("direct-tcpip"); 


     ((ChannelDirectTCPIP)channel).setHost(remoteHost); 
     ((ChannelDirectTCPIP)channel).setPort(remotePort); 

     String cmd = "GET /foo"; 

     InputStream in = channel.getInputStream(); 
     OutputStream out = channel.getOutputStream(); 

     channel.connect(10000); 

     byte[] bytes = cmd.getBytes();   
     InputStream is = new ByteArrayInputStream(cmd.getBytes("UTF-8")); 

     int numRead; 

     while ((numRead = is.read(bytes)) >= 0) { 
       out.write(bytes, 0, numRead); 
       System.out.println(numRead); 
     } 

     out.flush(); 



     channel.disconnect(); 
     session.disconnect(); 

     System.out.println("foo"); 

     } 
     catch (Exception e){ 
      e.printStackTrace(); 

     } 

    } 
} 

답변

0

는 다시 HTTP specification 읽기 (원격 포트는 I가 연결하고 시스템에 액세스 할 수 있기 때문에 나는 포트 포워딩을 사용할 필요가 없습니다). 요청 헤더는 빈 줄로 끝나야합니다. 헤더 라인이 더 이상 없다고 가정 할 때, 적어도 줄 바꿈을해야합니다. 여기에서 줄 바꿈은 CRLF 조합을 의미합니다.

또한 요청 줄에는 URL 다음에 HTTP 버전 식별자가 있어야합니다.

그래서 당신의 프로그램이 변화를 시도 :

String command = "GET /foo HTTP/1.0\r\n\r\n"; 

을 힌트로 대신 수동으로 채널의 출력 스트림에이 InputStream에서 데이터를 배관, 당신은 setInputStream method을 사용할 수 있습니다. 또한 채널의 입력 스트림에서 결과를 읽는 것을 잊지 마십시오.