在Java中遠程執(zhí)行SSH2腳本命令

由于項目需要,需要在項目中執(zhí)行SSH腳本,在網(wǎng)上找資料闹获,發(fā)現(xiàn)使用
有兩種方式可使用

1.使用ganymed-ssh2


        <!--ssh2架包-->
        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>build210</version>
        </dependency>

可以進行SSH的使用,包括遠程登錄河哑,執(zhí)行腳本命令等避诽,具體的Util包如下:


//定義一個連接

/**
     * 
     * @Title: 連接Linux服務
     * @Description: 通過用戶名和密碼關聯(lián)linux服務器
     * @return
     * @return String
     * @throws
     */
    public Connection connectLinux(String ip, String userName, String password) {

        log.info("ConnectLinuxCommand  scpGet===" + "ip:" + ip + "  userName:" + userName + "  commandStr:"
                + commandStr);

        String returnStr = "";
        boolean result = true;
        RemoteConnect remoteConnect = new RemoteConnect();
        remoteConnect.setIp(ip);
        remoteConnect.setUserName(userName);
        remoteConnect.setPassword(password);
        try {
Connection conn=login(remoteConnect)
            if (conn!=null) {
                         return conn;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

/**
     * 
     * @Title: login
     * @Description: 用戶名密碼方式 遠程登錄linux服務器
     * @return: Boolean
     * @throws
     */
    public Connection login(RemoteConnect remoteConnect) {
        boolean flag = false;
        try {
            conn = new Connection(remoteConnect.getIp());
            conn.connect();// 連接
            flag = conn.authenticateWithPassword(remoteConnect.getUserName(), remoteConnect.getPassword());// 認證
            if (flag) {
                log.info("認證成功!");
                               return conn;
            } else {
                log.info("認證失斄Ы鳌沙庐!");
                conn.close();
                               return null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

//此外,還可以使用證書登錄佳吞,再寫使用證書登錄的操作

/**
     * 
     * @Title: execute
     * @Description: 遠程執(zhí)行shll腳本或者命令
     * @param conn 連接
     * @param cmd 腳本命令
     * @return: result 命令執(zhí)行完畢返回結果
     * @throws
     */
    public  String execute(Connection  conn, String cmd) {
        String result = "";
        try {
            Session session = conn.openSession();// 打開一個會話
            session.execCommand(cmd);// 執(zhí)行命令
            result = processStdout(session.getStdout(), DEFAULTCHARTSET);
            // 如果為得到標準輸出為空拱雏,說明腳本執(zhí)行出錯了
            if (StringUtils.isBlank(result)) {
                result = processStdout(session.getStderr(), DEFAULTCHARTSET);
            }
            conn.close();
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

RemoteConnect 的內容為:

import lombok.Data;

@Data
public class RemoteConnect {

    private String ip;
    private String userName;
    
    private String password;
}

主要執(zhí)行的命令為創(chuàng)建防火墻規(guī)則或重啟一些指定的服務

測試命令為:

SSH2Utils.connectLinux("192.168.xxx.xxx", "xxx", "xxxxxxxxx",
                "firewall-cmd --zone=public --add-port=8850/tcp --permanent");
SSH2Utils.connectLinux("192.168.xxx.xxx", "xxx", "xxxxxxxxx", "firewall-cmd --reload");
SSH2Utils.connectLinux("192.168.xxx.xxx", "xxx", "xxxxxxxxx",
                " firewall-cmd --zone=public --remove-port=8850/tcp --permanent ");
SSH2Utils.connectLinux("192.168.xxx.xxx", "xxx", "xxxxxxxxx", "firewall-cmd --reload");

2.使用jsch

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.55</version>
        </dependency>

由于Hutool中已經(jīng)進行了封裝,因此直接使用Hutool操作即可底扳,但是沒有檢查為什么铸抑,必須要引入上面的jsch包之后才能用

Session session = JschUtil.createSession("192.168.xxx.xxx", YYY, "XXXX", "xxxxxxxxxxx");
JschUtil.exec(session, "firewall-cmd --zone=public --add-port=8850/tcp --permanent", null);
JschUtil.exec(session, "firewall-cmd --reload", null);
JschUtil.exec(session, " firewall-cmd --zone=public --remove-port=8850/tcp --permanent ", null);
JschUtil.exec(session, "firewall-cmd --reload", null);

至此兩種方式的使用,全部完成

可以使用免密登錄衷模,若生成的密鑰版本太高鹊汛,無法使用,可以使用
ssh-keygen -p -f id_rsa -m pem -P "" -N "" 更新密碼為可用情況

JSch jsch = new JSch();

    try {
        String pubKeyPath = "C:\\Users\\用戶名\\.ssh\\id_rsa";
        jsch.addIdentity(pubKeyPath);
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
    try {
        String username = "sss";
        String host = "192.168.20.207";
        Session session = jsch.getSession(username, host, 22);// 為了連接做準備
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

// Channel channel=session.openChannel("shell");
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(" docker stats --no-stream --format "{{ json . }}" ");
//channel.setCommand(" cat /proc/stat | grep "cpu "");
//channel.setCommand("cat /proc/net/dev");
//channel.setCommand("df -lm");
// channel.setCommand("ps aux");
// channel.setInputStream(System.in);
// channel.setOutputStream(System.out);
// InputStream in=channel.getInputStream();

        BufferedReader in = new BufferedReader(new InputStreamReader(channel.getInputStream()));
        channel.connect();
        
        String msg;
        while ((msg = in.readLine()) != null) {
            System.out.println(msg);
        }
        channel.disconnect();
        session.disconnect();
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末阱冶,一起剝皮案震驚了整個濱河市刁憋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌木蹬,老刑警劉巖至耻,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡尘颓,警方通過查閱死者的電腦和手機是尖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泥耀,“玉大人饺汹,你說我怎么就攤上這事√荡撸” “怎么了兜辞?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夸溶。 經(jīng)常有香客問我逸吵,道長,這世上最難降的妖魔是什么缝裁? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任扫皱,我火速辦了婚禮,結果婚禮上捷绑,老公的妹妹穿的比我還像新娘韩脑。我一直安慰自己,他們只是感情好粹污,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布段多。 她就那樣靜靜地躺著,像睡著了一般壮吩。 火紅的嫁衣襯著肌膚如雪进苍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天鸭叙,我揣著相機與錄音觉啊,去河邊找鬼。 笑死沈贝,一個胖子當著我的面吹牛杠人,可吹牛的內容都是我干的。 我是一名探鬼主播缀程,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搜吧,長吁一口氣:“原來是場噩夢啊……” “哼市俊!你這毒婦竟也來了杨凑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤摆昧,失蹤者是張志新(化名)和其女友劉穎撩满,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡伺帘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年昭躺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伪嫁。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡领炫,死狀恐怖,靈堂內的尸體忽然破棺而出张咳,到底是詐尸還是另有隱情帝洪,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布脚猾,位于F島的核電站葱峡,受9級特大地震影響,放射性物質發(fā)生泄漏龙助。R本人自食惡果不足惜砰奕,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望提鸟。 院中可真熱鬧军援,春花似錦、人聲如沸称勋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铣缠。三九已至烘嘱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝗蛙,已是汗流浹背蝇庭。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捡硅,地道東北人哮内。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像壮韭,于是被迫代替她去往敵國和親北发。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容