Eu sou novo no bash. Eu escrevi um script que consiste em muitas linhas e comandos. Este é um arquivo de configuração para obter e instalar vários pacotes. Como resultado, preciso usar muitos comandos de instalação em meu script, como este comando:
sudo apt install python2.7 python-pip
Na tentativa de evitar o uso de tantos sudo
em meu script, decidi remover sudo
antes de cada comando e executar o script como sudo ./setup.sh
.
Funciona bem, mas o problema é que existem alguns comandos que realmente não precisam sudo
antes deles, como mkdir
, wget
e ...
Quando executo meu script usando sudo ./setup.sh
, os diretórios criados usando este script não podem ser removidos, copiados ou editados sem usar sudo
, porém eu queria que eles fossem acessíveis para todos os usuários. Portanto, minha pergunta é a seguinte:
Ao executar um script com sudo (como sudo ./setup.sh
), existe alguma maneira de não executar alguns de seus comandos internos como mkdir
ou wget
com privilégios de superusuário?
Responder1
Ao usar sudo
, você inicia um novo shell como qualquer usuário para o qual você disse sudo
para mudar (root, por padrão). Isso definirá a SUDO_USER
variável para o nome de usuário desse usuário:
$ cat foo.sh
#!/bin/bash
echo "SUDO_USER: $SUDO_USER"
Se eu executar este script como eu, não recebo nada, pois a variável não está definida:
$ foo.sh
SUDO_USER:
Mas se eu executar com sudo
, a variável será definida:
$ sudo foo.sh
SUDO_USER: terdon
Com isso em mente, você pode simplesmente executar os comandos específicos que deseja executar como um usuário normal, usando o nome de usuário do usuário que inicia o script. Portanto, altere seu wget
e chmod
quaisquer outros comandos que você deseja executar como um usuário normal no script e faça-os rodar sudo -u $SUDO_USER
para que sejam executados como um usuário normal em vez de root:
apt install python2.7 python-pip ## will run as root
sudo -u $SUDO_USER mkdir foo ## will run as $SUDO_USER
O uso da SUDO_USER
variável garante que todos os diretórios e arquivos criados pertencerão ao usuário que iniciou o script e você não precisará informar explicitamente ao script o nome desse usuário sempre que executá-lo.
Responder2
Para fazer com que os diretórios criados por mkdir sejam usados por todos os usuários, você precisa alterar a permissão para WORLD legível/gravável usando o comando chmod.
No script, após executar mkdir
, use o comando abaixo:
chmod -R 755 «directory-name»
(Legível para todos, gravável apenas pelo root)
ou
chmod -R 777 «directory-name»
(Legível e também gravável por todos os usuários do sistema)
Para wget
, use o chmod
comando após o download.
OU
Ainda assim, se você quiser executar o comando como outro usuário, use o comando su:
su - «username» -c 'command to be executed'