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.