2014-05-20 2 views
1

동료 자바 프로그래머에게 보냅니다. 나는 다른 서버에서 웹 페이지를로드하기 위해 서버에 SSH 연결을 사용하는 작업에 직면 해있다. 꽤 빨리 네트워킹 프로토콜에 대한 지식이 극히 제한적이라는 것을 알게되었습니다. 첫째, 역동적 인 포트 포워딩을 시도했습니다. 아무리해도 상용 라이브러리에서만 사용할 수 있습니다. 그런 다음 JSch를 사용하여 직접 tcp-IP 채널이라는 개념을 만들 수 있다는 것을 알았습니다.이 개념을 사용하여 HTTP를 보내야하는 stackoverflow에서 일부 코드를 발견했습니다. JSch를 사용하여 다른 서버에 대한 SSH 연결을 통해 원격 서버에 요청합니다. com.jcraft.jsch.JSchException : 채널이 개방되지 않은 여기 (약간 TCP Connection over a secure ssh connection에서 일본어로 수정) 코드자바 JSch SSH 터널링은 HTTP 또는 HTTP 요청을 원격 서버

String host = "66.104.230.49"; 
    String user = "admin"; 
    String password = "default"; 
    int port = 22; 

    String remoteHost = "souzpp.ru"; 
    int remotePort = 80; 

    int localPort = 5001; 
    int assignedPort; 
    String localHost = "127.0.0.1"; 

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

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

     System.out.println(assignedPort); 
     ((ChannelDirectTCPIP)channel).setHost(localHost); 
     ((ChannelDirectTCPIP)channel).setPort(assignedPort); 

     String cmd = "GET /files/inst HTTP/1.0\r\n\r\n"; 

     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); 

     out.flush(); 
     channel.disconnect(); 
     session.disconnect(); 

     System.out.println("Request supposed to have been sent"); 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
      for (String line; (line = reader.readLine()) != null;){ 
       System.out.println(line); 
      } 
     } catch (java.io.IOException exc) { 
      System.out.println(exc.toString()); 
     } 

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

이 코드는 다음과 같은 예외가 발생이다. 여기에 무슨 문제가있을 수 있습니까? 답변이 네트워킹 논리의 실수와 관련이 있고 구현상의 오류가 아니라면 잘못된 정보가있는 링크를 제게 알려 주시면 정말 기쁩니다.

:

답변

1
InputStream in = channel.getInputStream(); 
[...] 
channel.disconnect(); 
session.disconnect(); 
[...] 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
for (String line; (line = reader.readLine()) != null;){ 

TCP 스트림 채널을 닫은 다음 전체 SSH 세션을 닫고 채널에서 읽으려고합니다.

실제로 끝내기 전까지는 SSH 세션이나 채널을 닫지 마십시오.

-1

당신이 먼저 SSH 터널을 설정하는 옵션이 있나요 (EDIT은 JavaCoderEx에 의해 제안 포트 포워딩을 추가)?

내가이 포함 된 스크립트를 생성 : sudo ssh -i /Users/myuser/.ssh/id_rsa -2 -f -N [email protected] -L 8080/127.0.0.1/80

위의 코드는 역 SSH 터널을 만듭니다, 8080에서 로컬 호스트로 만들어진 요청은 터널을 통과하고 다른 쪽 (80)에 요청 끝나게. 이제 사용자 요청에 응답하고 다른 서버에 대한 스트림 (URL 연결)을 열 수있는 스트림을 만들 수 있습니다. 본질적으로 이제는 프록시를 만듭니다.

+0

왜 역 SSH 터널입니까? 내가 SSH 터널링/포트 포워딩을 이해 한 것에서부터, 로컬 포트 ​​포워딩 (원격/리버스가 아님)이 필요한 것은 아닙니까? 오후 8시 30 분 P.S. 로컬 포트 ​​포워딩으로 코드를 업데이트했지만 여전히 작동하지 않습니다. 제발 봐주세요 – Mints97

+0

localhost의 명령 줄에 있다면 - 터널을 열고 SSH 명령을 실행 한 다음 wget 또는 curl - 작동합니까? 문제를 일으키는 기본 ssh 연결 인 경우 코드의 문제 해결에 대해 우려하고 있습니다. – JavaCoderEx