2012-04-11 63 views
10

我正在構建一個Gnome外殼擴展,並且我希望能夠使用升級的特權來做一些事情。所以,我認爲我需要使用「政策套件」,但我不知道如何去做這件事。Gnome外殼特權升級

所以,說我想要做這樣的事情ifconfig eth0 downifconfig eth0 up

我可以從終端中運行:pkexec ifconfig eth0 down,它會提示輸入密碼,然後實現它。

但是,我該如何從擴展內部做到這一點?

我很確定它與在/ usr/share/polkit-1/actions中創建文件有關,但我無法在互聯網上或其他地方找到任何東西。

我希望能夠設置它,以便不需要鍵入密碼,並且擴展程序可以隨時運行某些命令。

我知道允許運行任何命令是一個非常糟糕的主意。這不是我所要求的,我希望能夠運行一個程序/命令。

編輯:我不知道,但我認爲這可能不可能沒有必要輸入密碼。我只知道sudo在第一次之後沒有要求輸入密碼,所以我需要類似的功能。不知道有什麼可能。

+0

這通常不會起作用,因爲您的shell擴展(在JavaScript中)將在與shell本身相同的進程中運行,從而將其暴露給所有類型的安全性「泄漏......」 - 實際上,安全賭注是使用'pkexec'或以其他方式隔離特權代碼中的「不安全」位...... PS:通過' sudo等是一個全系統的安全設置;默認通常在(長)後重新提示,而 – BRFennPocock 2012-08-03 01:06:36

+0

@BRPocock是使用'pkexec'是我想要做的。我將如何從擴展內部做到這一點? – Jay 2012-08-03 11:36:26

回答

2

這是一個很長一段時間,因爲我沒有用PolicyKit的工作,但是從我記得,你曾經確實創造動作/目錄中的文件,有喜歡的內容:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE policyconfig PUBLIC 
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" 
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd"> 
<policyconfig> 

    <action id="org.freedesktop.policykit.pkexec.run-ifconfig"> 
    <description>Configure network</description> 
    <message>Authentication is required to set ifconfig parameters</message> 
    <defaults> 
     <allow_any>no</allow_any> 
     <allow_inactive>no</allow_inactive> 
     <allow_active>...</allow_active> 
    </defaults> 
    <annotate key="org.freedesktop.policykit.exec.path">/sbin/ifconfig</annotate> 
    </action> 

</policyconfig> 

你必須更改值爲:

<allow_active>...</allow_active> 

您想要的值。選擇的值:

  • 「無」 將拒絕訪問
  • 「是」 會隱允許訪問
  • 「AUTH_USER」 需要用戶認證
  • 「auth_admin」 要求admin認證。
  • 「auth_user_keep」和「auth_admin_keep」功能類似,但在幾分鐘後保留認證。
  • 加上一些其他值,查看here

將allow_active鍵的值更改爲「yes」應該停止認證需求。

然後您需要根據需要調整動作文件並調用它。

雨果,

1

我有很多相同的問題,嘗試和調整實施選擇。這是我想出來的。

正如其他人回答,您可能需要編寫一個策略文件(我使用「auth_admin」)。我把它放在 「/ usr/share/polkit-1/actions/tuned-adm。政策「,我認爲我不能通過擴展模型來分發,所以我不得不要求上游包含它。

接下來,我使用pkexec和我的命令來獲取」sudo popup「並獲得它工作

const GLib = imports.gi.GLib; 
const Util = imports.misc.util; 
this.pkexec_path = GLib.find_program_in_path('pkexec'); 
this.tunedadm_path = GLib.find_program_in_path('tuned-adm'); 
let result = Util.trySpawnCommandLine(this.pkexec_path + " " + this.tunedadm_path + " list") 

真正在這裏踢球是我用幾個其他的方法來運行命令行,他們將鎖定GNOME的外殼,我發現這裏的代碼:。https://github.com/nodefourtytwo/gnome-shell-extension-cpu-freq/blob/master/extension.js是特別方便