sshpass & svn commit in script: работает, когда скрипт запускается вручную, сбой при запуске с Cron - PullRequest
0 голосов
/ 17 сентября 2018

Я написал сценарий 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

1 Ответ

0 голосов
/ 18 сентября 2018

Мне удалось найти причину моей проблемы и решение.

Во-первых, причина. SSHPass требует, чтобы программа, выполняемая через нее, запрашивала пароль, который затем будет предоставлена ​​программе-подсказке. Svn commit, в свою очередь, запросит пароль, если он не был введен через ключ командной строки и работает в интерактивной среде . Вот почему я наблюдал за тем, что я наблюдал; при запуске сценария вручную svn работал в интерактивной среде. И наоборот, когда svn запускается через Cron, он обнаруживает, что среда не интерактивна. Следовательно, он не запрашивает пароль и SSHPass ничего не может сделать.

Решением в этом случае является добавление ключа --force-interactive к команде svn. Таким образом, соответствующая строка в моем скрипте теперь говорит:

sshpass -v -f "$HOME/github_password.txt" svn commit --username=XJDHDR --no-auth-cache --force-interactive \
        -m 'Automatic update of Adblock, Bash + blocklist files' '/home/svn/xjdhdr-random-code'

Другим возможным решением было бы добавить ключ --password к команде svn с соответствующим паролем и избегать использования SSHPass полностью. В моем случае это не сработает, потому что для этого потребуется добавить пароль в текстовом виде в скрипт. Это вызывает две проблемы для меня. Во-первых, сценарий доступен для каждой учетной записи пользователя на сервере, на котором запущен этот сценарий, тогда как файл паролей, используемый SSHPass, доступен для чтения только той учетной записи, которая используется для выполнения сценария. Во-вторых, этот скрипт является одним из файлов, загружаемых в мои репозитории SourceForge и GitHub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...