繁体   English   中英

在bash脚本中添加ssh密钥(詹金斯管道)

[英]Add ssh key in bash script (jenkins pipeline)

我有一个詹金斯工作,需要执行一个shell脚本。 它通过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

问题是,有时候这行得通,有时却行不通。 我认为这是因为用户的tty(在这里为jenkins)一直在变化,并且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代理)

非常感谢 :)

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

否。SSH代理未链接到tty SSH代理连接存储在环境变量$SSH_AUTH_SOCK因此一旦关闭启动ssh-agent的原始外壳,您将失去与该代理的连接。

但是您可以通过将环境变量存储在文件中并将其加载到下一个外壳程序(如果仍然可用)或类似内容中来保留此连接。

Jenkins有一个ssh代理插件,可以解决此问题,而不必直接使用ssh命令:

https://jenkins.io/doc/pipeline/steps/ssh-agent/#-sshagent-%20ssh%20agent

node {
    sshagent (credentials: ['deploy-dev']) {
        sh 'ssh -o StrictHostKeyChecking=no -l cloudbees 192.168.1.106 uname -a'
    }
}

谢谢您的回答。 实际上,它可以与文件一起使用。

但是我发现更简单的方法是,在工作结束时终止该过程:

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

work...

kill $SSH_AGENT_PID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM