Categories: Tecnologia

Como executar comandos como outro usuário em scripts Linux

Naturalmente, quando você executa um comando ou script, o sistema o executa como um processo iniciado por você. Mas você pode executar comandos e scripts como outro usuário.

Processos têm proprietários

Quando um programa ou script é executado, o Linux cria um processo . Esse processo tem um dono. O proprietário é outro processo ou o nome de uma conta de usuário, caso uma pessoa o tenha iniciado.

A propriedade de um processo define algumas das capacidades e o ambiente do processo. Dependendo de como o processo foi iniciado, ele herda certos atributos de seu processo pai ou do usuário. Ou, mais estritamente, o processo que o usuário utilizou para iniciar o programa que geralmente é um shell.

Executar um comando ou script como outro usuário pode ser útil porque a propriedade de quaisquer arquivos criados pelo processo pertencerá ao usuário apropriado.

Cada vez que usamos, sudoexecutamos um comando como outro usuário. A conta de usuário padrão usada sudoé o usuário root ou ‘super’ . Por causa disso, sudomuitas vezes é erroneamente considerado como significando superusuário. Mas isso é apenas um jargão frouxo. Na verdade, significa usuário substituto.

Com sudo, você pode executar comandos como qualquer outro usuário, não apenas como root. Ironicamente, você precisa de privilégios de root para fazer isso. Mas iniciar um programa ou script de propriedade de outro usuário não é o mesmo que executar esse processo como esse outro usuário. Você ainda o executará como root.

Veja como executar um processo como outro usuário e como executar comandos de um script como se tivessem sido executados por outro usuário.

Execute um script como outro usuário

Estamos usando um computador que possui vários usuários configurados. Uma é Mary, que tem o nome de usuário maryq, e a outra é Dave, com o nome de usuário dave.

Mary tem um script chamado “other-user.sh” em seu diretório pessoal. Este é o texto do roteiro.

#!/bin/bash

echo "Nome do script:" $0

echo "Diretório de trabalho:" $(pwd)

echo "Script rodando como usuário:" $(whoami)

Ele imprime o nome do script, que é mantido na $0variável de ambiente. Em seguida, ele usa pwdpara imprimir o diretório de trabalho. Por fim, utiliza o whoamicomando para imprimir o nome do usuário que iniciou o script. Ou quem acha que lançou o roteiro.

Copie o texto do script em um editor e salve-o como “other-user.sh” no diretório inicial de uma conta de usuário diferente.

Precisaremos tornar o script executável. Usaremos o chmodcomando e a +xopção (executar) e a -uopção (usuário) para definir o sinalizador de execução apenas para o proprietário. Isso significa que apenas Mary pode executar o script. Verificaremos as permissões do arquivo com ls.

chmod u+x outro usuário.sh

eu

Da esquerda para a direita, as permissões são:

  • O proprietário pode ler, escrever e executar o arquivo.
  • Os membros do grupo podem ler e gravar o arquivo.
  • Outros só podem ler o arquivo.

Portanto, os únicos usuários capazes de executar o script são Mary e root. Isto é o que acontece quando Mary executa o script:

./outro-usuário.sh

Somos informados de que o diretório de trabalho atual do script é o diretório inicial de Mary e o proprietário do script é a conta de usuário maryq.

Como esperado, Dave não consegue executar o script.

/home/maryq/other-user.sh

Se Dave tiver privilégios de usuário root, ele poderá tentar executar o script como root, usando sudo.

sudo /home/maryq/other-user.sh

Este é um sucesso parcial. O script é executado, mas o proprietário do script é root, não maryq.

O truque que precisamos empregar é a sudo -uopção (usuário). Isso permite que você especifique o usuário com o qual deseja executar o comando. Se você não usar a -uopção, sudoo padrão será usar root. Se quisermos executar o comando como Mary, precisamos passar o nome da conta de usuário para o sudocomando.

sudo -u maryq /home/maryq/other-user.sh

Desta vez, o script informa que o proprietário do processo é maryq.

Vamos adicionar uma linha ao script “other-user.sh”. Escreveremos echoum texto e redirecionaremos a saída para um arquivo chamado “mary.txt”.

#!/bin/bash

echo "Nome do script:" $0

echo "Diretório de trabalho:" $(pwd)

echo "Script rodando como usuário:" $(whoami)

echo "Isso está entrando em um arquivo em /home/maryq/" > /home/maryq/mary.txt

Estamos criando o novo arquivo no diretório inicial de Mary. Isso é perfeitamente normal porque estamos executando o script como Mary.

./outro-usuário.sh

Se verificarmos o diretório inicial de Mary, veremos que o arquivo foi criado e que a propriedade do arquivo pertence à conta de usuário maryq.

ls -hl mary.txt

Este é o mesmo comportamento que veríamos se Mary tivesse lançado o script sozinha.

O comando runuser

Você poderia usar os sudo -ucomandos que usamos até agora dentro de um script, mas há outro comando, runuser, projetado para executar processos como um usuário diferente dentro de scripts. Ele lida melhor com o código de retorno do processo iniciado e tem menos sobrecargas que o sudo.

O runusercomando precisa ser executado pelo root, mas isso é feito executando o script inteiro como root. Você não precisa usar sudodentro do script. O runusercomando também pode ser usado na linha de comando, portanto não está restrito ao uso de scripts, embora seja o método preferido para scripts.

Dave não pode listar o arquivo “mary.txt” porque ele está no diretório inicial de Mary e ele não tem acesso.

gato /home/maryq/mary.txt

Podemos espiar dentro do arquivo usando runuser, no entanto. A -opção (login) lança um novo shell com um ambiente muito próximo do ambiente shell que Mary teria se ela realmente estivesse logada. A -copção (command) é seguida pelo comando que queremos executar.

sudo runuser - maryq -c 'cat mary.txt'

Observe que o comando não precisa do caminho completo para o arquivo. Podemos referenciar o arquivo da mesma forma que Mary faria, em relação ao seu diretório inicial.

Como usuário Dave, criaremos um script chamado “run-maryq.sh” com este texto:

#!/bin/bash

runuser -l maryq -c 'cat mary.txt'

Vamos torná-lo executável:

chmod +x run-maryq.sh

Vamos ver o que acontece quando tentamos executá-lo.

./run-maryq.sh

O runusercomando reclama porque está sendo executado por um usuário comum. Vamos executá-lo novamente com sudo.

sudo ./run-maryq.sh

Isso funciona como gostaríamos e como se a própria Mary tivesse lançado o roteiro.

Qual usar?

Na linha de comando, não há muito o que escolher entre eles. Mas como você precisa usar sudode runuserqualquer maneira, é melhor usar sudosozinho.

Mas em um script, runuseré o comando preferido.

maisroot

Recent Posts

O novo aplicativo “PC Manager” da Microsoft se parece muito com o CCleaner

Muitos aplicativos de limpeza estão disponíveis para Windows ao longo dos anos, mas hoje em…

1 ano ago

Como reiniciar um PS4

Seu PlayStation 4 está congelado? Seus jogos favoritos continuam travando? Reiniciar seu PS4 pode resolver…

1 ano ago

Veja por que as reticências são tão assustadoras ao enviar mensagens de texto…

A popularidade das mensagens de texto significou aprender uma forma totalmente nova de comunicação. Você…

1 ano ago

O telescópio James Webb acaba de capturar os “Pilares da Criação”

A foto dos "Pilares da Criação" tirada pelo Telescópio Espacial Hubble é uma das fotos…

1 ano ago

Você poderá baixar o Proton Drive mais cedo do que pensa

O Proton Drive saiu de seu estágio beta há algumas semanas, mas o aplicativo real…

1 ano ago

Como aumentar o zoom no Photoshop

Para ver suas fotos mais de perto ou para uma edição precisa , você pode…

1 ano ago