在bash脚本中添加ssh密钥(jenkins管道)

时间:2017-06-06 16:33:05

标签: bash jenkins ssh-agent

我有一个需要执行shell脚本的Jenkins作业。它通过ssh键连接到远程计算机。这是管道工作:

    stage ('Run') {
        try {
            sh "chmod +x \$(find . -name '*.sh')"
            wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'XTerm']) {
                sh "./run-ansible-playbook.sh -f ansible-playbook.yml"
            }
etc...

.sh文件执行ssh-agent和ssh-add命令。

sshAgentCount=$(pgrep ssh-agent | wc -l)

if [[ $sshAgentCount -eq 0 ]]; then
        echo "# run ssh-agent #"
        eval `ssh-agent -s`
       ssh-add /var/lib/jenkins/id_rsa_ansible
fi

问题在于,有时这种方法有效,有时则无效。我认为这是因为用户(这里是jenkins)的tty一直在变化,而ssh-agent进程被链接到tty。 我不想总是调用eval ssh-agent -s,因为它会导致机器内存不足。

这里是ps aux | grep ssh-agent状态:

jenkins   1243  0.0  0.0  11140   320 ?        Ss   17:20   0:00 ssh-agent -s
jenkins   1397  0.0  0.0  11140   320 ?        Ss   17:23   0:00 ssh-agent -s
jenkins   1435  0.0  0.0  11140   320 ?        Ss   17:23   0:00 ssh-agent -s

对于这个问题,你有一个优雅的解决方案吗? (仅在需要时使用一个ssh-agent)

非常感谢你:)

2 个答案:

答案 0 :(得分:1)

  

我认为这是因为用户(这里是jenkins)的tty一直在变化,而ssh-agent进程被链接到tty。

没有。 SSH代理未链接到tty。 SSH代理连接存储在环境变量$SSH_AUTH_SOCK中,因此一旦关闭原始shell(启动ssh-agent),您将失去与代理的连接。

但您可以通过将环境变量存储在文件中并将其加载到下一个shell(如果仍然可用)或类似的东西中来保留此连接。

答案 1 :(得分:0)

感谢您的回答。实际上它适用于文件。

但我发现更容易,只是在工作结束时终止了这个过程:

# add ssh key
echo "# run ssh-agent #"
eval `ssh-agent -s`
ssh-add /var/lib/jenkins/id_rsa_ansible

work...

kill $SSH_AGENT_PID