Como posso executar parte de um script como um usuário diferente?

Como posso executar parte de um script como um usuário diferente?
#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

su - USER1 -c "
date | tee -a ${Log} 2>&1; 
cd /blah/blah
if [ SOMECONDITION ]
then
sh ./somescript.ksh > logfile
fi
exit" | tee -a ${Log} 2>&1;

O script tende a parar quando muda para USER1 e então é executado novamente quando temos que sair manualmente.

Responder1

Eu esperaria que o script parasse no comando "su" porque está solicitando uma senha e não a obtendo.

Como sempre, várias soluções para isso :)

Em vez de "su" use "sudo", que possui a opção -S para aceitar uma senha da entrada padrão:

echo "password" | sudo -S -u USER1 sh -c "...

Como alternativa, mova a seção do seu aplicativo/script que precisa ser executada como um usuário diferente para um aplicativo auxiliar. Você pode então evitar scripts com uma senha de texto simples armazenada (que apresenta algumas questões de segurança) usando set-uid e set-gid nesse aplicativo auxiliar:

chown USER1.GRP1 helperapp
chmod 6755 helperapp

O risco que você corre com isso é que agora qualquer pessoa no sistema pode executar helperapp como USER1. Em vez de usar set-uid/gid você pode usar configure sudo para permitir que um usuário específico execute het helperapp como USER1 sem solicitação de senha (isso requer privilégios de administrador/root):

# /etc/sudoers
# Allow USER2 to run helperapp as USER1 without prompting for a password
USER2 ALL=(USER1) NOPASSWD:/path/to/helperapp

seu código pode então ser parecido com isto:

#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename

sudo -u USER1  /path/to/helperapp |  tee -a ${Log} 2>&1;

Nada disso foi testado e usado por sua própria conta e risco ...

Responder2

Como você está executando o su -, você está solicitando sua execução de um shell de login. Um shell de login ignorou seu -cargumento e, em vez disso, lê os comandos interativamente. A solução é não passar -.

Se você quiser ler o arquivo de inicialização do usuário alvo, faça isso explicitamente.

su - USER1 <<EOF
date
if [ -e ~/.profile ]; then . ~/.profile; fi
EOF 2>&1 | tee -a -- "$LOG"

informação relacionada