吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2899|回复: 4
收起左侧

[Java 转载] Java远程连接服务器执行命令并返回字符串

[复制链接]
墨水 发表于 2020-1-3 12:09
经由本人小小的改良,这篇文章显得更加完美了 呜呜呜 ” java通过ssh远程操控服务器输入直径返回结果(副部分环境变量导致部分命令出现command not found问题解决)”
需要用到的jar包: QQ截图20191203120344.png

主体代码:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class SshLinux {
    private static final Logger log = LoggerFactory.getLogger(SshLinux.class);
    private static String  DEFAULTCHART="UTF-8";


    /**
     * 登录主机
     * @return
     *      登录成功返回true,否则返回false
     */
    public static Connection login(String ip,
                                   String userName,
                                   String userPwd){


        boolean flg=false;
        Connection conn = null;
        try {
            conn = new Connection(ip);
            conn.connect();//连接
            flg=conn.authenticateWithPassword(userName, userPwd);//认证
            if(flg){
                log.info("=========登录成功========="+conn);
                return conn;
            }
        } catch (IOException e) {
            log.error("=========登录失败========="+e.getMessage());
            e.printStackTrace();
        }
        return conn;
    }


    /**
     * 远程执行shll脚本或者命令
     * @Param cmd
     *      即将执行的命令
     * @return
     *      命令执行完后返回的结果值
     */
    public static String execute(Connection conn,String cmd){
        String result="";
        try {
            if(conn !=null){
                Session session= conn.openSession();//打开一个会话
                session.execCommand(cmd);//执行命令
                result=processStdout(session.getStdout(),DEFAULTCHART);
                //如果为得到标准输出为空,说明脚本执行出错了
                if(StringUtils.isBlank(result)){
                    log.info("得到标准输出为空,链接conn:"+conn+",执行的命令:"+cmd);
                    result=processStdout(session.getStderr(),DEFAULTCHART);
                }else{
                    log.info("执行命令成功,链接conn:"+conn+",执行的命令:"+cmd);
                }
                conn.close();
                session.close();
            }
        } catch (IOException e) {
            log.info("执行命令失败,链接conn:"+conn+",执行的命令:"+cmd+"  "+e.getMessage());
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 解析脚本执行返回的结果集
     * @param in 输入流对象
     * @param charset 编码
     * @return
     *       以纯文本的格式返回
     */
    private static 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) {
            log.error("解析脚本出错:"+e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            log.error("解析脚本出错:"+e.getMessage());
            e.printStackTrace();
        }
        return buffer.toString();
    }
}
注意:ganymed这个jar包,每次只能执行一条命令,如果一条命令执行了没有关闭,再去执行第二条则会throw new IOException("A remote execution has already started.");


若希望同时执行多条命令,可以在传入的cmd字符串中用&&连接多条命令。


如:
20190519175142296.png
我给他小小的改良一下:改良主要就是那个环境变量引起得部分指令无法解析,解决方式两种,1,主动通过xshell登录服务器通过which 指令拿到路劲,在指令前加上路劲就ok
2就是先远程执行which 指令拿到路径,拼接到后方的主要命令上、


前几天这个破玩意搞了我好久
查了好久才找出来问题
20190519175329794.png

最后附上一张多条命令执行的所有结果将会一同作为返回的字符串。
有什么没说清的还望大家指出 谢谢, 感谢提供思路以及原作者@shimadear
QQ截图20191203120344.png

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
xwl + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
Nemoris丶 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

QBreeze 发表于 2020-1-3 12:30
附上代码附件看看呗
xymoc 发表于 2020-1-3 13:29
痴仁说梦 发表于 2020-2-9 19:54
xwl 发表于 2020-2-10 19:18
收藏 ,以后会用谢谢拉。。。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 21:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表