Come eseguire comandi come un altro utente negli script Linux
Pubblicato: 2022-07-13Abbastanza naturalmente, quando esegui un comando o uno script, il sistema lo esegue come un processo che è stato avviato da te. Ma puoi eseguire comandi e script come un altro utente.
I processi hanno proprietari
Quando un programma o uno script viene eseguito, Linux crea un processo. Quel processo ha un proprietario. Il proprietario è un altro processo o il nome di un account utente se una persona lo ha avviato.
La proprietà di un processo definisce alcune delle capacità e l'ambiente del processo. A seconda di come è stato avviato il processo, eredita alcuni attributi del processo padre o dell'utente. O, più rigorosamente, il processo utilizzato dall'utente per avviare il programma che di solito è una shell.
L'esecuzione di un comando o di uno script come un altro utente può essere utile perché la proprietà di tutti i file creati dal processo apparterrà all'utente appropriato.
Ogni volta che utilizziamo sudo
, eseguiamo un comando come un altro utente. L'account utente predefinito utilizzato da sudo
è l'utente root o "super". Per questo motivo, spesso si pensa erroneamente che sudo
stia per super user do . Ma questo è solo un gergo lasco. In realtà sta per sostituto user do .
Con sudo
, puoi eseguire comandi come qualsiasi altro utente, non solo come root. Ironia della sorte, per farlo sono necessari i privilegi di root. Ma avviare un programma o uno script di proprietà di un altro utente non è lo stesso che eseguire quel processo come quell'altro utente. Lo eseguirai ancora come root.
Ecco come eseguire effettivamente un processo come un altro utente e come eseguire comandi dall'interno di uno script come se fossero stati eseguiti da un altro utente.
Esegui uno script come un altro utente
Stiamo utilizzando un computer con più utenti configurati. Uno è Mary, che ha il nome utente maryq, e l'altro è Dave con il nome utente dave.
Mary ha uno script chiamato "other-user.sh" nella sua home directory. Questo è il testo della sceneggiatura.
#!/bin/bash echo "Nome script:" $0 echo "Cartella di lavoro:" $(pwd) echo "Script in esecuzione come utente:" $(whoami)
Stampa il nome dello script, che è contenuto nella variabile di ambiente $0
. Quindi usa pwd
per stampare la directory di lavoro. Infine, usa il comando whoami
per stampare il nome dell'utente che ha lanciato lo script. O chi pensa abbia lanciato la sceneggiatura.
Copia il testo dallo script in un editor e salvalo come "other-user.sh" nella home directory di un altro account utente.
Avremo bisogno di rendere lo script eseguibile. Useremo il comando chmod
e useremo l'opzione +x
(execute) e l'opzione -u
(user) per impostare il flag di esecuzione solo per il proprietario. Ciò significa che solo Mary può eseguire lo script. Verificheremo i permessi dei file con ls
.
chmod u+x altro-utente.sh
ls
Da sinistra a destra, i permessi leggono:
- Il proprietario può leggere, scrivere ed eseguire il file.
- I membri del gruppo possono leggere e scrivere il file.
- Altri possono solo leggere il file.
Quindi gli unici utenti in grado di eseguire lo script sono Mary e root. Questo è ciò che accade quando Mary esegue lo script:
./altro-utente.sh
Ci viene detto che la directory di lavoro corrente dello script è la directory home di Mary e il proprietario dello script è l'account utente maryq.
Come previsto, Dave non può eseguire lo script.
/home/maryq/altro-utente.sh
Se Dave ha i privilegi di utente root, può provare a eseguire lo script come root, usando sudo
.
sudo /home/maryq/other-user.sh
Questo è un successo parziale. Lo script viene eseguito, ma il proprietario dello script è root, non maryq.
Il trucco che dobbiamo utilizzare è l'opzione sudo -u
(utente). Ciò ti consente di specificare l'utente con cui desideri eseguire il comando. Se non usi l'opzione -u
, sudo
utilizza per impostazione predefinita root. Se vogliamo eseguire il comando come Mary, dobbiamo passare il nome del loro account utente al comando sudo
.
sudo -u maryq /home/maryq/other-user.sh
Questa volta lo script segnala che il proprietario del processo è maryq.
Aggiungiamo una riga allo script "other-user.sh". Faremo echo
a del testo e reindirizzeremo l'output in un file chiamato "mary.txt".
#!/bin/bash echo "Nome script:" $0 echo "Cartella di lavoro:" $(pwd) echo "Script in esecuzione come utente:" $(whoami) echo "Questo sta andando in un file in /home/maryq/" > /home/maryq/mary.txt
Stiamo creando il nuovo file nella directory home di Mary. Questo va benissimo perché stiamo eseguendo lo script come Mary.
./altro-utente.sh
Se controlliamo la home directory di Mary, vedremo che il file è stato creato e la proprietà del file appartiene all'account utente di maryq.
ls -hl mary.txt
Questo è lo stesso comportamento che vedremmo se Mary avesse effettivamente lanciato la sceneggiatura da sola.
CORRELATI: Come utilizzare il comando chmod su Linux
Il comando runuser
Potresti usare i comandi sudo -u
che abbiamo usato finora all'interno di uno script, ma c'è un altro comando, runuser
, progettato per eseguire processi come un utente diverso dall'interno degli script. Ha una migliore gestione del codice di ritorno dal processo avviato e ha meno spese generali rispetto a sudo
.
Il comando runuser
deve essere eseguito da root, ma ciò si ottiene eseguendo l'intero script come root. Non è necessario utilizzare sudo
all'interno dello script. Il comando runuser
può essere utilizzato anche sulla riga di comando, quindi non è limitato all'uso degli script, sebbene sia il metodo preferito per gli script.
Dave non può elencare il file "mary.txt" perché è nella directory home di Mary e non ha accesso.
gatto /home/maryq/mary.txt
Tuttavia, possiamo sbirciare all'interno del file usando runuser
. L'opzione -
(login) lancia una nuova shell con un ambiente molto simile all'ambiente della shell che Mary avrebbe se avessero effettivamente effettuato l'accesso. L'opzione -c
(comando) è seguita dal comando che vogliamo eseguire.
sudo runuser - maryq -c 'cat mary.txt'
Nota che il comando non ha bisogno del percorso completo del file. Possiamo fare riferimento al file nello stesso modo in cui lo farebbe Mary, rispetto alla sua home directory.
Come utente Dave, creeremo uno script chiamato "run-maryq.sh" con questo testo al suo interno:
#!/bin/bash runuser -l maryq -c 'cat mary.txt'
Lo renderemo eseguibile:
chmod +x run-maryq.sh
Vediamo cosa succede quando proviamo a eseguirlo.
./run-maryq.sh
Il comando runuser
si lamenta perché viene eseguito da un utente normale. Eseguiamolo di nuovo con sudo
.
sudo ./run-maryq.sh
Funziona come vorremmo, e proprio come se Mary avesse lanciato la sceneggiatura da sola.
Quale usare?
Sulla riga di comando, non c'è molto da scegliere tra di loro. Ma dato che devi comunque usare sudo
con runuser
, potresti anche usare sudo
da solo.
Ma in uno script, runuser
è il comando preferito.
CORRELATI: 10 comandi Linux di base per principianti