<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-193  評論-715  文章-1  trackbacks-0

    本Blog所有內(nèi)容不得隨意轉(zhuǎn)載,版權(quán)屬于作者所有。如需轉(zhuǎn)載請與作者聯(lián)系( fastzch@163.com )。
    未經(jīng)許可的轉(zhuǎn)載,本人保留一切法律權(quán)益。

    注:此ssh非彼SSH(Struts+Spring+Hibernate)

    在Java中,我們可以通過Runtime去執(zhí)行一些OS的命令,如:

    String[]?shell? = ? new ?String[]? {? " /bin/sh " ,? " -c " ,? " ls?-l " } ;
    Process?p?
    = ?Runtime.getRuntime().exec(shell);

    通過在Linux上執(zhí)行?ssh --help命令,
    usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
    ?????????? [-D [bind_address:]port] [-e escape_char] [-F configfile]
    ?????????? [-i identity_file] [-L [bind_address:]port:host:hostport]
    ?????????? [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
    ?????????? [-R [bind_address:]port:host:hostport] [-S ctl_path]
    ?????????? [-w local_tun[:remote_tun]] [user@]hostname [command]
    不難發(fā)現(xiàn),ssh命令中并不能帶密碼。

    如果不需要登錄時,我們可以用這樣的方式來執(zhí)行:

    String[]?shell? = ? new ?String[]? {? " /bin/sh " ,? " -c " ,? " ssh?root@192.168.1.5?ls?-l " } ;
    Process?p?
    = ?Runtime.getRuntime().exec(shell);

    但是事情往往并不是我們想象的如此簡單,絕大部分的客戶是不能允許他們的Linux中還存在一個不需要密碼就能執(zhí)行任何命令的帳戶的。那么,在Java中就沒有任何辦法通過ssh登錄來執(zhí)行一些命令嗎?

    不慌,先來Google一下,從一些網(wǎng)上別人請教的代碼的蛛絲螞跡中,發(fā)現(xiàn)了JSch (http://www.jcraft.com/jsch/) ,這東東還真是不錯,來,我們先看看其官方的簡介:

    JSch?is?a?pure?Java?implementation?of?SSH2.
    JSch?allows?you?to?connect?to?an?sshd?server?and?use?port?forwarding,?X11?forwarding,?file?transfer,?etc.,?and?you?can?integrate?its?functionality?into?your?own?Java?programs.?JSch?is?licensed?under?BSD?style?license.?

    這東東支持像telnet一樣的ssh的session,SFTP,SCP等。

    下面,就讓我們來看一個執(zhí)行ssh命令的通用方法:
    public?static?String?sshExecute(String?host,?String?user,?String?pwd,
    ????????????String?command)?
    {
    ????????String?osName?
    =?System.getProperty("os.name");
    ????????
    //?ps?-ef|grep?tomcat|grep?-v?grep|awk?'{print?$2}'
    ????????StringBuffer?sb?=?new?StringBuffer();
    ????????
    try?{
    ????????????JSch?jsch?
    =?new?JSch();
    ????????????
    if?(osName.toUpperCase().indexOf("WINDOWS")?>?-1)?{
    ????????????????jsch.setKnownHosts(
    "c:\\known_hosts");
    ????????????}
    ?else?{
    ????????????????jsch.setKnownHosts(
    "/root/.ssh/known_hosts");
    ????????????}

    ????????????Session?session?
    =?jsch.getSession(user,?host,?22);
    ????????????session.setPassword(pwd);
    ????????????session.connect();
    ????????????Channel?channel?
    =?session.openChannel("exec");
    ????????????((ChannelExec)?channel).setCommand(command);
    ????????????InputStream?in?
    =?channel.getInputStream();
    ????????????channel.connect();
    ????????????
    int?nextChar;
    ????????????
    while?(true)?{
    ????????????????
    while?((nextChar?=?in.read())?!=?-1)?{
    ????????????????????sb.append((
    char)?nextChar);
    ????????????????}

    ????????????????
    if?(channel.isClosed())?{
    ????????????????????System.out.println(
    "exit-status:?"
    ????????????????????????????
    +?channel.getExitStatus());
    ????????????????????
    break;
    ????????????????}

    ????????????????
    try?{
    ????????????????????Thread.sleep(
    1000);
    ????????????????}
    ?catch?(Exception?ee)?{
    ????????????????}

    ????????????}

    ????????????channel.disconnect();
    ????????????session.disconnect();
    ????????}
    ?catch?(Exception?e)?{
    ????????????e.printStackTrace();
    ????????}

    ????????
    return?sb.toString();

    ????}

    看看,是不是挺簡單了。

    別忘了,由于這是Pure Java program,還有一個優(yōu)點就是,這樣的程序不依賴于OS,可以直接在Windows或者其它OS上運行。

    對了,執(zhí)行這個需要RSA的Key文件,示例如下:
    192.168.1.4?ssh-rsa?AAAAB3NzaC1yc2EAAAABIwAAAQEAsoINy5sLnrzYCTKBh2UrsqHd62dnnimCZtvq8ojTYt7NcAjjtW2FqmFNO+5x/mTwyY+ssoP5SganxDYs3G016aPZDQdGVZMn/08IsB7QEIAXEVHtgGIGuLqsdMUBBIxV7KI6BK+OWVwv277tBOgqvPcgeEacviFZb2lZhWr8hvR2pTrPFBLr+UELejm/Nnf9qWDBjDj/d2o8+ReSwN8dzNJIiFyWdboyUCZfHhxNgiGANFx22gC4lM+Wk8gkASo/QYDvoUwLFrAJoMdsw0d4pn34bQ0mspaaWy4N0+zrNCPcl8D0Q1RrAjfYfOiZOSTnxabJ2DLijuq7UgFbn2ESMw==
    附:產(chǎn)生此文件的簡單方法:可以在Linux中用ssh命令登錄一次,這樣便在/root/.ssh(假如使用root用戶登錄到Linux)目錄下生成known_hosts文件。
    posted on 2008-07-08 23:47 Robin's Programming World 閱讀(15790) 評論(4)  編輯  收藏 所屬分類: Java

    評論:
    # re: 純Java通過SSH執(zhí)行Linux命令[未登錄] 2008-07-09 07:37 | javaread.com
    換個思路,是不是可以用webservice或者xml-rpc來解決問題呢  回復(fù)  更多評論
      
    # re: 純Java通過SSH執(zhí)行Linux命令 2008-07-09 08:42 | 隔葉黃鶯
    我原來用的是 j2ssh 組件來用 ssh 協(xié)議連接 Linux 做各項系統(tǒng)操作的。  回復(fù)  更多評論
      
    # re: 純Java通過SSH執(zhí)行Linux命令 2008-07-09 09:12 | Robin's Java World
    @javaread.com
    個人認為,這個思路換得不怎么樣了,呵呵。
    @隔葉黃鶯
    謝謝推薦,一會去看看。  回復(fù)  更多評論
      
    # re: 純Java通過SSH執(zhí)行Linux命令[未登錄] 2008-07-09 09:59 | javaread.com
    如果具體到就是要用通過ssh來操作,也沒什么好說的,這也是一種可行的方法。如果換一些場景,情況可能就不是這樣了。比如,其實用戶不會給開通ssh的,或者想遠一些,用ruby,python來遠程執(zhí)行l(wèi)inux命名呢。不過這就想遠了,呵呵。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲啪AV永久无码精品放毛片| 亚洲av无码成人精品区| 亚洲av午夜国产精品无码中文字 | 在线视频精品免费| 日本亚洲欧美色视频在线播放| 国产精品亚洲视频| 台湾一级毛片永久免费| 99免费在线观看视频| 亚洲乱人伦中文字幕无码| 亚洲日韩精品无码一区二区三区| 无码少妇一区二区浪潮免费| 男女一进一出抽搐免费视频| 精品日韩99亚洲的在线发布| 91麻豆精品国产自产在线观看亚洲| 国产一卡二卡3卡四卡免费| 国产区在线免费观看| 亚洲精品中文字幕无乱码麻豆| 国产亚洲美女精品久久久2020 | 久草免费福利资源站| 国产精品亚洲专一区二区三区| 91情国产l精品国产亚洲区| 亚洲国产综合精品一区在线播放| **毛片免费观看久久精品| www.av在线免费观看| 亚洲熟女乱色一区二区三区| 亚洲AV电影院在线观看| 亚洲国产小视频精品久久久三级 | 久99久精品免费视频热77| 国产亚洲成在线播放va| 亚洲午夜在线一区| 亚洲成av人片天堂网| 亚洲精品视频在线看| 成人免费在线视频| 2021精品国产品免费观看| 国产一级婬片A视频免费观看| 特级av毛片免费观看| 亚洲欧美成aⅴ人在线观看| 亚洲国产成a人v在线| 亚洲国产精品国自产拍电影| 中国亚洲女人69内射少妇| 免费又黄又爽又猛的毛片|