Назад | Перейти на главную страницу

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

В рамках сценария Upstart мне нужно запустить ssh-agent для загрузки ключа развертывания GitHub, поэтому в сценарии у меня есть:

eval "$(ssh-agent -s)"
ssh-add $HOME/.ssh/id_rsa

Проблема в том, что при перезапуске службы ssh-agent перезапускается, в результате чего у меня остается несколько запущенных копий. Я почти уверен, что это потому, что переменные среды теряются при повторном запуске скрипта. Я пробовал следующее:

script
    ...
    # Ensure SSH agent is running
    if [ -z "$SSH_AUTH_SOCK" ]; then
            eval "$(ssh-agent -s)" >/dev/null
            ssh-add $HOME/.ssh/id_rsa
            initctl set-env --global SSH_AUTH_SOCK=$SSH_AUTH_SOCK
            initctl set-env --global SSH_AGENT_PID=$SSH_AGENT_PID
            initctl set-env --global SSH_AGENT_LAUNCHER=upstart
    fi

exec ...
...
end script

post-stop script

    # Shut down SSH agent
    if [ "$SSH_AGENT_LAUNCHER" = upstart ]; then
            kill $SSH_AGENT_PID 2>/dev/null || true
            initctl unset-env --global SSH_AUTH_SOCK
            initctl unset-env --global SSH_AGENT_PID
            initctl unset-env --global SSH_AGENT_LAUNCHER
    fi

end script

Проблема в том, что у меня setuid в сценарии, поэтому initctl вызов не разрешен, так как у пользователя нет необходимых прав. Есть ли простой способ экспортировать переменные среды из сценария, чтобы они были доступны в сценарии после остановки, или записать их в файл и получить этот файл после остановки - лучший способ сделать это?

Я закончил тем, что разделил ssh-agent запускается в одноразовую задачу, которая запускается при запуске и экспортирует путь к настройкам агента (теперь сохраненным в файле), так что другие сценарии запуска могут просто зависеть от ssh-agent сценарий запуска и источник файла для получения переменных среды.