其實這個問題就是對小白不是很友好,百度上基本都是一個答案就是用Runtime().getRuntime().exec("/bin/bash/","-c","chmod 777 fileName"),當然當這個文件屬于當前用戶的時候這個命令是可以執(zhí)行的雪情,但當這個文件屬于root用戶涤姊,那么就會操作失敗,原因也很簡單就是當前用戶無權限修改root用戶的文件權限,如圖
那么就需要使用sudo chmod 777 test1.sh。來修改文件的執(zhí)行權限扛禽,這個操作需要用戶輸入密碼才會被允許執(zhí)行懂牧,但是我們使用Java來直接執(zhí)行Linux命令是無法手動輸入密碼的侈净,在思考之后,發(fā)現(xiàn)Linuxshell腳本文件中可以直接輸入密碼僧凤,而且在運行shell腳本時是可以從外部進行傳參的畜侦,因此可以使用Java來運行Linux中的某個腳本并把需要修改的文件的全路徑加文件名當作參數(shù)傳遞進去,就可以完成對root用戶文件的權限修改躯保,例如我在/home/xiaoxu/Desktop/test/下編寫了一個changeMode.sh的可執(zhí)行腳本旋膳,腳本內(nèi)容為
此時使用Java執(zhí)行這個腳本,并在執(zhí)行的同時將需要修改權限的文件名當作參數(shù)傳遞進去就可以完成權限的修改途事,具體代碼如下
private List<String> executeCommand(String filePath, String command) {
? ? ? ? int runStatus = 0;//命令執(zhí)行的狀態(tài)碼验懊,除0外都是運行失敗,具體數(shù)字對應Linux的錯誤碼
? ? ? ? List<String> list = new ArrayList<>();//定義一個數(shù)組用來存儲命令執(zhí)行結果
? ? ? ? List<String> errList = new ArrayList<>();//用來存儲命令執(zhí)行失敗的結果
? ? ? ? ProcessBuilder builder = new ProcessBuilder(command);//使用ProcessBuilder來運行Linux命令
? ? ? ? Process process = null;
? ? ? ? builder.directory(new File(filePath));//Linux命令執(zhí)行環(huán)境
? ? ? ? try {
? ? ? ? ? ? process = builder.start();//開始執(zhí)行尸变,返回的是一個Process對象鲁森,通過這個對象可以讀取執(zhí)行結果
? ? ? ? ? ? BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
? ? ? ? ? ? BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));
? ? ? ? ? ? String line = "";
? ? ? ? ? ? while ((line = reader.readLine()) != null) {
? ? ? ? ? ? ? ? list.add(line);
? ? ? ? ? ? }
? ? ? ? ? ? String errorStr = "";
? ? ? ? ? ? while ((errorStr = error.readLine()) != null)
? ? ? ? ? ? ? ? errList.add(errorStr);
? ? ? ? ? ? runStatus = process.waitFor();
? ? ? ? ? ? System.out.println(runStatus);
? ? ? ? } catch (IOException | InterruptedException e) {
? ? ? ? ? ? list.add(e.getMessage());
? ? ? ? ? ? list.add("請檢查你的命令或shell文件的正確性!或許是權限不足的問題");
? ? ? ? } finally {
? ? ? ? ? ? if (process != null) {
? ? ? ? ? ? ? ? process.destroy();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ?return list;
? ? }
executeCommand( filePath, command);
filePath是上面說的修改權限的腳本路徑振惰,command是該腳本的名字加上需要修改的文件全路徑加名稱歌溉。
純屬自己研究出來的,如果還用同學不明白,可以留言痛垛,我也是小白草慧,可以一起研究。匙头。漫谷。。蹂析。