2014-02-05 2 views
2

Я хочу, чтобы ssh на машине, которая находится за прокси-сервером, и выполняйте перенос портов после этого в моей программе java. (Чтобы иметь возможность ssh в поле, я должен сначала перенести ssh'ed на прокси-машину). Я обычно делаю, что, имея следующие данные в моем ~/.ssh/конфигурационный файл:Как использовать jsch с ProxyCommands для portforwarding

ProxyCommand ssh proxyhost.com -t nc %h %p 
IdentityFile /home/username/username_dsa_key 

А потом запустить следующее делать проброс на карту hostmachine.com:54321 моего локальный хост: 12345:

ssh -A -L12345:localhost:54321 hostmachine.com 

Теперь я хочу сделать это с библиотекой JSch, но я не могу понять, как подключить ко второму хосту после открытия канала на сессии:

 String proxyHost = "proxyhost.com"; 
     String host = "hostmachine.com"; 
     int lport = 12345; 
     String rhost = "localhost"; 
     int rport = 54321; 

     JSch jsch=new JSch(); 
     jsch.setKnownHosts("/home/{user}/.ssh/known_hosts"); 
     jsch.addIdentity("/home/{user}/.ssh/{user}_dsa_key",passphrase); 

     Session session1 = jsch.getSession(user,proxyHost,22); 
     session1.connect(3000); 
     System.out.println(session1.isConnected()); 
     Channel channel = session1.openChannel("shell"); 

     ////// Now what? :) 


     channel.disconnect(); 
     session1.disconnect(); 

Любая идея?

p.s: Я читал образцы в www.jcraft.com/jsch/examples/, но в этом случае они не помогли.

Спасибо!

ответ

3

Я предлагаю вам попробовать

http://www.jcraft.com/jsch/examples/JumpHosts.java.html 

, но если это важно использовать родной «SSH» команду, вы найдете класс ProxyCommand в комментарии Session.java из jsch- 0.1.50,

/* 
// setProxyCommand("ssh -l user2 host2 -o 'ProxyCommand ssh [email protected] nc host2 22' nc %h %p") 
public void setProxyCommand(String command){ 
    setProxy(new ProxyCommand(command)); 
} 

class ProxyCommand implements Proxy { 
    String command; 
    Process p = null; 
    InputStream in = null; 
    OutputStream out = null; 
    ProxyCommand(String command){ 
    this.command = command; 
    } 
    public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws Exception { 
    String _command = command.replace("%h", host); 
    _command = _command.replace("%p", new Integer(port).toString()); 
    p = Runtime.getRuntime().exec(_command); 
    in = p.getInputStream(); 
    out = p.getOutputStream(); 
    } 
    public Socket getSocket() { return null; } 
    public InputStream getInputStream() { return in; } 
    public OutputStream getOutputStream() { return out; } 
    public void close() { 
    try{ 
     if(p!=null){ 
     p.getErrorStream().close(); 
     p.getOutputStream().close(); 
     p.getInputStream().close(); 
     p.destroy(); 
     p=null; 
     } 
    } 
    catch(IOException e){ 
    } 
    } 
} 
*/ 
+0

Спасибо! Я думаю, что это в конечном итоге сработает, но я закончил просто выполнение команды ssh оболочки из java. К сожалению, jsch был слишком сложным для этого случая, и я не мог найти хороший пример, который не требует полного прохождения dsa_key и не запрашивать парольную фразу. – N3da