¿Cómo puedo ejecutar una parte de un script como un usuario diferente?

¿Cómo puedo ejecutar una parte de un script como un usuario 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;

El script tiende a detenerse cuando cambia a USUARIO1 y luego se ejecuta nuevamente cuando tenemos que salir manualmente.

Respuesta1

Esperaría que el script se detuviera en el comando "su" porque solicita una contraseña y no la obtiene.

Como suele ocurrir, hay múltiples soluciones para eso :)

En lugar de "su", utilice "sudo", que tiene el modificador -S para aceptar una contraseña desde la entrada estándar:

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

Alternativamente, mueva esa sección de su aplicación/script que necesita ejecutarse como un usuario diferente a una aplicación auxiliar. Luego puede evitar secuencias de comandos con una contraseña de texto sin cifrar almacenada (que tiene algunos problemas de seguridad) usando set-uid y set-gid en esa aplicación auxiliar:

chown USER1.GRP1 helperapp
chmod 6755 helperapp

El riesgo que corre con esto es que ahora cualquiera en el sistema puede ejecutar la aplicación auxiliar como USUARIO1. En lugar de usar set-uid/gid, puede usar configure sudo para permitir que un usuario específico ejecute la aplicación de ayuda como USUARIO1 sin solicitar una contraseña (esto requiere privilegios de administrador/root):

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

Entonces tu código puede verse así:

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

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

Nada de esto fue probado y utilizado bajo su propia responsabilidad...

Respuesta2

Como está ejecutando su -, le está indicando suque ejecute un shell de inicio de sesión. Un shell de inicio de sesión ignoró su -cargumento y en su lugar lee comandos de forma interactiva. La solución es no aprobar -.

Si desea leer el archivo de inicio del usuario objetivo, hágalo explícitamente.

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

información relacionada