Я пытаюсь автоматизировать обновление репозитория контроля версий в crontab. Следующий скрипт /home/usr/mrbean/bin/update.sh
работает в интерактивной командной строке Bash:
#!/bin/bash
ROOTPATH="/home/user/mrbean/temp/"
cd $ROOTPATH
SSHTMPFILE="${ROOTPATH}ssh-agent.cf"
ssh-agent -s | head -n 2 > "$SSHTMPFILE"
function killsshagent {
/bin/kill $SSH_AGENT_PID
}
trap killsshagent EXIT
if [ -f "$SSHTMPFILE" ]; then
source "$SSHTMPFILE"
ssh-add
rm "$SSHTMPFILE"
fi
killsshagent
if [ `hostname` == "mrbeancomp.local" ]; then
REPODIR="/home/usr/mrbean/repo/"
cd $REPODIR
cvs update -dP > "$HOME/log/log.txt"
fi
Затем я добавляю
@hourly /home/usr/mrbean/bin/update.sh
Скрипт работает сам по себе при вызове в интерактивной оболочке Bash, но не через crontab. Он выдает ошибки и отправляет на системную почту /var/mail/mrbean
:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
cvs [update aborted]: end of file from server (consult above messages if any)
[Обновлять]
killsshagent
добавлено в программу, поэтому ssh-agent
не зависает.
[Обновлять]
Попробовал адаптированную программу в репозитории Git и столкнулся с той же проблемой. Мистеру Бину не разрешено немедленно отказаться от этого репозитория CVS и переключиться на новый репозиторий Git.
[Обновлять]
У меня есть несколько файлов идентификации в $HOME/.ssh/
. Возможно ли, что при запуске из crontab мне нужно указать, какой файл идентификации использовать? Если да, то как?
решение1
Полагаю (я не эксперт по unix, но у меня была похожая проблема с неработающими заданиями cron), под каким пользователем вы выполняете задачу? Имеет ли этот пользователь все необходимые разрешения для доступа ко всему, что вам нужно?
Подозреваю, что нет (об этом говорит ошибка! :-D ).
Если выйти из рабочего пользователя и войти под другим пользователем, скрипт bash все равно работает? Если нет, то это как-то помогает.
Решение, которое мы использовали, состояло в том, чтобы запустить задачу от имени конкретного пользователя.
Кажется, есть несколько способов сделать это (не всегда). Я не могу комментировать преимущества одного из них перед другим — это вам решать. Как указать в crontab, от имени какого пользователя запускать скрипт?