在 upstart 脚本中启动 ssh-agent 时防止重复

在 upstart 脚本中启动 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不允许调用,因为用户没有所需的权限。有没有一种简单的方法可以从脚本中导出环境变量,以便它们在停止后脚本中可用,或者将它们写入文件并在停止后获取该文件是最好的方法?

答案1

我最终将ssh-agent启动拆分为一个一次性任务,该任务在启动时启动并将路径导出到代理设置(现在存储在文件中),以便其他启动脚本可以依赖启动ssh-agent脚本并获取文件来检索环境变量。

相关内容