<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所有內容不得隨意轉載,版權屬于作者所有。如需轉載請與作者聯系( fastzch@163.com )。
    未經許可的轉載,本人保留一切法律權益。

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

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

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

    通過在Linux上執行?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]
    不難發現,ssh命令中并不能帶密碼。

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

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

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

    不慌,先來Google一下,從一些網上別人請教的代碼的蛛絲螞跡中,發現了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等。

    下面,就讓我們來看一個執行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,還有一個優點就是,這樣的程序不依賴于OS,可以直接在Windows或者其它OS上運行。

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

    評論:
    # re: 純Java通過SSH執行Linux命令[未登錄] 2008-07-09 07:37 | javaread.com
    換個思路,是不是可以用webservice或者xml-rpc來解決問題呢  回復  更多評論
      
    # re: 純Java通過SSH執行Linux命令 2008-07-09 08:42 | 隔葉黃鶯
    我原來用的是 j2ssh 組件來用 ssh 協議連接 Linux 做各項系統操作的。  回復  更多評論
      
    # re: 純Java通過SSH執行Linux命令 2008-07-09 09:12 | Robin's Java World
    @javaread.com
    個人認為,這個思路換得不怎么樣了,呵呵。
    @隔葉黃鶯
    謝謝推薦,一會去看看。  回復  更多評論
      
    # re: 純Java通過SSH執行Linux命令[未登錄] 2008-07-09 09:59 | javaread.com
    如果具體到就是要用通過ssh來操作,也沒什么好說的,這也是一種可行的方法。如果換一些場景,情況可能就不是這樣了。比如,其實用戶不會給開通ssh的,或者想遠一些,用ruby,python來遠程執行linux命名呢。不過這就想遠了,呵呵。  回復  更多評論
      
    主站蜘蛛池模板: 亚洲最大的成人网站| 亚洲黄片手机免费观看| 一个人看的在线免费视频| 成年美女黄网站18禁免费| 亚洲理论片在线中文字幕| 免费毛片在线视频| 一本色道久久88—综合亚洲精品| 久久aⅴ免费观看| 亚洲色少妇熟女11p| 久久久久国色AV免费看图片| 一级毛片在线免费视频| 亚洲成人福利在线观看| 久久精品国产亚洲Aⅴ蜜臀色欲| 日韩成人毛片高清视频免费看| 亚洲国产精品自产在线播放| 人妻无码一区二区三区免费| 另类图片亚洲校园小说区| 亚洲图片一区二区| 国产成人亚洲精品影院| 免费国产污网站在线观看| 亚洲国产精品无码观看久久| 亚洲国产成人久久综合一| 免费在线观看的黄色网址| 免费阿v网站在线观看g| 今天免费中文字幕视频| 久久久无码精品亚洲日韩蜜臀浪潮| 2021在线观看视频精品免费| 国产成人无码免费网站| 亚洲人成人网站18禁| 亚洲国产综合精品| 亚洲成A∨人片在线观看不卡| 57pao一国产成视频永久免费| 亚洲人成在线播放| 国产成人免费a在线视频app| 一级毛片全部免费播放| 成人免费一区二区三区| 污视频网站在线免费看| 亚洲精品无码永久在线观看男男| 免费一级毛片一级毛片aa| 免费国产成人午夜在线观看| 亚洲国产美女精品久久久久|