簡體   English   中英

如何通過Java代碼在Linux上運行超級用戶命令?

[英]How to run superuser commands on Linux through Java code?

我的應用程序有多個用戶和1個超級用戶。 我試圖通過Java代碼在Linux中編寫和存儲文件但我得到權限被拒絕錯誤。 我使用了以下代碼:

Process process = Runtime.getRuntime().exec("/usr/bin/tiff2pdf -o /tmp/tiff_dir/temp.pdf /tmp/tiff_dir/image.tiff");
int returnCode = process.waitFor();

我收到以下錯誤:

java.io.FileNotFoundException: image.tiff (Permission denied)

根據我的分析,似乎因為用戶沒有root權限,我收到此錯誤。 這是什么解決方案?

你不應該像超級用戶一樣運行這樣的命令,因為它會帶來安全風險(即如果某人獲得了對你的java程序的控制權,那么他們就擁有了王國的鑰匙)。 相反,您應該以較低的權限運行。

看起來問題是訪問image.tiff而不是tiff2pdf 檢查image.tiff的所有者和權限。

首先,這兩行不會產生java.io.FileNotFoundException: image.tiff (Permission denied)

Process process = Runtime.getRuntime().exec("/usr/bin/tiff2pdf -o temp.pdf image.tiff");
int returnCode = process.waitFor();

如果由於某種原因,命令失敗,它將返回非零返回碼,將在進程的標准錯誤上產生一些輸出(這是約定)。 你可以從process.getErrorStream()獲得那個標准錯誤process.getErrorStream()為了以防萬一,也可能值得看看標准輸出)。 如果在那里找不到文件的問題,它將不會拋出這樣的FileNotFoundException ,因為Java無法理解命令的預期輸出。

編輯,跟隨你的評論:

它僅從這一點拋出,returnCode的值為1.一旦我手動更改root用戶的文件權限,一切正常。

那是不可能的。 如果您的應用程序在這兩行中的任何一行引發異常,它將退出正常的控制流:您根本無法讀取returnCode

其次,你應該使用String[]中的每個參數運行你的exec命令,而不是將它全部放在一行中,如果文件名有空格,這應該可以防止引用問題。

我還建議在命令中使用絕對路徑,以確保您在所期望的目錄中工作。 (*編輯:*現在您正在使用絕對路徑,請確保您的用戶對/tmp/tiff_dir具有rwx權限。)

為了更直接地回答你的問題,你當然可以使用Runtime.exec(new String[] {"/usr/bin/sudo", ... the rest of your command ... }運行sudo Runtime.exec(new String[] {"/usr/bin/sudo", ... the rest of your command ... } ,但這是一個壞主意 ,出於安全原因。您還需要更改sudoers文件以允許它沒有密碼,或者在命令行上找到傳遞密碼的方法(絕對有安全風險!)或將其傳遞給輸入以某種方式手動流。)

嘗試這個 :

File file = new File("/opt/image.tiff");
Runtime runtime = Runtime.getRuntime();
runtime.exec(new String[] { "/bin/chmod", "777",file.getPath()});

這將對文件執行完全權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM