Я написал сценарий Bash, который я использую для автоматического обновления определенных файлов, хранящихся в SourceForge и GitHub.В конце файла у меня есть две команды, которые Rsync обновляют файлы для SourceForge и Svn. Зафиксируйте их соответственно в GitHub (прежде чем кто-либо спросит, у меня есть причины использовать Svn, а не Git).
MyПроблема в том, что, хотя скрипт выполняет то, что ему нужно, когда я запускаю его вручную, строка кода, которая фиксирует изменения в GitHub, завершается с ошибкой аутентификации.
Я запрограммировал скрипт для вывода содержимого Stderr в файл журнала.Это содержимое этого файла после того, как я запустил скрипт вручную, и он работает:
auto_update_svn.bash:
17 Sep 2018 18:42 UTC
SSHPASS searching for password prompt using match "assword"
SSHPASS read: Authentication realm: <https://github.com:443> GitHub
SSHPASS read:
SSHPASS read: Password for 'XJDHDR':
SSHPASS detected prompt. Sending password.
SSHPASS read: *
<"SSHPASS read: *" repeated another 25 times
SSHPASS read:
SSHPASS read:
Это то, что говорит этот журнал после того, как я запустил скрипт через Crontab, и он не работает:
auto_update_svn.bash:
16 Sep 2018 14:00 UTC
svn: E215004: Authentication failed and interactive prompting is disabled; see the --force-interactive option
svn: E215004: Commit failed (details follow):
svn: E215004: No more credentials or we tried too many times.
Authentication failed
svn: E200042: Additional errors:
svn: E120191: Error running context: The requested authentication type(s) are not supported
Из того, что я вижу, sshpass не запускается, когда я запускаю его с Cron, и поэтому Svn не получает пароль.Странно, потому что несколькими строками раньше я использовал sshpass с Rsync для отправки файла в SouceForge, и это работает, когда скрипт запускается через Cron.Одно из решений, которое я часто видел, связано с ограничением переменной среды Path в Cron.Я исправил это в моем случае с помощью этой строки в верхней части моего скрипта, но в моем случае это не помогло: PATH=$PATH:$(grep 'PATH=' /etc/environment | sed 's/^.*=// ; s/\"//g')
Это то, что у меня есть в моем Crontab:
0 14 * * * /bin/bash /home/svn/xjdhdr-random-code/Bash/auto_update_svn.bash
И это содержание моего сценария:
#!/bin/bash
PATH=$PATH:$(sed -n '/PATH=/s/^.*=// ; s/\"//gp' '/etc/environment')
sDateTime=$(date -u +"%d %b %Y %H:%M")
{
# Commit changes
# SourceForge
sshpass -f "$HOME/sourceforge_password.txt" rsync -qcruz -e ssh --exclude=.svn '/home/svn/xjdhdr-random-code/' \
'xjdhdr@frs.sourceforge.net:/home/frs/project/xjdhdr-random-code/'
# GitHub
svn status '/home/svn/xjdhdr-random-code/' | grep ^\? | cut -c2- | while IFS='' read -r sFile
do
svn add "$sFile"
done
sshpass -v -f "$HOME/github_password.txt" svn commit --username=XJDHDR --no-auth-cache \
-m 'Automatic update of Adblock, Bash + blocklist files' '/home/svn/xjdhdr-random-code'
} 2> '/tmp/stderr-contents-auto_update_svn.txt'
if [ -f '/tmp/stderr-contents-auto_update_svn.txt' ]
then
errors+=$(cat '/tmp/stderr-contents-auto_update_svn.txt')
rm -f '/tmp/stderr-contents-auto_update_svn.txt'
fi
if [ -n "$errors" ]
then
printf 'auto_update_svn.bash:\n%s UTC\n'"$errors"'\n\n' "$sDateTime" >> '/home/error_reports_to_email.txt'
fi