Ignorar sudo no script bash

9

Eu tenho um pequeno script bash:

#!/bin/bash

touch dummy.txt

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

O que eu quero fazer é:

Independentemente de esse script ser executado usando sudoou um usuário normal, o arquivo nãodummy.txt deve estar protegido contra raiz.

Anônimo
fonte
4
O que você quer dizer com "protegido por raiz", você pode usar chowne chmodem seu script para definir a propriedade e as permissões conforme desejado.
fkraiem
11
Não está claro o que você quer dizer com "protegido por raiz". Você quer dizer que apenas o usuário root pode ler / gravar (por exemplo, permissões de arquivo são definidas como algo como 700) ou que o usuário root é o proprietário do arquivo?
11
@DoritoStyle desculpe pela confusão. Por raiz protegida , quis dizer que o usuário raiz é o proprietário do arquivo.
Anônimo

Respostas:

22

Você pode testar se o script está sendo executado através de sudousar os EUIDe SUDO_USERvariáveis, e em seguida, executar touchcomo SUDO_USERse fosse verdade - algo como

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
chave de aço
fonte
2
Observe que ==usado para comparação de cadeias. Como $EUIDé suposto retornar um valor inteiro, eu recomendo que você use -edcomparação. Espaços são permitidos em nomes de usuário , portanto, provavelmente cite a $SUDO_USERvariável. Caso contrário, boa resposta - isso é algo que eu pessoalmente usaria.
Sergiy Kolodyazhnyy 18/11
@steeldriver é isso que eu estava procurando. obrigado!!
Anônimo
11
Você pode executar novamente o script sudo -use detectar que está sendo executado como root. O OP falou sobre ter vários comandos em um script. Mas tenha cuidado para evitar um loop infinito de erros.
Peter Cordes
11
Não há nenhuma palavra divisão dentro [[...]]de modo não estritamente necessário citar a variável dentro da instrução if @Serg e I gues -edfoi um erro de digitação para-eq
Arronical
@ Arronical sim, isso foi um erro de digitação -eq. Não sabia [[que não tinha divisão de palavras. Obrigado. Pessoalmente, eu ainda
citaria por
9

Se seu script não deve ser executado como root, a maneira mais segura de resolver o problema é abortar a execução do script logo 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 substituto (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 usuário comum e depois como root) e corrigir todos os rootbugs relacionados que surgirem. Não é uma solução à prova de futuro, por assim dizer.

Dmitry Grigoryev
fonte
6

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

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

Aqui, o arquivo pertence ao usuário raiz e ao grupo raiz e é legível e gravável pela raiz, mas somente legível por outras pessoas.

A abordagem mais simples seria apenas chownretornar o arquivo ao usuário original.

chown username:group_name dummy.txt

Você pode usar a $SUDO_USERvariável acessível somente quando sudofor chamada, assim:

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

Se você estiver executando o script como usuário comum, a chownparte não será necessária; portanto, considere usar a instrução if ou &&teste para testar o caso em que o script é executado como raiz e faça algo nesse sentido:

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

A abordagem acima é recomendada. Existem outros, como o uso chmodpara alterar as permissões de leitura, gravação e execução para usuários e grupos, mas isso não é recomendado.

Sergiy Kolodyazhnyy
fonte
Obrigado pela sua resposta. Mas, em QI, acabei de explicar que o cenário simples, no caso real, o script original criará muitos arquivos. No Linux, não podemos simplesmente ignorar o sudo?
Anônimo
11
@ Anonymous, se você estiver executando o script inteiro com sudo, então não - você não pode ignorá-lo. Sua opção é executar o script como usuário comum (o que não entendo por que você não faz isso, pois você está simplesmente criando um arquivo para o usuário aqui) ou alterar a propriedade do arquivo, como mostro na minha resposta.
Sergiy Kolodyazhnyy 18/11/19
Esta é a solução mais correta e não deve ser tão difícil de expandir.
pintainhos