2009-10-04 236 views
20

我正在用Java設計一個小軟件。我不知道我在做什麼這個術語/定義,但是我正在向Java終端提示Java命令。事情是這樣的:Mac OS X中是否有任何圖形「sudo」?

Process process = Runtime.getRuntime().exec("command"); 

我已經在Linux下這樣做之前,我用gksudo爲所需的root密碼的命令。

在OS X中是否有任何gksudo?任何圖形彈出窗口詢問root密碼?

+1

當我打開甲基苯丙胺,有人問我給我的密碼。或者當我安裝pkg時,在x中調用的彈出框是什麼? – Johannes 2009-10-05 21:29:01

回答

-3

如果您使用的是終端,那麼只需使用「sudo」,它將在終端本身提示輸入用戶密碼(與我相信使用圖形彈出框的gksudo相反)。 Sudo適用於Linux和OS X.

+1

它應該是圖形... =) – Johannes 2009-10-04 19:54:12

+1

什麼小丑downvoted這個?當我回答這個問題時,「圖形」這個詞在問題中沒有出現。它仍然是一個有效的答案,即使它不是*完全是*原始海報問的問題 – 2013-06-09 04:11:34

+0

這個問題顯然要求sudo的圖形版本(第4個字)。 – 2017-08-05 13:05:44

9

這也看起來很有希望:cocoasudo

enter image description here

它採用OSX本地授權服務API:

對於Mac OS X基於可可的應用程序,通過授權服務API提供的sudo功能非常強大。使用API​​可以提示用戶輸入用戶名和密碼,請求提升權限。

...

對於這種情況,我寫了一個小工具,我已經被稱爲cocoasudo。以和使用sudo相同的方式使用cocoasudo。但是,不是在終端窗口中提示用戶輸入密碼,而是通過授權服務API獲取對話提示。

+0

不知何故,這對我無效:我試過'./cocoasudo systemsetup'並得到了圖形提示,但是輸入我的密碼,'systemsetup'仍然認爲我不是'sudo'ing,因爲它抱怨:'你需要管理員訪問來運行這個工具...退出!' – 2014-10-24 10:26:13

18

您可以更礦石較少設法使用AppleScript編寫自己:

#!/bin/sh 
osascript -e "do shell script \"$*\" with administrator privileges" 

cocoasudo看起來更美觀悅目,但是這已經部署。

+2

任何方式來記住輸入的密碼之間的通話嗎?我需要連續多次撥打這樣的腳本,並且不希望用戶多次輸入密碼。 – 2013-10-23 14:41:32

+0

這不再有效。檢查我的答案是否有更新或更多選項。隨時更新你的@ZJR! ; P – cregox 2015-11-19 14:09:53

4

如果您正在運行調用其他命令的shell腳本,我發現cocoasudo不起作用。你將不得不在所有子命令中使用cocoasudo,這將會彈出每個調用的提示。

osascript解決方案似乎工作得更好,但我需要調整它以使用涉及包含空格的路徑的命令。

#!/bin/sh 
export bar="" 
for i in "[email protected]"; do export bar="$bar '${i}'";done 
osascript -e "do shell script \"$bar\" with administrator privileges" 
+1

太棒了。唯一的缺點是對話框顯示「osascript想要進行更改」,這可能會讓用戶感到困惑,因爲她可能不知道osascript是什麼。 – gregschlom 2011-11-10 15:54:46

3

做出如下,在這個例子中,我去創建一個文件夾在/ var /鎖並設置權限爲777:

String[] command = { 
     "osascript", 
     "-e", 
     "do shell script \"mkdir -p /var/lock && chmod 777 /var/lock\" with administrator privileges" }; 
Runtime runtime = Runtime.getRuntime(); 
try { 
    Process process = runtime.exec(command); 
    BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 
    String line; 
    while ((line = bufferedReader.readLine()) != null) 
      System.out.println(line); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

在Linux上也許可以與gksudo做這個,但我沒有測試它,我去測試後在這裏發佈結果。

+0

這正是我正在尋找的東西,在這個問題上花了幾個小時......謝謝你。 – antonio081014 2013-03-22 23:30:01

+0

感謝您的解決方案,是否可以從「osascript想要進行更改」的消息中替換「osascript」? – Arash 2014-11-06 23:50:26

+0

還有一種創建類似於根憑據的會話的方法,因此每次都不會詢問用戶名和密碼嗎? – Arash 2014-11-06 23:59:03

0

這些答案似乎有很多錯誤的信息。爲了節省其他人的一些時間,我張貼我自己的發現:

首先,就像問題的海報一樣,我也有這種情況,我需要從Java應用程序中提升權限

我把它分成兩個腳本。第一個腳本是使用一些命令行參數從Java執行的。第二個腳本執行所有需要root權限的步驟。這個想法當然是在第一個腳本中使用cocoasudo來以root權限執行第二個腳本。

我已經通過廣泛的日誌記錄確認了單獨的文件,腳本確實按照我的意圖進行了操作。而且它們在從命令行手動啓動(當然具有普通用戶權限)時工作良好。

從Java應用程序啓動時,我得到了cocoasudo提示符,但沒有任何反應。即使第二個腳本的第一個日誌記錄輸出也不會出現。

當我將第一個腳本更改爲使用osascript時,再次確認腳本一切都正確無誤後,我甚至不會在Java中運行時發出提示。

這是所有OS X Mountain Lion上的。就好像Apple構建了一些安全衛士一樣,這些安全衛士阻止腳本在Java內部以root權限執行。因爲cocoasudo本身實際運行,所以我傾向於認爲解決方案是編寫類似於cocoasudo的東西,但是使用Cocoa API調用執行所有其他所需操作。這也可以進行代碼簽名。

1

ZJR's answer,我做了這個到Automator的,所以你可以使用它作爲一個服務或什麼:

on run {input, parameters} 
    do shell script "sudo open \"" & (POSIX path of input as string) & "\"" with administrator privileges 

    return input 
end run 

或者,也許你只是覺得他的回答是過時的,還是要一個AppleScript,只是寫腳本編輯器這一行:

do shell script "[[your command]]" with administrator privileges 

,然後可以make into an app並把它作爲一個服務或什麼的。