通過java程序(JSch)運(yùn)行遠(yuǎn)程linux主機(jī)上的shell腳本

如果您看完文章之后,覺得對您有幫助裂七,請幫我點個贊皆看,您的支持是我不竭的創(chuàng)作動力!
如果您看完文章之后背零,覺得對您有幫助腰吟,請幫我點個贊,您的支持是我不竭的創(chuàng)作動力!
如果您看完文章之后毛雇,覺得對您有幫助嫉称,請幫我點個贊,您的支持是我不竭的創(chuàng)作動力灵疮!

運(yùn)行遠(yuǎn)程主機(jī)上的shell腳本

下面的例子是教給大家如何通過java程序织阅,運(yùn)行遠(yuǎn)程主機(jī)上的shell腳本。(我講的不是一個黑客學(xué)習(xí)教程震捣,而是使用用戶名密碼去執(zhí)行有用戶認(rèn)證資格的主機(jī)上的shell腳本)荔棉。并且通過java程序獲得shell腳本的輸出。
首先通過maven坐標(biāo)引入JSch依賴庫蒿赢,我們正是通過JSch去執(zhí)行遠(yuǎn)程主機(jī)上的腳本润樱。

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

當(dāng)然以下java代碼可執(zhí)行的的前提是,遠(yuǎn)程主機(jī)已經(jīng)開通SSH服務(wù)(也就是我們平時登錄主機(jī)所使用的服務(wù))诉植。

遠(yuǎn)程shell腳本

下面的代碼放入一個文件:hello.sh祥国,腳本的內(nèi)容很簡單只是用來測試昵观,回顯輸出“hello <參數(shù)1> ”

#! /bin/sh
echo "hello $1\n";

然后我把它放到遠(yuǎn)程主機(jī)的/root目錄下面晾腔,遠(yuǎn)程主機(jī)的IP是1.1.1.1(當(dāng)然我真實測試時候不是這個IP,我不能把我的真實IP寫到這個文章里面啊犬,以免被攻擊)灼擂。并且在遠(yuǎn)程主機(jī)上,為這個腳本設(shè)置可執(zhí)行權(quán)限觉至,方法如下:

$ chmod +x hello.sh

本地java程序

我們可以使用下面的代碼剔应,去遠(yuǎn)程的linux 主機(jī)執(zhí)行shell腳本,詳細(xì)功能請看代碼注釋

import com.jcraft.jsch.*;

import java.io.IOException;
import java.io.InputStream;

public class RunRemoteScript {
    //遠(yuǎn)程主機(jī)IP
    private static final String REMOTE_HOST = "1.1.1.1";
    //遠(yuǎn)程主機(jī)用戶名
    private static final String USERNAME = "";
    //遠(yuǎn)程主機(jī)密碼
    private static final String PASSWORD = "";
    //SSH服務(wù)端口
    private static final int REMOTE_PORT = 22;
    //會話超時時間
    private static final int SESSION_TIMEOUT = 10000;
    //管道流超時時間(執(zhí)行腳本超時時間)
    private static final int CHANNEL_TIMEOUT = 5000;

    public static void main(String[] args) {
        //腳本名稱及路徑语御,與上文要對上
        String remoteShellScript = "/root/hello.sh";

        Session jschSession = null;

        try {

            JSch jsch = new JSch();
            //SSH授信客戶端文件位置峻贮,一般是用戶主目錄下的.ssh/known_hosts
            jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
            jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);

            // 密碼認(rèn)證
            jschSession.setPassword(PASSWORD);

            // 建立session
            jschSession.connect(SESSION_TIMEOUT);
            //建立可執(zhí)行管道
            ChannelExec channelExec = (ChannelExec) jschSession.openChannel("exec");

            // 執(zhí)行腳本命令"sh /root/hello.sh zimug"
            channelExec.setCommand("sh " + remoteShellScript + " zimug");

            // 獲取執(zhí)行腳本可能出現(xiàn)的錯誤日志
            channelExec.setErrStream(System.err);

            //腳本執(zhí)行結(jié)果輸出,對于程序來說是輸入流
            InputStream in = channelExec.getInputStream();

            // 5 秒執(zhí)行管道超時
            channelExec.connect(CHANNEL_TIMEOUT);

            // 從遠(yuǎn)程主機(jī)讀取輸入流应闯,獲得腳本執(zhí)行結(jié)果
            byte[] tmp = new byte[1024];
            while (true) {
                while (in.available() > 0) {
                    int i = in.read(tmp, 0, 1024);
                    if (i < 0) break;
                    //執(zhí)行結(jié)果打印到程序控制臺
                    System.out.print(new String(tmp, 0, i));
                }
                if (channelExec.isClosed()) {
                    if (in.available() > 0) continue;
                    //獲取退出狀態(tài)纤控,狀態(tài)0表示腳本被正確執(zhí)行
                    System.out.println("exit-status: "
                         + channelExec.getExitStatus());
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (Exception ee) {
                }
            }

            channelExec.disconnect();

        } catch (JSchException | IOException e) {

            e.printStackTrace();

        } finally {
            if (jschSession != null) {
                jschSession.disconnect();
            }
        }

    }
}

最終在本地控制臺,獲得遠(yuǎn)程主機(jī)上shell腳本的執(zhí)行結(jié)果碉纺。如下

hello zimug

exit-status: 0

當(dāng)然船万,我只是為大家演示這樣一個例子,上面的代碼可以通過更好的封裝骨田,從而提供更簡單的使用方式耿导。

歡迎關(guān)注我的博客,里面有很多精品合集

  • 本文轉(zhuǎn)載注明出處(必須帶連接态贤,不能只轉(zhuǎn)文字):字母哥博客舱呻。

覺得對您有幫助的話,幫我點贊悠汽、分享狮荔!您的支持是我不竭的創(chuàng)作動力胎撇! 。另外殖氏,筆者最近一段時間輸出了如下的精品內(nèi)容晚树,期待您的關(guān)注。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雅采,一起剝皮案震驚了整個濱河市爵憎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婚瓜,老刑警劉巖宝鼓,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巴刻,居然都是意外死亡愚铡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門胡陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沥寥,“玉大人,你說我怎么就攤上這事柠座∫匮牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵妈经,是天一觀的道長淮野。 經(jīng)常有香客問我,道長吹泡,這世上最難降的妖魔是什么骤星? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮爆哑,結(jié)果婚禮上洞难,老公的妹妹穿的比我還像新娘。我一直安慰自己泪漂,他們只是感情好廊营,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萝勤,像睡著了一般露筒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敌卓,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天慎式,我揣著相機(jī)與錄音,去河邊找鬼。 笑死瘪吏,一個胖子當(dāng)著我的面吹牛癣防,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掌眠,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蕾盯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓝丙?” 一聲冷哼從身側(cè)響起级遭,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渺尘,沒想到半個月后挫鸽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鸥跟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年丢郊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片医咨。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡枫匾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腋逆,到底是詐尸還是另有隱情婿牍,我是刑警寧澤侈贷,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布惩歉,位于F島的核電站,受9級特大地震影響俏蛮,放射性物質(zhì)發(fā)生泄漏撑蚌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一搏屑、第九天 我趴在偏房一處隱蔽的房頂上張望争涌。 院中可真熱鬧,春花似錦辣恋、人聲如沸亮垫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饮潦。三九已至,卻和暖如春携狭,著一層夾襖步出監(jiān)牢的瞬間继蜡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留稀并,地道東北人仅颇。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像碘举,于是被迫代替她去往敵國和親忘瓦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355