⑴ 使用java連接linux,執行shell命令返回值有亂碼,怎麼解決
packagecom.pasier.xxx.util;
importjava.io.IOException;
importjava.io.InputStream;
importjava.nio.charset.Charset;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importch.ethz.ssh2.ChannelCondition;
importch.ethz.ssh2.Connection;
importch.ethz.ssh2.Session;
importch.ethz.ssh2.StreamGobbler;
publicclassRmtShellExecutor{
privatestaticfinalLoggerLOG=LoggerFactory.getLogger(RmtShellExecutor.class);
privateConnectionconn;
privateStringip;
privateStringusr;
privateStringpsword;
privateStringcharset=Charset.defaultCharset().toString();
privatestaticfinalintTIME_OUT=1000*5*60;
publicRmtShellExecutor(Stringip,Stringusr,Stringps){
this.ip=ip;
this.usr=usr;
this.psword=ps;
}
privatebooleanlogin()throwsIOException{
conn=newConnection(ip);
conn.connect();
returnconn.authenticateWithPassword(usr,psword);
}
publicStringexec(Stringcmds)throwsIOException{
InputStreamstdOut=null;
InputStreamstdErr=null;
StringoutStr="";
StringoutErr="";
intret=-1;
try{
if(login()){
Sessionsession=conn.openSession();
session.execCommand(cmds);
stdOut=newStreamGobbler(session.getStdout());
outStr=processStream(stdOut,charset);
LOG.info("caijl:[INFO]outStr="+outStr);
stdErr=newStreamGobbler(session.getStderr());
outErr=processStream(stdErr,charset);
LOG.info("caijl:[INFO]outErr="+outErr);
session.waitForCondition(ChannelCondition.EXIT_STATUS,TIME_OUT);
ret=session.getExitStatus();
}else{
LOG.error("caijl:[INFO]ssh2loginfailure:"+ip);
thrownewIOException("SSH2_ERR");
}
}finally{
if(conn!=null){
conn.close();
}
if(stdOut!=null)
stdOut.close();
if(stdErr!=null)
stdErr.close();
}
returnoutStr;
}
privateStringprocessStream(InputStreamin,Stringcharset)throwsIOException{
byte[]buf=newbyte[1024];
StringBuildersb=newStringBuilder();
while(in.read(buf)!=-1){
sb.append(newString(buf,charset));
}
returnsb.toString();
}
publicstaticvoidmain(String[]args){
Stringusr="root";
Stringpassword="12345";
StringserverIP="11.22.33.xx";
StringshPath="/root/ab.sh";
RmtShellExecutorexe=newRmtShellExecutor(serverIP,usr,password);
StringoutInf;
try{
outInf=exe.exec("sh"+shPath+"xn");
System.out.println("outInf="+outInf);
}catch(IOExceptione){
e.printStackTrace();
}
}
}
⑵ 如何得到shell的返回值
你說的
返回值
是函數的返回值嗎還是一條命令的返回值
如果是函數返回值
可以在函數最後用print
或者echo
返回
你要的
返回值。
這樣函數內部處理返回值列印就不可以有其他列印,否則影響返回值。
如果是命令執行的返回值也用$()
例子:
function
exmaple1
{
input=$1
#函數有一個輸入參數
output="${input}
stringappend"
echo
$output
#
函數的返回值
}
outValue=$(exmaple1
「test」)
#
將函數的返回值賦值給outValue
⑶ java執行帶參數的shell腳本並返回值
文件名確實不對
.sh文件才是linux下的批處理文件,它不認bat的
另外要保證.sh中調用的其他函數在當前目錄下能正常運行
⑷ java 執行shell 腳本 返回 find的內容~~求助
你先列印pathshell這個變數,看這個變數是不是正確的,如果不正確,當然無法定位到find命令了。
你後面的代碼是沒有問題的,只能出在這個地方。
還有你的find命令沒有參數傳入啊,命令參數之類的還是是需要的。
⑸ shell 裡面調用 java 怎麼取到java地返回值
System.exit(0)這個值,windows下通過 %errorlevel%獲取
~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~
⑹ Java解析執行shell命令返回的結果
String s = 那串結果;
String useful = s.substring(s.indexOf("/"));
String[] every = useful.split(" /");
得到的數組就是每個的信息,然後再解析(但要注意,第一個的開頭有一個斜線/)
⑺ java 怎麼取外部程序運行後的返回值
JAVA 中 process 類的使用
Process是一個抽象類 封裝了一個進程
創建 process
Process p = Runtime.getRuntime().exec(cmd); cmd 是字元串類型 也可以是字元串類型的數組 內容就是 命令行
Process p =ProcessBuilder.start();
Process 類提供了子進程的輸入流,子進程的輸出流子進程的輸入流,等待進程完成,檢查進程的退出狀態以及銷毀進程的方法;
創建的子進程沒有自己的控制台或終端,其所有的io操作都是通過(輸入流、輸出流、錯誤流)重定向到父進程中。
destroy()
殺掉子進程。
exitValue()
返回子進程的出口值。
InputStream getErrorStream()
獲得子進程的錯誤流。
InputStream getInputStream()
獲得子進程的輸入流。
OutputStream getOutputStream()
獲得子進程的輸出流。
waitFor()
導致當前線程等待,如果必要,一直要等到由該 Process 對象表示的進程已經終止。
-------分割線,以上來自網路-------
其中的exitValue()函數返回值就是你需要的東西。按照你的示例,return 12345,取得的值不一定等於12345,因為每個不同的shell對於程序退出的返回值是有自己的定義的,不一定是把程序return的值直接返回。可以查看各類shell的編程幫助。
⑻ java調用shell腳本,並得到shell腳本的返回值
文件名確實不對
.sh文件才是linux下的批處理文件,它不認bat的
另外要保證.sh中調用的其他函數在當前目錄下能正常運行
⑼ 如何獲取shell函數的返回值及shell命令的返回值
函數 返回值 。使用return 返回出來,調用函數就獲取到
shell命令返回值。使用 $?獲取