/** * Copyright 2003-2016 SSHTOOLS Limited. All Rights Reserved. * * For product documentation visit https://www.sshtools.com/ * * This file is part of J2SSH Maverick. * * J2SSH Maverick is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * J2SSH Maverick is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with J2SSH Maverick. If not, see <http://www.gnu.org/licenses/>. */ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import com.sshtools.net.ForwardingClient; import com.sshtools.net.SocketTransport; import com.sshtools.ssh.HostKeyVerification; import com.sshtools.ssh.PasswordAuthentication; import com.sshtools.ssh.SshAuthentication; import com.sshtools.ssh.SshClient; import com.sshtools.ssh.SshConnector; import com.sshtools.ssh.SshException; import com.sshtools.ssh.SshSession; import com.sshtools.ssh.components.SshPublicKey; import com.sshtools.ssh2.Ssh2Context; /** * This example demonstrates how to perform port forwarding. * * @author Lee David Painter */ public class PortFowardingConnect { public static void main(String[] args) { final BufferedReader reader = new BufferedReader(new InputStreamReader( System.in)); try { System.out.print("Hostname: "); String hostname = reader.readLine(); int idx = hostname.indexOf(':'); int port = 22; if (idx > -1) { port = Integer.parseInt(hostname.substring(idx + 1)); hostname = hostname.substring(0, idx); } System.out.print("Username [Enter for " + System.getProperty("user.name") + "]: "); String username = reader.readLine(); if (username == null || username.trim().equals("")) username = System.getProperty("user.name"); System.out.println("Connecting to " + hostname); /** * Create an SshConnector instance */ SshConnector con = SshConnector.createInstance(); // Lets do some host key verification HostKeyVerification hkv = new HostKeyVerification() { public boolean verifyHost(String hostname, SshPublicKey key) { try { System.out.println("The connected host's key (" + key.getAlgorithm() + ") is"); System.out.println(key.getFingerprint()); } catch (SshException e) { } return true; } }; con.getContext().setHostKeyVerification(hkv); con.getContext().setPreferredPublicKey( Ssh2Context.PUBLIC_KEY_SSHDSS); /** * Connect to the host */ SshClient ssh = con.connect(new SocketTransport(hostname, port), username, true); /** * Authenticate the user using password authentication */ PasswordAuthentication pwd = new PasswordAuthentication(); do { System.out.print("Password: "); pwd.setPassword(reader.readLine()); } while (ssh.authenticate(pwd) != SshAuthentication.COMPLETE && ssh.isConnected()); /** * Start a session and do basic IO */ if (ssh.isAuthenticated()) { final ForwardingClient fwd = new ForwardingClient(ssh); if (!fwd.requestRemoteForwarding("127.0.0.1", 8080, "127.0.0.1", 80)) { System.out.println("Forwarding request failed!"); } /** * Start the users session. It also acts as a thread to service * incoming channel requests for the port forwarding for both * versions. Since we have a single threaded API we have to do * this to send a timely response */ final SshSession session = ssh.openSessionChannel(); session.requestPseudoTerminal("vt100", 80, 24, 0, 0); session.startShell(); /** * Start local forwardings after starting the users session. */ fwd.startLocalForwarding("127.0.0.1", 8080, "cnn.com", 80); final InputStream in = session.getInputStream(); Thread t = new Thread() { public void run() { try { int read; while ((read = in.read()) > -1) { if (read > 0) System.out.print((char) read); } } catch (Throwable t4) { t4.printStackTrace(); } finally { System.exit(0); } } }; t.start(); /** * Were also going to have a monitor thread that displays the * active forwardings and tunnels every 10 seconds */ Thread m = new Thread() { public void run() { while (!session.isClosed()) { try { Thread.sleep(10000); } catch (Throwable t3) { } try { String[] listeners = fwd.getLocalForwardings(); for (int i = 0; i < listeners.length; i++) { System.out.print("Local forwarding " + listeners[i]); try { ForwardingClient.ActiveTunnel[] tun1 = fwd .getLocalForwardingTunnels(listeners[i]); System.out.println(" has " + String.valueOf(tun1.length) + " active tunnels"); } catch (Throwable t2) { t2.printStackTrace(); } } listeners = fwd.getRemoteForwardings(); for (int i = 0; i < listeners.length; i++) { System.out.print("Remote forwarding " + listeners[i]); try { ForwardingClient.ActiveTunnel[] tun2 = fwd .getRemoteForwardingTunnels(listeners[i]); System.out.println(" has " + String.valueOf(tun2.length) + " active tunnels"); } catch (Throwable t5) { t5.printStackTrace(); } } } catch (Throwable t1) { t1.printStackTrace(); } } } }; m.start(); int read; while ((read = System.in.read()) > -1) { session.getOutputStream().write(read); } System.exit(0); } } catch (Throwable th) { th.printStackTrace(); } } }