GNU/Linux >> Linux Esercitazione >  >> Linux

Perché "sudo Su" in uno script di shell non esegue il resto dello script come root?

Uno script di esempio può essere il seguente:

#!/bin/bash
sudo su
ls /root

Quando si utilizza ./test.sh come utente normale, esegui invece ls come super utente ed esce, passa a root; e quando esco, esegue ls /root come utente normale.

Qualcuno sa dirmi il meccanismo al riguardo?

Risposta accettata:

I comandi in uno script vengono eseguiti uno per uno, indipendentemente. Lo script stesso come genitore di tutti i comandi nello script, è un altro processo indipendente e il comando su non lo fa e non può cambiarlo in root:il comando su crea un nuovo processo con privilegi di root.

Al termine del comando su, il processo padre, ancora in esecuzione come lo stesso utente, eseguirà il resto dello script.

Quello che vuoi fare è scrivere uno script wrapper. I comandi privilegiati vanno nello script principale, ad esempio ~/main.sh

#!/bin/sh
ls /root

Lo script wrapper chiama lo script principale con i permessi di root, come questo

#!/bin/sh
su -c ~/main.sh root

Per avviare questo processo, esegui il wrapper, che a sua volta avvia lo script principale dopo aver cambiato utente all'utente root.

Questa tecnica di wrapper può essere utilizzata per trasformare lo script in un wrapper su se stesso. Fondamentalmente controlla se è in esecuzione come root, in caso contrario, usa "su" per riavviare se stesso.

$0 è un modo pratico per fare in modo che uno script si riferisca a se stesso e il comando whoami può dirci chi siamo (siamo root?)

Quindi lo script principale con il wrapper integrato diventa

#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root

Notare l'uso di exec. Significa "sostituisci questo programma con", che di fatto termina la sua esecuzione e avvia il nuovo programma, lanciato da su, con root, per essere eseguito dall'alto. L'istanza sostitutiva è "root", quindi non esegue il lato destro di ||


Linux
  1. Come eseguire retroattivamente uno script come root?

  2. Perché è necessario inserire #!/bin/bash all'inizio di un file di script?

  3. Come eseguire uno script di shell all'avvio

  4. Esegui uno script di shell dal comando docker-compose, all'interno del contenitore

  5. Kali Linux VM:Autorizzazione negata per eseguire script shell, come root

Come eseguire il comando / script della shell di Linux in background

Come eseguire lo script della shell come servizio SystemD in Linux

Come eseguire un comando come amministratore di sistema (root)?

Perché lo script Bash non riconosce gli alias?

Perché il ~/.bash_profile non funziona?

Come creare ed eseguire uno script di shell in Ubuntu 22.04