1.Java調(diào)用shell
目前創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、巫山網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
Java語言以其跨平臺性和簡易性而著稱,在Java里面的lang包里(java.lang.Runtime)提供了一個允許Java程序與該程序所運
行的環(huán)境交互的接口,這就是Runtime類,在Runtime類里提供了獲取當(dāng)前運行環(huán)境的接口。
其中的exec函數(shù)返回一個執(zhí)行shell命令的子進程。exec函數(shù)的具體實現(xiàn)形式有以下幾種:
public Process exec(String command) throws IOException
public Process exec(String command,String[] envp) throws
IOException
public Process exec(String command,String[] envp,File dir) throws
IOException
public Process exec(String[] cmdarray) throws IOException
public Process exec(String[] cmdarray, String[] envp) throws
IOException
public Process exec(String[] cmdarray, String[] envp,File dir)
throws IOException
我們在這里主要用到的是第一個和第四個函數(shù),具體方法很簡單,就是在exec函數(shù)中傳遞一個代表命令的字符串。exec函數(shù)返回的是一個Process類
型的類的實例。Process類主要用來控制進程,獲取進程信息等作用。(具體信息及其用法請參看Java doc)。
1)執(zhí)行簡單的命令的方法:
代碼如下:
上面的代碼首先是聲明了一個代表命令的字符串commands,它代表了ls -l
這個命令。之后我們用Runtime.getRuntime().exec(commands)來生成一個子進程來執(zhí)行這個命令,如果這句話運行成功,則
命令 ls -l 運行成功(由于沒有讓它顯示,不會顯示ls -l
的結(jié)果)。后面的流操作則是獲取進程的流信息,并把它們一行行輸出到屏幕。2)執(zhí)行帶有參數(shù)的命令(尤其是參數(shù)需要用引號的)時則需要用String的數(shù)組來表示整個命令,而且要用轉(zhuǎn)義符把引號的特殊含義去除,例如我們要執(zhí)行
find / -name "*mysql*" -print 時,用如下代碼
Java 可以通過 Runtime 調(diào)用Linux命令,形式如下:
Runtime.getRuntime().exec(command)
但是這樣執(zhí)行時沒有任何輸出,因為調(diào)用 Runtime.exec 方法將產(chǎn)生一個本地的進程,并返回一個Process子類的實例(注意:Runtime.getRuntime().exec(command)返回的是一個Process類的實例)該實例可用于控制進程或取得進程的相關(guān)信息。
由于調(diào)用 Runtime.exec 方法所創(chuàng)建的子進程沒有自己的終端或控制臺,因此該子進程的標(biāo)準(zhǔn)IO(如stdin,stdou,stderr)都通過 Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream() 方法重定向給它的父進程了。
用戶需要用這些stream來向子進程輸入數(shù)據(jù)或獲取子進程的輸出,下面的代碼可以取到 linux 命令的執(zhí)行結(jié)果:
首先在shell中執(zhí)行js腳本需要可以執(zhí)行的環(huán)境,其次調(diào)配環(huán)境,之后進行運行,具體步驟與實例如下:
①安裝java、javac環(huán)境(如已安裝環(huán)境請?zhí)^此步)
yum install java-1.6.0-sun.x86_64 java-1.6.0-sun-devel.x86_64
②準(zhǔn)備java程序RunScriptFile.java
import java.io.FileReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class RunScriptFile {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
try {
FileReader reader = new FileReader("testFile.js");
engine.eval(reader);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
③準(zhǔn)備js文件testFile.js
function add(a, b) {
c = a + b;
return c;
}
result = add (10, 5);
print ('Result = ' + result);
④編譯java程序
javac RunScriptFile.java
會在當(dāng)前目錄生成RunScriptFile.class文件
⑤執(zhí)行程序
java RunScriptFile
⑥結(jié)果顯示
Result = 15
Java可以通過Runtime調(diào)用Linux命令,形式如下:
Runtime.getRuntime().exec(command)
但是這樣執(zhí)行時沒有任何輸出,因為調(diào)用Runtime.exec方法將產(chǎn)生一個本地的進程,并返回一個Process子類的實例(注意:Runtime.getRuntime().exec(command)返回的是一個Process類的實例)該實例可用于控制進程或取得進程的相關(guān)信息。
由于調(diào)用Runtime.exec方法所創(chuàng)建的子進程沒有自己的終端或控制臺,因此該子進程的標(biāo)準(zhǔn)IO(如stdin,stdou,stderr)都通過Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream()方法重定向給它的父進程了。
用戶需要用這些stream來向子進程輸入數(shù)據(jù)或獲取子進程的輸出,下面的代碼可以取到linux命令的執(zhí)行結(jié)果:
try{
String[]cmd=newString[]{”/bin/sh”,“-c”,”ls“};
Processps=Runtime.getRuntime().exec(cmd);
BufferedReaderbr=newBufferedReader(newInputStreamReader(ps.getInputStream()));
StringBuffersb=newStringBuffer();
Stringline;
while((line=br.readLine())!=null){
sb.append(line).append(”\n”);
}
Stringresult=sb.toString();
System.out.println(result);
}catch(Exceptione){
e.printStackTrace();
}
js是前端的語言。
在windows下js可以通過activex調(diào)用執(zhí)行msdos,這也是通過了微軟的瀏覽器控件的,依賴于windows的一套東西,并不單純是js直接調(diào)用。
同樣的,在linux下也是不行的。
你是不是說的node.js調(diào)用shell?node是可以的,因為node是一個web容器,實際上底層是c++寫的,是通過c++來執(zhí)行shell命令,所以也不是js直接的調(diào)用。