歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java使用SSH執行UNIX命令問題

Java使用SSH執行UNIX命令問題

日期:2017/3/1 9:41:12   编辑:Linux編程

這幾天項目中要把原來用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