隨筆-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 閱讀(15785) 評論(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命名呢。不過這就想遠了,呵呵。  回復  更多評論
            
          主站蜘蛛池模板: 赣榆县| 北流市| 元阳县| 贺兰县| 买车| 项城市| 贡山| 古浪县| 视频| 资源县| 黄石市| 松阳县| 大庆市| 房产| 水富县| 南雄市| 肇东市| 武清区| 衡阳市| 宜黄县| 台中市| 江陵县| 康马县| 白山市| 沙雅县| 新乐市| 新昌县| 肇庆市| 容城县| 乌拉特中旗| 白朗县| 河间市| 昌黎县| 乌拉特后旗| 莲花县| 张北县| 峨边| 察雅县| 伊川县| 平和县| 新竹县|