2013-05-09 12 views
11

Próbuję skonfigurować klasę tak, żebym mógł ssh na zdalny serwer (mam adres IP, nazwę użytkownika i hasło), a następnie wysłać polecenie typu " echo "test" ", a następnie odbierz wyjście (np." test "). Używam JSch, aby to zrobić, ale nie rozumiem, jak to zrobić.Wysyłanie poleceń do zdalnego serwera przez ssh przez Javę przy pomocy JSch

import com.jcraft.jsch.*; 

public class ConnectSSH { 

public int execute (String command) { 

    JSch jsch = new JSch(); 
    String ip = "00.00.00.00; 
    String user = "root"; 
    String pass = "password"; 
    int port = 22; 

    try {     
     Session session = jsch.getSession(user, ip, port); 
     session.setPassword(pass); 
     session.connect(); 

      ... 

Nie jestem pewien, co zrobić, utknąłem po połączeniu.

Każda rada jest bardzo doceniana.

Odpowiedz

2

Proponuję patrząc na ukrytej przykład na stronie internetowej JCraft: http://www.jcraft.com/jsch/examples/UserAuthKI.java

Ich przykład prosi o nazwę użytkownika, hasło, nazwę hosta, więc jest gotowy do testowania po wyjęciu z pudełka. Uruchomiłem go w mojej sieci i mogłem połączyć się z serwerem AIX, nie zmieniając żadnego kodu.

Uwaga, ich przykład ma problem (być może dlatego jest ukryty) .. nigdy nie zamyka kanału. Jeśli wyślesz polecenie "exit", serwer rozłączy się, ale obiekt kanału pozostanie otwarty, a twój program Java nigdy nie zostanie zamknięty. I pod warunkiem, że za poprawkę tutaj: Never ending of reading server response using jSch

24

Spróbuj tego: odpowiedź

JSch jsch=new JSch(); 
Session session=jsch.getSession(remoteHostUserName, RemoteHostName, 22); 
session.setPassword(remoteHostpassword); 
Properties config = new Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 
session.connect(); 

ChannelExec channel=(ChannelExec) session.openChannel("exec"); 
BufferedReader in=new BufferedReader(new InputStreamReader(channel.getInputStream())); 
channel.setCommand("pwd;"); 
channel.connect(); 

String msg=null; 
while((msg=in.readLine())!=null){ 
    System.out.println(msg); 
} 

channel.disconnect(); 
session.disconnect(); 
+0

jak uruchomić wiele poleceń, jak gdybym chciał wykonać "cd xx/xx/xx", a następnie zaznaczyć "pwd" – Vinod

+0

Got moją odpowiedź tutaj: http://stackoverflow.com/questions/ 5831594/multiple-commands-through-jsch-shell/5831846 # 5831846, dziękuję – Vinod

9

shamnu za wyżej ma rację. Nie mogłem dodać komentarza, więc oto kilka przykładów, które poprawią jego odpowiedź. Jednym z nich jest, jak wykonać zdalne wykonanie "ls -l", innego "mkdir", a drugiego z lokalnej do zdalnej kopii. Wszystko za sprawą wersji 0.1.51 jsch (http://www.jcraft.com/jsch/).

public void remoteLs() throws JSchException, IOException { 
    JSch js = new JSch(); 
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22); 
    s.setPassword("mypassword"); 
    Properties config = new Properties(); 
    config.put("StrictHostKeyChecking", "no"); 
    s.setConfig(config); 
    s.connect(); 

    Channel c = s.openChannel("exec"); 
    ChannelExec ce = (ChannelExec) c; 

    ce.setCommand("ls -l"); 
    ce.setErrStream(System.err); 

    ce.connect(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream())); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     System.out.println(line); 
    } 

    ce.disconnect(); 
    s.disconnect(); 

    System.out.println("Exit code: " + ce.getExitStatus()); 

    } 



    public void remoteMkdir() throws JSchException, IOException { 
    JSch js = new JSch(); 
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22); 
    s.setPassword("mypassword"); 
    Properties config = new Properties(); 
    config.put("StrictHostKeyChecking", "no"); 
    s.setConfig(config); 
    s.connect(); 

    Channel c = s.openChannel("exec"); 
    ChannelExec ce = (ChannelExec) c; 

    ce.setCommand("mkdir remotetestdir"); 
    ce.setErrStream(System.err); 

    ce.connect(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream())); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     System.out.println(line); 
    } 

    ce.disconnect(); 
    s.disconnect(); 

    System.out.println("Exit code: " + ce.getExitStatus()); 

    } 

    public void remoteCopy() throws JSchException, IOException, SftpException { 
    JSch js = new JSch(); 
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22); 
    s.setPassword("mypassword"); 
    Properties config = new Properties(); 
    config.put("StrictHostKeyChecking", "no"); 
    s.setConfig(config); 
    s.connect(); 

    Channel c = s.openChannel("sftp"); 
    ChannelSftp ce = (ChannelSftp) c; 

    ce.connect(); 

    ce.put("/home/myuser/test.txt","test.txt"); 

    ce.disconnect(); 
    s.disconnect();  
    } 
+1

Tylko uwaga, jeśli wszystko co robisz to operacje na plikach, możesz użyć [ChannelSftp] (http://epaul.github.io/jsch- documentation/simple.javadoc/com/jcraft/jsch/ChannelSftp.html), który zapewnia metody takie jak cd(), mkdir() i put(). – perilandmishap

0
1. List item 

import java.io.InputStream; 

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class SSHCommandExecutor { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     String host="10.75.81.21"; 
     String user="root"; 
     String password="Avaya_123"; 
     String command1="ls -l"; 
     try{ 

      java.util.Properties config = new java.util.Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      JSch jsch = new JSch(); 
      Session session=jsch.getSession(user, host, 22); 
      session.setPassword(password); 
      session.setConfig(config); 
      session.connect(); 
      System.out.println("Connected"); 

      Channel channel=session.openChannel("exec"); 
      ((ChannelExec)channel).setCommand(command1); 
      channel.setInputStream(null); 
      ((ChannelExec)channel).setErrStream(System.err); 

      InputStream in=channel.getInputStream(); 
      channel.connect(); 
      byte[] tmp=new byte[1024]; 
      while(true){ 
       while(in.available()>0){ 
       int i=in.read(tmp, 0, 1024); 
       if(i<0)break; 
       System.out.print(new String(tmp, 0, i)); 
       }`enter code here` 
       if(channel.isClosed()){ 
       System.out.println("exit-status: "+channel.getExitStatus()); 
       break; 
       } 
       try{Thread.sleep(1000);}catch(Exception ee){} 
      } 
      channel.disconnect(); 
      session.disconnect(); 
      System.out.println("DONE"); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 


1. List item 

} 
+0

Czy możesz rozwinąć swoje rozwiązanie? – CAFEBABE

+0

to jest z [tutaj] (http://www.jcraft.com/jsch/examples/Exec.java.html) – rrw