Domanda

Ho bisogno di un modo per eseguire il modulo os.system () come diversi UID. Si avrebbe bisogno di comportarsi in modo simile al seguente codice BASH (si noti questi non sono i comandi esatti sto eseguendo):

su user1
ls ~
mv file1
su user2
ls ~
mv file1

La piattaforma di destinazione è GNU Linux generico.

Naturalmente ho potuto solo passare questi al modulo os.system, ma come inviare la password? Naturalmente potrei eseguire lo script come root, ma questo è sciatta e insicuro.

Preferibilmente vorrei fare con senza richiedere alcuna password per essere in testo normale.

È stato utile?

Soluzione

La funzione che stai cercando è chiamato os.seteuid. Ho paura che probabilmente non sfuggirà l'esecuzione dello script come root, in ogni caso, ma penso che si può utilizzare il framework capabilities(7) al 'recinto' l'esecuzione un po ', in modo che possa modificare gli utenti -, ma non lo fanno qualsiasi delle altre cose che il superuser può.

In alternativa, è potrebbe essere in grado di fare questo con PAM. Ma in generale, non c'è modo 'pulito' per fare questo, e David Cournapeau è assolutamente giusto che è tradizionale per script admin di eseguire con i privilegi.

Altri suggerimenti

Credo che non è banale: si può fare con un guscio, perché ogni comando è lanciato nel suo proprio processo, che ha il suo id. Ma con pitone, tutto avrà l'uid del processo di pitone interpretato (naturalmente, a patto che non avvia sottoprocessi che utilizzano il modulo sottoprocesso e co). Non conosco un modo di cambiare l'utente di un processo - non so se questo è persino possibile - anche se lo fosse, si avrebbe almeno bisogno di privilegi di amministratore

.

Che cosa stai cercando di fare esattamente? Questo non suona come la cosa giusta da fare per finalità di amministrazione, per esempio. In generale, script admin eseguiti in un utente privilegio - perché nessuno conosce la password dell'utente 2, tranne utente 2 (in teoria). Essere radice significa do utente sempre funziona per un utente 'normale', senza richiedere la password.

forse sudo può aiutare qui, altrimenti è necessario essere root per eseguire os.setuid

In alternativa, se si desidera avere divertimento si può utilizzare per fare le cose pexpect qualcosa di simile a questo, è possibile migliorare su questo

p = pexpect.spawn("su guest")
p.logfile = sys.stdout 
p.expect('Password:')
p.sendline("guest")

qualche parte lungo la linea, qualche processo o altra sta per bisogno di un effettivo UID 0 (root), perché solo un tale processo può impostare l'UID efficace per un arbitrario UID.

Al shell, il comando su è un programma SUID root; è opportunamente privilegiato (POSIX gergo) e può impostare il reale ed efficace UID. Allo stesso modo, il comando sudo può fare lo stesso lavoro. Con sudo, è anche possibile configurare quali comandi e UID sono ammessi. La differenza cruciale è che su richiede la password dell'utente di destinazione per farvi in; sudo richiede la password dell'utente che esegue esso.

Non v'è, naturalmente, la questione se un utente deve conoscere le password degli altri utenti. In generale, nessun utente dovrebbe conoscere la password di qualsiasi altro utente.

modifiche Scripting UID è difficile. Si può fare:

su altuser -c "commands to execute as altuser"
sudo -u altuser commands to execute as altuser

Tuttavia, su richiederà una password dal terminale di controllo (e fallirà se non c'è terminale di controllo). Se si utilizza sudo, sarà memorizzare nella cache le credenziali (o può essere configurato per farlo) in modo da ottenere solo chiesto una volta per una password -. Ma vi verrà chiesto per la prima volta, proprio come fa su

Lavorare intorno suggerimento è difficile. È possibile utilizzare strumenti parallelo al expect che gestiscono pseudo-ttys per voi. Tuttavia, si sono poi di fronte a memorizzare le password negli script (non una buona idea), o in qualche modo li stashing fuori dalla vista.


Lo strumento che uso per il lavoro è quello che ho scritto, chiamato asroot. Mi permette di controllare con precisione l'UID e GID gli attributi che il processo bambino dovrebbe avere. Ma è stato progettato per permettere solo a me di usarlo - che è, al momento della compilazione, viene specificato il nome utente autorizzato (ovviamente, che può essere modificato). Tuttavia, posso fare le cose come:

asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...

Questo imposta la reale ed efficace UID di 'qualcuno', imposta il gruppo primario a 'theirgrp', rimuove tutti i gruppi ausiliari, e aggiunge 'othergrp' (in modo che il processo appartiene a solo due gruppi) e imposta l'umask a 0222 ; Poi esegue 'somecmd' con gli argomenti dati.

Per un utente specifico che ha bisogno di limitata (o non così limitata) l'accesso ad altri account utente, questo funziona bene. Come una soluzione generale, non è così caldo; sudo è migliore sotto molti aspetti, ma richiede ancora una password (che asroot non fa).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top