2013-05-09 2 views
11

Я пытаюсь настроить класс, чтобы я мог ssh на удаленный сервер (у меня есть IP, имя пользователя и пароль), а затем отправьте команду как " echo "test" ", а затем вернуть результат (например," test "). Я использую JSch для этого, но я не понимаю, как это сделать.Отправка команд удаленному серверу через ssh с помощью Java с 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(); 

      ... 

Я не уверен, что делать, я застрял после подключения.

Любые советы приветствуются.

ответ

2

Я предлагаю смотреть на скрытом, например, на сайте JCraft: http://www.jcraft.com/jsch/examples/UserAuthKI.java

Их пример запрашивает имя пользователя, имя хоста, пароль, поэтому он готов проверить из коробки. Я запустил его в своей сети и смог подключиться к серверу AIX без изменения кода.

Обратите внимание, что в их примере есть проблема (возможно, поэтому он скрыт) .. он никогда не закрывает канал. Если вы отправляете «exit», сервер отключит вас, но объект канала останется открытым, и ваша Java-программа никогда не выйдет. Я представил исправления для этого здесь: Never ending of reading server response using jSch

24

Попробуйте это: ответ

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

как запустить несколько команд, как если я хочу, чтобы выполнить «CD хх/хх/хх», а затем проверить «PWD» – Vinod

+0

Получил мой ответ здесь: http://stackoverflow.com/questions/ 5831594/multiple-commands-through-jsch-shell/5831846 # 5831846, спасибо – Vinod

9

shamnu в выше прав. Я не мог добавить комментарий к нему, так что вот несколько примеров, чтобы улучшить его ответ. Один из них заключается в том, как выполнить удаленное выполнение «ls -l», другого из «mkdir» и другого локального для удаленной копии. Все сделано с версией 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

Просто заметьте, если все, что вы делаете, это файловые операции, вы можете использовать [ChannelSftp] (http://epaul.github.io/jsch- документация/simple.javadoc/com/jcraft/jsch/ChannelSftp.html), которая предоставляет такие методы, как cd(), mkdir() и 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

Не могли бы вы рассказать о своем решении? – CAFEBABE

+0

это от [здесь] (http://www.jcraft.com/jsch/examples/Exec.java.html) – rrw