2013-02-19 21 views
18

La documentazione per os.getuid() dice:Qual è la differenza tra os.getuid() e os.geteuid()?

Ritorno del processo corrente id utente.

E os.geteuid() dice:

rendimento effettivo ID utente del processo corrente.

Allora, qual è la differenza tra id utente e efficace user id?

Per me funziona allo stesso modo (su entrambi 2.xe 3.x). Lo sto usando per verificare se lo script viene eseguito come root.

+0

Non sono gli stessi nei programmi setuid (e potrebbero essere diversi per qualsiasi programma in esecuzione come root e chiamare seteuid in modo esplicito). Ciò significa che * sono * gli stessi all'avvio dello script. –

risposta

40

Per capire come differiscono os.getuid e os.geteuid, non si tratta di funzioni specifiche di Python (oltre al prefisso del modulo os). Queste funzioni includono le chiamate di sistema getuid e geteuid fornite essenzialmente da tutti i sistemi operativi di tipo Unix.

Quindi, piuttosto che esaminare i documenti Python (che probabilmente non forniscono molti dettagli), dovresti esaminare i documenti per il tuo sistema operativo. Here è la documentazione pertinente per Linux, ad esempio. Wikipedia ha anche un buon article on Unix User IDs.

La differenza tra l'UID normale e l'UID effettivo è che solo l'EUID viene controllato quando si esegue un'operazione che richiede un accesso speciale (come la lettura o la scrittura di un file o l'esecuzione di determinate chiamate di sistema). L'UID indica l'utente effettivo che sta eseguendo l'azione, ma è (di solito) non considerato quando esamina le autorizzazioni. Nei programmi normali saranno uguali. Alcuni programmi modificano il loro EUID per aggiungere o sottrarre dalle azioni che sono autorizzati a prendere. Un numero più piccolo cambia anche il loro UID, per "diventare" effettivamente un altro utente.

Ecco un esempio di un programma che modifica il suo EUID: il programma passwd (che viene utilizzato per modificare la password) deve scrivere nel file di password del sistema, che è di proprietà dell'utente root. Gli utenti normali non possono scrivere su quel file, poiché se potessero, potrebbero cambiare anche la password di tutti gli altri. Per risolvere questo problema, il programma passwd ha un bit impostato nelle sue autorizzazioni file (noto come setuid bit) che indica al sistema operativo che deve essere eseguito con l'EUID del proprietario del programma (ad esempio root) anche quando viene lanciato da un altro utente . Il programma passwd vedrebbe quindi il suo UID come utente di avvio e il suo EUID come root. La scrittura nel file di password di sistema richiede che l'EUID sia privilegiato. L'UID è anche utile, dal momento che passwd ha bisogno di sapere per quale utente sta cambiando la password.

Ci sono alcuni altri casi in cui l'UID e l'EUID non corrispondono, ma non sono troppo comuni. Ad esempio, un file server in esecuzione come super user potrebbe cambiare il suo EUID in modo che corrisponda a un utente specifico che richiede alcune manipolazioni di file. L'utilizzo dell'EUID dell'utente consente al server di evitare l'accesso a cose che l'utente non è autorizzato a toccare.

6

Funzione os.getuid() restituisce l'ID di un utente che esegue il programma. Funzione os.geteuid() di un utente il cui programma utilizza le autorizzazioni. Nella maggior parte dei casi questo sarà lo stesso. Il caso ben noto quando questi valori saranno diversi è quando setuid bit è impostato per il file eseguibile del programma e l'utente che esegue il programma è diverso dall'utente eseguibile dal programma stesso. In questo caso, os.getuid() restituirà l'ID dell'utente che esegue il programma, mentre os.geteuid() restituirà l'ID dell'utente che possiede il programma eseguibile.

+0

Puoi elaborare 'os.geteuid()' parte? E puoi dare degli esempi per mostrare che entrambi non sono gli stessi, cioè * x * può essere ottenuto solo con getuid e non con geteuid, e * y * può essere ottenuto solo con geteuid e non con getuid? –