LINUX.ORG.RU
ФорумAdmin

Скрипт автоматизации git pull origin не работает

 , ,


0

2

Приветствую, хочу написать скрипт самообновления с git. Проблема в том, что команды, после которых все успешно работает, выполняются только если их вручную ввести, в скрипте они не исполняются правильно. Вот их последовательность (expect нужен для последствующем развитии скрипта, интерактивность с выводо результата с помощью ssh-add -l и т.д.):

#!/usr/bin/expect
exec bash evileval.sh &
exec ssh-add &
exec git pull origin
Пробовал между ними добавлять sleep, не спасает. В «evileval.sh» хранится только команда «eval `ssh-agent -s`», потому что добавив эту строчку в основной скрипт, команда eval будет конфликтовать с существующей в expect командой eval.

ssh-add нужен для того, чтобы добавить ключ из .ssh/id_rsa, что успешно выполняется, если просто ввести эти команды вручную без скрипта.

При отсутствии запущенных копии ssh-agent я получаю следующий вывод:

Agent pid 16374
Could not open a connection to your authentication agent.
Enter passphrase for key '/home/user/.ssh/id_rsa':
user@localhost:~$
После это введя git pull origin все равно он требует пароль. При успешном выполнении команд планирую добавить скрипт в cron. Дистр Ubuntu 14.04, i686. Подскажите пожалуйста как заставить команды работать должным образом, спасибо.

★★★★

На первый взгляд: зачем амперсанты '&' вконце? Это ж запуск процесса на фоне; у тебя вторая команда может начаться пока еще первая не завершилась. Удали их и проверь.

Вообще, распараллеливание в скриптах - потенциальный источник вороха неочевидных проблем.

Kroz ★★★★★ ()

А еще интерпретатор /usr/bin/expect ; ты уверен что не /bin/bash?

Kroz ★★★★★ ()

Плюсую амперсанд. Ты в консоле тоже проверял с амперсандами?

staseg ★★★★★ ()

Проблема в том, что переменные, которые назначаются командой eval `ssh-agent -s`, остаются внутри скрипта evileval.sh.

deadNightTiger ★★★★ ()
Ответ на: комментарий от deadNightTiger

чтобы этого не было, скрипт с eval должен быть запущен не в форке, а текущем процессе. для баш-скриптов это делается командой source

bl ★★★ ()
Ответ на: комментарий от deadNightTiger

понял, тогда возникает вопрос как выполнить eval в expect-скрипте?

doctorx ★★★★ ()
Ответ на: комментарий от Kroz

Пробовал, также для теста переделав скрипт для bash таким образом, результат запуска тот же:

#!/bin/bash
bash evileval.sh
ssh-add
git pull origin

doctorx ★★★★ ()

Решил проблему совсем по-другому, сперва добавив следую строчки, взятые из документации symfony:

SSH_ENV=$HOME/.ssh/environment
  
# start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."
    # spawn ssh-agent
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add
}
  
if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
	 ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
	    start_agent;
	}
else
    start_agent;
fi
также при этом имея следующие конфигурации

.ssh/config

Host hostname.org
        IdentityFile ~/.ssh/id_rsa
        ForwardAgent yes

И имея следующие изменения в /etc/ssh/sshd_config (не помню точно, изменял ли я их):

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/id_rsa.pub

То есть получается скрипт начинает работу при логине пользователя, также избегая дубликатов процесса при параллельном логине.

doctorx ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.