2015-10-16 54 views
1

我的問題是各種this questionthis question的組合。我想安裝在其使用sudo權限路徑中有空格的文件時,如:帶有sudo和文件路徑空間的Java exec mount

sudo mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name 

如果有在路徑中沒有空格,我可以做到這一點,因爲這個用戶有mount命令sudo的權限:

Runtime.exec("sudo mount /path/to/mount/point /dir/without/spaces"); 

但也有空間,所以我嘗試:

Runtime.exec("sudo mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name"); 

這給了我 「無法識別的ARG '\'」 什麼的,從安裝這種效果。用單引號或雙引號包圍路徑名稱也不起作用。

然後我嘗試:

因爲須藤要輸入密碼的一些方法
Runtime.exec("sudo", "mount", "/path/to/mount/point", "/dir with/spaces in name"); 

這當然是失敗了,即使我通常不需要輸入密碼sudo的安裝。 Faaantastic。

這看起來像是一個catch-22給我。如果我使用單個String方法,我可以使用sudo工作,或者如果使用String數組方法,我可以使用路徑名工作。我如何獲得這兩個工作?

回答

1

單個反斜槓不能逐字寫入字符串。反斜槓需要轉義,所以使用\\

Runtime.exec("sudo mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name"); 

至於密碼,sudo不得索取密碼,如果最近你進入它在相同的外殼。如果您希望允許在沒有超級用戶權限的情況下安裝指定的路徑(對於常規用戶),請編輯其/etc/fstab條目,如here所示。

添加user它的選項,如:

/dev/sda8 /media/foo ext4 rw,user,exec 0 0 

,然後添加權限,讀取和寫入:

# chmod a+rw /media/foo 

那麼該訂單可能是:

Runtime.exec("mount /path/to/mount/point /dir\\ with/spaces\\ in\\ name"); 

Runtime.exec("/bin/mount", "/path/to/mount/point", "/dir with/spaces in name"); 

或類似的。

+0

感謝您的回答。對不起,我昨天急着忘了逃避我的反斜槓:這不是我遇到的問題。我已經嘗試過使用單個,雙個甚至三個反斜槓(用Java語言表示的「\\」,「\\\\」和「\\\\\」)的每一個組合,但不幸的是這些工作都沒有。 Sudo也必須留在那裏,因爲我從這個帳戶運行的帳戶具有sudo許可權,但不是經常許可,我無法控制這一點。我知道這是一組非常特殊的限制條件。 –

+0

你想'sudo'而不提供用戶密碼? – user2622016

+0

基本上我需要一個解決方案,它既允許帶空格的路徑,又不需要我提供密碼。我已經在/ etc/sudoers中爲此帳戶使用NOPASSWD設置了mount命令。 –