Как запустить часть скрипта от имени другого пользователя?

Как запустить часть скрипта от имени другого пользователя?
#!/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;

Скрипт имеет тенденцию останавливаться при переключении на пользователя USER1, а затем он снова выполняется, когда нам приходится вручную выходить.

решение1

Я ожидаю, что скрипт остановится на команде «su», поскольку он запрашивает пароль, а не получает его.

Как часто бывает, для этого есть несколько решений :)

Вместо «su» используйте «sudo», у которого есть переключатель -S для приема пароля из стандартного ввода:

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

Альтернативно, переместите ту часть вашего приложения/скрипта, которая должна запускаться от имени другого пользователя, во вспомогательное приложение. Затем вы можете избежать написания скриптов с сохраненным открытым текстовым паролем (что имеет некоторые проблемы безопасности), используя set-uid и set-gid в этом вспомогательном приложении:

chown USER1.GRP1 helperapp
chmod 6755 helperapp

Риск, которому вы подвергаетесь, заключается в том, что теперь любой в системе может запустить helperapp как USER1. Вместо использования set-uid/gid вы можете использовать configure sudo, чтобы разрешить определенному пользователю запускать het helperapp как USER1 без запроса пароля (для этого требуются привилегии администратора/root):

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

Тогда ваш код может выглядеть примерно так:

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

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

Ничего из этого не тестировалось, используйте на свой страх и риск...

решение2

Поскольку вы запускаете su -, вы сообщаете suо необходимости запустить оболочку входа. Оболочка входа игнорирует свой -cаргумент и вместо этого считывает команды интерактивно. Решение — не передавать -.

Если вы хотите прочитать файл запуска целевого пользователя, сделайте это явно.

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

Связанный контент