java remote call linux command o script

Java ejecuta un script de shell remoto a través del protocolo SSH2 (ganymed-ssh2-build210.jar)

El paquete Jar de la herramienta está disponible en: http://www.ganymed.ethz.ch/ssh2/Download
ganymed-ssh2 Introducción:
Ganymed SSH-2 para Java es un paquete que implementa el protocolo SSH-2 en Java puro. En el proceso de usarlo, es muy fácil, solo necesita especificar una contraseña de nombre de usuario válida
o un archivo de autenticación de autorización, puede crear una conexión a un host Linux remoto, llamar al archivo de script en el host Linux en la sesión establecida y ejecutar el correspondiente Operación
Uso: agregue ganymed-ssh2-build210.jar a la biblioteca del proyecto.

Los pasos son los siguientes:

El primer paso, paquete de guía

Descarga oficial del sitio web:

http://www.ganymed.ethz.ch/ssh2/

coordenadas maven:

Java代码  收藏代码
<dependency>  
  <groupId>com.ganymed.ssh2</groupId>  
  <artifactId>ganymed-ssh2-build</artifactId>  
  <version>210</version>  
 </dependency>  

El segundo paso, descripción de la API

  1. Primero construya un conector y pase una dirección IP que necesita iniciar sesión

Conexión conn = nueva conexión (nombre de host);

  1. Nombre de usuario y contraseña pasados ​​al servidor de destino de inicio de sesión simulado,

boolean isAuthenticated = conn.authenticateWithPassword (nombre de usuario,
contraseña); devolverá un valor booleano, verdadero significa un inicio de sesión exitoso en el servidor de destino; de lo contrario, el inicio de sesión falla

  1. Abra una sesión, un poco como una sesión de Hibernate, ejecute el comando de script de Linux que necesita.

Sesión sess = conn.openSession ();

sess.execCommand ("último");

  1. Reciba los resultados de la consola en el servidor de destino y lea el contenido en br

InputStream stdout = new StreamGobbler (sess.getStdout ());

BufferedReader br = new BufferedReader (nuevo InputStreamReader (stdout));

5. Obtenga el indicador de si el script se ejecuta correctamente: 0-success no es 0-failure

System.out.println ("ExitCode:" + sess.getExitStatus ());

6. Cierre la sesión y la conexión.

sess.close ();

conn.close ();

Observaciones:

1. Después de una autenticación exitosa en el paso 2, el directorio actual se encuentra en el directorio / home / username /, puede especificar la ruta absoluta donde se encuentra el archivo de script, o navegar al directorio donde se encuentra el archivo de script a través de cd, y luego pasarlo para ejecutar el script. Parámetros, complete la ejecución de la llamada al script.

2. Después de ejecutar el script, se puede obtener el texto del resultado de la ejecución del script. Estos textos deben codificarse correctamente y devolverse al cliente para evitar caracteres confusos.

3. Si necesita ejecutar múltiples scripts de consola de Linux, por ejemplo, el resultado de retorno del primer script es el parámetro de entrada del segundo script, debe abrir varias sesiones, es decir, múltiples llamadas

Sesión sess = conn.openSession ();, recuerde cerrarlo después de usar

El tercer paso, código de ejemplo, esta clase se puede copiar directamente en el pasado

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.UnsupportedEncodingException;  
import org.apache.commons.lang.StringUtils;  
import ch.ethz.ssh2.Connection;  
import ch.ethz.ssh2.Session;  
import ch.ethz.ssh2.StreamGobbler;  
  
/** 
 * 远程执行linux的shell script 
 * @author Ickes 
 * @since  V0.1 
 */  
public class RemoteExecuteCommand {  
    //字符编码默认是utf-8  
    private static String  DEFAULTCHART="UTF-8";  
    private Connection conn;  
    private String ip;  
    private String userName;  
    private String userPwd;  
      
    public RemoteExecuteCommand(String ip, String userName, String userPwd) {  
        this.ip = ip;  
        this.userName = userName;  
        this.userPwd = userPwd;  
    }  
      
      
    public RemoteExecuteCommand() {  
          
    }  
      
    /** 
     * 远程登录linux的主机 
     * @author Ickes 
     * @since  V0.1 
     * @return 
     *      登录成功返回true,否则返回false 
     */  
    public Boolean login(){  
        boolean flg=false;  
        try {  
            conn = new Connection(ip);  
            conn.connect();//连接  
            flg=conn.authenticateWithPassword(userName, userPwd);//认证  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return flg;  
    }  
    /** 
     * @author Ickes 
     * 远程执行shll脚本或者命令 
     * @param cmd 
     *      即将执行的命令 
     * @return 
     *      命令执行完后返回的结果值 
     * @since V0.1 
     */  
    public String execute(String cmd){  
        String result="";  
        try {  
            if(login()){  
                Session session= conn.openSession();//打开一个会话  
                session.execCommand(cmd);//执行命令  
                result=processStdout(session.getStdout(),DEFAULTCHART);  
                //如果为得到标准输出为空,说明脚本执行出错了  
                if(StringUtils.isBlank(result)){  
                    result=processStdout(session.getStderr(),DEFAULTCHART);  
                }  
                conn.close();  
                session.close();  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return result;  
    }  
      
      
    /** 
     * @author Ickes 
     * 远程执行shll脚本或者命令 
     * @param cmd 
     *      即将执行的命令 
     * @return 
     *      命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null 
     * @since V0.1 
     */  
    public String executeSuccess(String cmd){  
        String result="";  
        try {  
            if(login()){  
                Session session= conn.openSession();//打开一个会话  
                session.execCommand(cmd);//执行命令  
                result=processStdout(session.getStdout(),DEFAULTCHART);  
                conn.close();  
                session.close();  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return result;  
    }  
      
   /** 
    * 解析脚本执行返回的结果集 
    * @author Ickes 
    * @param in 输入流对象 
    * @param charset 编码 
    * @since V0.1 
    * @return 
    *       以纯文本的格式返回 
    */  
    private String processStdout(InputStream in, String charset){  
        InputStream    stdout = new StreamGobbler(in);  
        StringBuffer buffer = new StringBuffer();;  
        try {  
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));  
            String line=null;  
            while((line=br.readLine()) != null){  
                buffer.append(line+"\n");  
            }  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return buffer.toString();  
    }  
      
    public static void setCharset(String charset) {  
        DEFAULTCHART = charset;  
    }  
    public Connection getConn() {  
        return conn;  
    }  
    public void setConn(Connection conn) {  
        this.conn = conn;  
    }  
    public String getIp() {  
        return ip;  
    }  
    public void setIp(String ip) {  
        this.ip = ip;  
    }  
    public String getUserName() {  
        return userName;  
    }  
    public void setUserName(String userName) {  
        this.userName = userName;  
    }  
    public String getUserPwd() {  
        return userPwd;  
    }  
    public void setUserPwd(String userPwd) {  
        this.userPwd = userPwd;  
    }  
}  

Código de prueba:

public static void main(String[] args) {  
        RemoteExecuteCommand rec=new RemoteExecuteCommand("192.168.238.133", "root","ickes");  
        //执行命令  
        System.out.println(rec.execute("ifconfig"));  
        //执行脚本  
        rec.execute("sh /usr/local/tomcat/bin/statup.sh");  
        //这个方法与上面最大的区别就是,上面的方法,不管执行成功与否都返回,  
        //这个方法呢,如果命令或者脚本执行错误将返回空字符串  
        rec.executeSuccess("ifconfig");  
          
    }  

Paquetes a importar:

<dependency>  
      <groupId>com.ganymed.ssh2</groupId>  
      <artifactId>ganymed-ssh2-build</artifactId>  
      <version>210</version>  
     </dependency>  
     <dependency>  
        <groupId>commons-io</groupId>  
        <artifactId>commons-io</artifactId>  
        <version>2.4</version>  
        <type>jar</type>  
        <scope>compile</scope>  
    </dependency>  
    <dependency>  
        <groupId>commons-lang</groupId>  
        <artifactId>commons-lang</artifactId>  
        <version>2.6</version>  
        <type>jar</type>  
        <scope>compile</scope>  
    </dependency>  
156 artículos originales publicados · Me gustaron 34 · Visitas 150,000+

Supongo que te gusta

Origin blog.csdn.net/bbj12345678/article/details/105531132
Recomendado
Clasificación