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