2010-03-08 7 views
10

Ho un'app UI (utilizza GTK) per Linux che richiede di essere eseguita come root (legge e scrive/dev/sd *).Autenticazione dell'app GTK per l'esecuzione delle autorizzazioni root

Invece di richiedere all'utente di aprire una shell di root o di utilizzare "sudo" manualmente ogni volta che avvia la mia app, mi chiedo se l'app possa utilizzare alcune API fornite dal sistema operativo per ottenere i permessi di root. (Nota: l'app gtk non può utilizzare la modalità "setuid", quindi non è un'opzione.)

Il vantaggio qui sarebbe un flusso di lavoro più semplice: l'utente potrebbe, dal suo account utente predefinito, fare doppio clic sulla mia app da il desktop invece di dover aprire un terminale root e avviarlo da lì.

Chiedo questo perché OS X offre esattamente questo: Un'app può chiedere al sistema operativo di lanciare un eseguibile con permessi di root - il sistema operativo (e non l'app) quindi chiede all'utente di inserire le sue credenziali, verificarle e quindi lanciare l'obiettivo come desiderato.

mi chiedo se c'è qualcosa di simile per Linux (Ubuntu, per esempio)

Chiarimento:

Così, dopo il suggerimento a PolicyKit mi chiedo se posso usare che per ottenere r/w accesso ai dispositivi di blocco "/ dev/sd ...". Trovo che la documentazione sia abbastanza difficile da capire, quindi ho pensato di chiedere prima se questo è possibile prima di passare ore a cercare di comprenderlo invano.

Aggiornamento:

L'applicazione è uno strumento di riparazione del disco azionato a distanza per l'utente unsavvy Linux, e quei niubbi Linux non avrà molto la comprensione di usare sudo o anche cambiare le appartenenze ai gruppi di loro utenti, soprattutto se il loro disco ha appena iniziato a recitare e stanno andando fuori di testa. Ecco perché cerco una soluzione che eviti tecnicismi come questo.

+0

È sicuramente possibile impostare le cose in questo modo: ad esempio, il gestore di pacchetti Synaptic viene solitamente impostato in questo modo. – caf

+0

Non sono sicuro che si dovrebbe davvero voler eseguire come root. Se hai solo bisogno di accedere al disco, è meglio aggiungere l'utente al gruppo "disco". –

+0

Milano - La mia app funziona come uno strumento di riparazione di un disco. Non credo che chiunque voglia usarlo sia disposto a cambiare le sue impostazioni a livello di sistema per questo, in modo quasi permanente. –

risposta

3

Il vecchio modo, semplice ma ora in fase di eliminazione, è GKSu. Here è la discussione sul futuro di GKSu.

Il nuovo modo è utilizzare PolicyKit. Non sono abbastanza sicuro di come funzioni, ma penso che sia necessario avviare l'app utilizzando il comando pkexec.

UPDATE:

Guardando il codice di esempio su http://hal.freedesktop.org/docs/polkit/polkit-apps.html, sembra che è possibile utilizzare PolicyKit per ottenere l'autorizzazione per determinate azioni che sono descritti da .policy i file in /usr/share/polkit-1/actions. L'azione per l'esecuzione di un programma come un altro utente è org.freedesktop.policykit.exec. Non riesco a trovare un'azione per accedere direttamente ai dispositivi a blocchi, ma devo ammettere che anche la documentazione di PolicyKit mi spezza il cervello.

Quindi, forse la soluzione più semplice per te è separare il codice di manipolazione del disco che richiede privilegi in un'utilità della riga di comando ed eseguirlo dall'applicazione della tua interfaccia grafica utilizzando g_spawn_[a]sync() con pkexec. In questo modo non dovresti preoccuparti di richiedere azioni e quel genere di cose. Probabilmente è comunque una cattiva pratica eseguire l'intera applicazione GUI come root.

Un altro suggerimento è quello di chiedere direttamente all'autore di PolicyKit (David Zeuthen).Oppure prova a pubblicare la tua domanda nella lista gtk-app-devel.

+0

Ho provato pkexec - sfortunatamente, non funziona nel mio caso, ricevo il seguente messaggio di errore: "Gtk-WARNING **: impossibile aprire display:" - "man pkexec" spiega perché: "L'ambiente in cui verrà eseguito PROGRAM verrà impostato su un ambiente noto e sicuro al minimo per evitare l'iniezione di codice tramite LD_LIBRARY_PATH o meccanismi simili. Inoltre, la variabile di ambiente PKEXEC_UID è impostata sull'id utente del processo che richiama il pkexec . Di conseguenza, pkexec non ti consente di eseguire ad es. X11 applicazioni come un altro utente poiché la variabile di ambiente $ DISPLAY è non impostata. " Darn. –

+1

Hmm, penso che l'API di PolicyKit ti permetta di ottenere la stessa cosa, ma dal tuo programma. Non sono sicuro però. – ptomato

+0

SO non mi ha inviato informazioni sul tuo aggiornamento, quindi lo vedo solo ora. Grazie per aver fatto lo sforzo extra, penso che con queste informazioni posso andare avanti. –

Problemi correlati