2012-01-31 52 views
2

我正在嘗試編寫執行某些終端命令的Java代碼。代碼應該執行這個命令sudo mount -o loop system.img system。但是有幾個問題。首先,要執行這個命令,我必須是root。我知道我可以通過sudo su,但在關閉終端窗口時我怎樣才能保持root?如果我使用命令sudo mount -o loop system.img system如何在Java代碼中提供密碼?在Android上使用Java執行mount命令

第二個問題是:我可以如下執行命令嗎?我想我不行。我想我不能。那我該怎麼做呢?有任何想法嗎?

備註:system.img是一個編譯好的Android os文件。而system是一個空目錄。我試圖做的事情是將system.img文件掛載到system目錄中。

+0

不應該在字符串'commands'各有一個空間之前還是之後? – 2012-01-31 12:11:43

+0

我不知道。這件事我真的很新。但我認爲你是對的。 – juliadream 2012-01-31 12:23:18

回答

1

該問題已通過使用shell腳本解決。

我寫了一個腳本只包括這一行:

echo myPassword | sudo -S mount -o loop system.img system 

然後我在Java代碼中運行它,例如:

Runtime.getRuntime().exec("sh 1.sh"); 
1

sudo這樣的程序直接從終端設備讀取密碼,而不是從stdin讀取密碼,所以這不幸並不是一件微不足道的事情。我不確定這是否適合Android,但在一般的UNIX系統上,最簡單的解決方案是使用expect,這是一個模擬終端的庫,從而實現這些交互的自動化。它通常被用作嵌入在Tcl中的獨立程序,並且我已經將Java啓動的expect與其他工具(如sudo)進行通信的系統放在一起,並且它工作正常。

expect包含一種聲明性腳本語言,告訴它如何運行另一個程序以及如何對該程序的輸出作出反應。

你會做的是使用Runtime.exec()來執行expect程序,提供一個腳本,只是運行「sudo mount」,監視密碼提示,並提供密碼。該腳本將可能只是看起來像(G4rb4geB4rg3是密碼):

spawn sudo mount -o loop /home/user1/Desktop/aDirectory/system.img 
expect "password:" 
send "G4rb4geB4rg3\r" 
expect eof 
+0

謝謝歐內斯特,我會試試。 – juliadream 2012-01-31 12:27:26

+0

你的意思是像sudo這樣的程序?除此之外似乎是合理的。 – correnos 2012-02-01 03:57:48

+0

對不起,是的。糾正。 – 2012-02-01 03:59:28

0

我敢肯定「須藤」和「安裝」是分開的,因爲它不是你調用一個可執行。此外,如果您使用-S命令行開關啓動sudo,則它可以直接從stdin獲取密碼,因此您只需啓動該進程並傳入輸入流中配置的任何密碼即可。

+0

你能給我一些代碼示例嗎? – juliadream 2012-02-01 07:30:07