Script BASH rodando como root, maneira organizada de agrupar comandos executados como outro usuário?

Script BASH rodando como root, maneira organizada de agrupar comandos executados como outro usuário?

Estou ciente de que posso executar cada comando como um usuário diferente com:

su -s /bin/bash "command" - user

Mas há vários comandos para executar e eu estava procurando uma maneira mais fácil de fazer isso do que colocar su em todas as linhas.

Como posso dizer 'todos os comandos daqui são executados como userX' e depois 'parar de executar comandos como userX' (e continuar executando o restante do script como root)?

Obrigado.

Aqui está o bloco que gostaria de executar como um usuário diferente (atualizado da resposta dada por @Jetchisel):

#!/bin/bash
export BORG_PASSPHRASE="SUPERSECRETPASSWORD"

su - backup-user -s /bin/bash -c '
echo "$USER $(date +%F)" |& tee /pathto/_logs/test.log
borg info               \
    /pathto/repo          \
    |& tee -a /pathto/_logs/test.log
'
info_exit=$?{PIPESTATUS[0]}

if [ ${info_exit} = "0" ]; then
echo ">> test-SUCCESS <<"
elif [ ${info_exit} = "1" ]; then
echo ">> test WARNINGS <<"
else
echo ">> test FAILED <<"
fi

O acima funciona, mas para duas coisas:

  1. Não consigo passar a variável de ambiente que Borg normalmente pega automaticamente: $ BORG_PASSPHRASE. Isso talvez seja um problema de permissões entre usuários?
  2. Parece não passar info=exit corretamente. Para um teste, removi Borg totalmente retido echo, mas escrevi errado 'ech', o que falhou. Mas o script é considerado um sucesso de qualquer maneira.

Responder1

Você pode tentar a -cbandeira

 OPTIONS
       -c, --command=command
            Pass command to the shell with the -c option.

Algo como

su - "$user" -s /bin/bash -c 'command1;command1;command3;.....'

Ou use novas linhas em vez de ;separar os comandos.

su - "$user" -s /bin/bash -c '
  command1
  command2
  command3
  ...
'

Só preciso cuidar da citação se precisar citar os comandos com aspas simples.

Responder2

Você pode usar funções em seu script bash, junto comformatadopara conseguir isso facilmente;

#!/bin/bash

function1 () {
  echo "this is function1"
 }
function2 () {
  echo "this is function2"
}

su -c "$(typeset -f function1); function1" user1
su -c "$(typeset -f function2); function2" user2


exit 0

Coloque os comandos que deseja executar dentro da função e o respectivo usuário executará todos esses comandos.

OBSERVAÇÃO:você executará o script como root para evitar facilmente problemas de senha

sudo su -c ./script.sh

Responder3

Eh. Sou novo no stackexchange. Caso contrário, isso seria um comentário em vez de uma resposta. Não tenho representante para comentar. Então pessoal. Vai com calma comigo! Eu recomendo que você use ssh em vez de su. E eu recomendo que o usuário root e o usuário de backup compartilhem um grupo UNIX primário comum.

  1. Com o ssh, a senha do usuário de backup pode mudar e seu script ainda funcionará.
  2. Se você usar um grupo compartilhado - mais tarde - após sua análise de prova de conceito - você poderá migrar para uma solução onde uma conta diferente de root possa possuir e executar o script. Isso tem a vantagem de fazer com que você não precise compartilhar a senha root.
  3. Você pode passar variáveis ​​de ambiente no comando ssh... Como: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"

informação relacionada