동료 자바 프로그래머에게 보냅니다. 나는 다른 서버에서 웹 페이지를로드하기 위해 서버에 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();
}
이 코드는 다음과 같은 예외가 발생이다. 여기에 무슨 문제가있을 수 있습니까? 답변이 네트워킹 논리의 실수와 관련이 있고 구현상의 오류가 아니라면 잘못된 정보가있는 링크를 제게 알려 주시면 정말 기쁩니다.
:
왜 역 SSH 터널입니까? 내가 SSH 터널링/포트 포워딩을 이해 한 것에서부터, 로컬 포트 포워딩 (원격/리버스가 아님)이 필요한 것은 아닙니까? 오후 8시 30 분 P.S. 로컬 포트 포워딩으로 코드를 업데이트했지만 여전히 작동하지 않습니다. 제발 봐주세요 – Mints97
localhost의 명령 줄에 있다면 - 터널을 열고 SSH 명령을 실행 한 다음 wget 또는 curl - 작동합니까? 문제를 일으키는 기본 ssh 연결 인 경우 코드의 문제 해결에 대해 우려하고 있습니다. – JavaCoderEx