歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java使用SSH執行UNIX命令問題

這幾天項目中要把原來用FTP與TELNET兼容SSH協議,使用com.jcraft.jsch包,也差不多改完,把遇到的問題總結如下: 
 
 
        第一個就是登陸不上,返回異常:auth fail,一開始就登陸不上,郁悶死啦。
 
        不過最後還是在百度找到答案,解決如下:
 
        修改配置文件sshd_config,將PasswordAuthentication設置為 yes  (是否需要密碼驗證)
 
      然後重啟。 
 
        然後是要修改unix的IP 地址,發送了修改命令後,就沒反應了。不過還好第二天反應過來,IP改變後連接就斷開了吧,開始寫的程序是要獲得返回信息的,一直在等待對方返回。後來就直接發送命令就不管了,然後用修改的新IP連接上去,獲得IP,然後比較一個看是否修改了。來個簡化的:
 
    /**
    * 只發送執行命令不需要返回結果
    *
    * 修改IP時使用,修改後連接斷開,不能正常獲得返回信息.
    * @param command
    * @throws Exception
    */
    public void sendCmd(String command) throws Exception
    {

        Channel channel = session.openChannel("exec");
        ssh = (ChannelExec) channel;
        ssh.setCommand(command);
        ssh.connect();
      //當然後面得關閉
    }
 
 
 
  然後再連接上去,獲得IP比較雲雲。
 
 
 
      執行shell命令,當然還要獲得返回信息的。。。修改IP是執行SFTP上傳上去的腳本,自己寫的,然後執行完了會echo 返回信息,這沒問題,後來要查對方的JDK版本號,直接調unix上的java -version,卻什麼也不返回了。
 
還是百度,說是返回的信息可能是標准輸出,也有可能是錯誤輸出。所以就不能只獲得一個輸出流了,要這樣:
 
      InputStream InputStream = ssh.getInputStream();
        InputStream ErrStream = ssh.getErrStream(); 

      網上我看來還有ssh.getStdout(),但我的怎麼就沒看到~~
 
來一個簡單版本吧:
 
    * 執行命令,返回執行結果
    * @param command 命令
    * @return String 執行命令後的返回
    * @throws IOException
    * @throws JSchException
    */
    public String sendCmd(String command)
            throws Exception
    {
        byte[] tmp = new byte[1024]; //讀數據緩存
        StringBuffer strBuffer = new StringBuffer();  //執行SSH返回的結果
             
        Channel channel = session.openChannel("exec");
        ssh = (ChannelExec) channel;
             
        //返回的結果可能是標准信息,也可能是錯誤信息,所以兩種輸出都要獲取
        //一般情況下只會有一種輸出.
        //但並不是說錯誤信息就是執行命令出錯的信息,如獲得遠程java JDK版本就以
        //ErrStream來獲得.
        InputStream InputStream = ssh.getInputStream();
        InputStream ErrStream = ssh.getErrStream(); 
       
        ssh.setCommand(command);
        ssh.connect();
       
        //開始獲得SSH命令的結果
        while(true)
        {
        //獲得錯誤輸出
            while(ErrStream.available() > 0)
            {
                int i = ErrStream.read(tmp, 0, 1024);
                if(i < 0)
                {
                break;
                }
                   
                strBuffer.append(new String(tmp, 0, i));
            }
           
            //獲得標准輸出
            while(InputStream.available() > 0)
            {
                int i = InputStream.read(tmp, 0, 1024);
               
                if(i < 0)
                {
                break;
                }
                strBuffer.append(new String(tmp, 0, i));
            }
           
            if(ssh.isClosed())
            {
                logger.info("exit-status: " + ssh.getExitStatus());
                break;
            }
            try
            {
                Thread.sleep(100);
            }
            catch(Exception ee)
            {
            }
        }
 
       
        return strBuffer.toString();
    }
 
  然後對返回信息進行處理雲雲。
 
基本就這幾個問題,其它都很順利。

--------------------------------------分割線 --------------------------------------

編寫高質量代碼 改善Java程序的151個建議 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm

Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm

Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm

Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm

Java對象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm

通過配置SSH深刻理解Puppet的語法及工作機制 http://www.linuxidc.com/Linux/2013-07/87882.htm

Ubuntu下SSH安裝或設置 http://www.linuxidc.com/Linux/2013-07/87368.htm

--------------------------------------分割線 --------------------------------------

Copyright © Linux教程網 All Rights Reserved