Я ожидал бы, что сценарий останавливается при команде "su", потому что это запрашивает пароль и не получает тот.
Как часто несколько решений для этого :)
Вместо "sudo" использования "su", который имеет переключатель-S для принятия пароля от стандартного входа:
echo "password" | sudo -S -u USER1 sh -c "...
Кроме того, переместите тот раздел своего приложения/сценария, которое должно работать как другой пользователь к вспомогательному приложению. Можно затем постараться не писать сценарий с сохраненным паролем в виде открытого текста (который имеет некоторые проблемы безопасности) при помощи набора-uid и ценуроза набора на том вспомогательном приложении:
chown USER1.GRP1 helperapp
chmod 6755 helperapp
Риск, который Вы выполняете с этим, состоит в том, что теперь любой в системе может выполнить helperapp как USER1. Вместо того, чтобы использовать set-uid/gid можно использовать, настраивают sudo, чтобы позволить определенному пользователю выполнять het helperapp как USER1 без подсказки пароля (это требует полномочий администратора/корня):
# /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;
Ни одно из этого не было протестировано и использование в Вашей собственной опасности...
Так как Вы работаете su -
, Вы говорите su
выполнять оболочку входа в систему. Оболочка входа в систему, проигнорированная -c
аргумент и чтения управляют в интерактивном режиме вместо этого. Решение не состоит в том, чтобы передать -
.
Если Вы хотите считать файл запуска целевого пользователя, сделайте это явно.
su - USER1 <<EOF
date
if [ -e ~/.profile ]; then . ~/.profile; fi
…
EOF 2>&1 | tee -a -- "$LOG"
chown
, это, очень вероятно, будет работать как корень. – Gilles 'SO- stop being evil' 01.10.2013, 00:11