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

1
#!/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 depois é executado novamente quando temos que sair manualmente.

    
por munish 30.09.2013 / 12:01

2 respostas

2

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

Como muitas soluções múltiplas para isso :)

Em vez de "su", use "sudo", que tem o comutador -S para aceitar uma senha da entrada padrão:

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

Como alternativa, mova essa seção de seu aplicativo / script que precisa ser executado como um usuário diferente para um aplicativo auxiliar. Você pode evitar o script com uma senha de texto não criptografada (que tem algumas preocupações de segurança) usando o 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 o helperapp como USER1. Em vez de usar set-uid / gid você pode usar o sudo configure para permitir que um usuário específico execute o het helperapp como USER1 sem um prompt de senha (isso requer privilégios admin / 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 se parecer com isso:

#!/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 ...

    
por 30.09.2013 / 14:15
2

Como você está executando su - , está dizendo su para executar um shell de login. Um shell de login ignorou seu argumento -c e lê 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"
    
por 02.10.2013 / 03:18