Ignora sudo nello script bash


9

Ho un piccolo script bash:

#!/bin/bash

touch dummy.txt

Se eseguo questo script con sudo, creerà dummy.txtquale sarà protetto da root .

Quello che voglio fare è:

Indipendentemente dal fatto che questo script venga eseguito utilizzando sudoo un utente normale, il file nondummy.txt deve essere protetto come root.


4
Qualunque cosa tu intenda per "protetto da root", puoi usare chowne chmodnel tuo script per impostare la proprietà e le autorizzazioni come desiderato.
fkraiem,

1
Non è chiaro cosa intendi per "root protetto". Vuoi dire che solo l'utente root può leggere / scrivere (ad es. Le autorizzazioni per i file sono impostate su qualcosa come 700) o che l'utente root è il proprietario del file?

1
@DoritoStyle scusa per la confusione. Per root protetto , intendevo che l'utente root è il proprietario del file.
Anonimo il

Risposte:


22

Si potrebbe verificare se lo script viene eseguito tramite sudoutilizzando le EUIDe SUDO_USERvariabili, e quindi eseguire touchcome SUDO_USERse fosse vero - qualcosa di simile

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
Si noti che ==utilizzato per il confronto delle stringhe. Dato che $EUIDdovrebbe restituire un valore intero, ti consiglio di usare il -edconfronto. Gli spazi sono ammessi nei nomi utente , quindi probabilmente cita la $SUDO_USERvariabile. Altrimenti, buona risposta - questa è una cosa che personalmente userei.
Sergiy Kolodyazhnyy,

@steeldriver questo è quello che stavo cercando. Grazie!!
Anonimo il

1
È possibile far eseguire nuovamente lo script sudo -use rileva che è in esecuzione come root. L'OP ha parlato di avere più comandi in uno script. Ma fai attenzione a evitare un ciclo infinito di errori.
Peter Cordes,

1
Non vi è alcuna parola di divisione all'interno, [[...]]quindi non strettamente necessario per citare la variabile all'interno dell'istruzione if @Serg e immagino -edfosse un errore di battitura per-eq
Arronical

@Arronical sì, è stato un refuso per -eq. Non sapevo [[non ha la divisione delle parole. Grazie. Personalmente,
citerei

9

Se lo script non deve essere eseguito come root, il modo più sicuro per risolvere il problema è interrompere l'esecuzione dello script all'inizio:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

Facoltativamente, è possibile rieseguire lo script come utente di fallback (ad esempio sudo -u FALLBACK_USER "$0") invece di interrompere semplicemente.

Cercare di correggere le stranezze dei singoli comandi renderà lo script inutilmente complesso e difficile da eseguire il debug. Ogni volta che lo modifichi, dovrai eseguire tutti i test due volte (come utente normale, quindi come root) e correggere tutti i rootbug correlati che si presentano. Non è una soluzione a prova di futuro, per così dire.


6

Per impostazione predefinita, i file creati con il root root hanno le autorizzazioni in questo modo:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Qui il file appartiene all'utente root e al gruppo root ed è leggibile e scrivibile da root, ma leggibile solo da altri.

L'approccio più semplice sarebbe quello di chownriportare il file all'utente originale.

chown username:group_name dummy.txt

È possibile utilizzare una $SUDO_USERvariabile accessibile solo quando sudoviene chiamata, in questo modo:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Se stai eseguendo lo script come utente normale, la chownparte non è affatto necessaria, quindi potresti prendere in considerazione l'utilizzo di if-statement o &&test per verificare il caso in cui lo script viene eseguito come root e fare qualcosa in questo modo:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Quanto sopra è un approccio raccomandato. Ce ne sono altri, come usare chmodper cambiare le autorizzazioni di lettura-scrittura-esecuzione per utenti e gruppi, ma non è raccomandato.


grazie per la tua risposta. Ma in QI ho appena spiegato un semplice scenario, nel caso reale lo script originale creerà molti file. In Linux non possiamo semplicemente ignorare sudo?
Anonimo il

1
@Anonimo se stai eseguendo l'intero script con sudo, quindi no - non puoi ignorarlo. La tua opzione è eseguire lo script come utente normale (cosa che non capisco perché non lo fai, dal momento che stai semplicemente creando un file per il tuo utente qui) o modificare la proprietà del file come mostrato nella mia risposta.
Sergiy Kolodyazhnyy,

Questa è la soluzione più corretta e non dovrebbe essere così difficile da ridimensionare.
pulcini,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.