Ignore sudo no script bash

9

Eu tenho um pequeno script:

#!/bin/bash

touch dummy.txt

Se eu executar este script com sudo , ele criará dummy.txt , que será protegido por raiz .

O que eu quero fazer é:

Independentemente de este script ser executado usando sudo ou um usuário normal, o arquivo dummy.txt deve não ser protegido por root.

    
por Anonymous 18.11.2016 / 07:22

3 respostas

22

Você pode testar se o script está sendo executado por meio de sudo usando as variáveis EUID e SUDO_USER e, em seguida, executar touch como SUDO_USER se verdadeiro - algo como

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
    
por steeldriver 18.11.2016 / 08:07
10

Se o seu script não for executado como root , a maneira mais segura de resolver o problema é abortar a execução do script no início:

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

Opcionalmente, você pode reexecutar seu script como um usuário de fallback (por exemplo, sudo -u FALLBACK_USER "$0" ) em vez de simplesmente abortar.

Tentar corrigir as peculiaridades de comandos individuais tornará seu script desnecessariamente complexo e difícil de depurar. Toda vez que você modificá-lo, você terá que fazer todos os testes duas vezes (como um usuário comum, em seguida, como root ) e corrigir todos os erros relacionados com root que surgirem. Não é uma solução à prova de futuro, por assim dizer.

    
por Dmitry Grigoryev 18.11.2016 / 10:35
6

Por padrão, os arquivos criados com o root accound têm permissões assim:

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

Aqui, o arquivo pertence ao usuário root e ao grupo raiz, e é legível e gravável pelo root, mas somente legível por outros.

A abordagem mais simples seria apenas chown do arquivo para o usuário original.

chown username:group_name dummy.txt

Você pode usar a variável $SUDO_USER que só é acessível quando sudo é chamado, assim:

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

Se você estiver executando o script como usuário comum, a parte chown não será necessária, portanto, convém usar a instrução if ou && test para testar o caso em que o script é executado como raiz e faça algo ao longo destas linhas:

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

A abordagem acima é recomendada. Há outros, como usar chmod para alterar as permissões de leitura e gravação para usuários e grupo, mas isso não é recomendado.

    
por Sergiy Kolodyazhnyy 18.11.2016 / 07:30