You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins连接外部EC2实例异常:误连自身节点创建目录问题

问题分析与解决:Jenkins Pipeline连接外部EC2失败,操作执行在本地节点

我尝试通过Jenkins连接外部EC2实例172.20.160.4并创建testfolder目录,但实际连接到了Jenkins自身所在的实例,结果显示"Connected to ip-165-14-265-120.us-east-2.compute.internal",且testfolder目录创建在了自身节点上。

原Pipeline脚本如下:

agent {
        label 'smg-mitger'
    }
    
 stage('Connect to EC2 and Perform Operations') {
            steps {
                script {

                        sh '''
                        #!/bin/bash

                        echo \"Attempting to connect to EC2 instance\"
                        
                        ssh 172.20.160.4
                            echo \"Connected to $(hostname)\"
                            cd /home/ops
                            echo \"Current directory:\"
                            pwd
                            echo \"Listing contents:\"
                            ls -la
                            echo \"Creating folder testfolder\"
                            mkdir -p testfolder
                            echo \"Folder created.\"
                            ls -la

                        '''

                }
            }
        }

问题原因

原脚本中ssh 172.20.160.4执行后,后续命令并没有在远程EC2实例上运行。因为ssh命令如果不指定远程执行的命令,会进入交互式会话,但Jenkins的执行环境是非交互式的,ssh会直接退出,后续所有命令自然在本地Jenkins节点继续执行。

修复方案

方式一:通过Here Document传递远程命令

把需要在远程执行的命令通过ssh一次性传递,确保所有命令都在目标EC2实例上运行:

agent {
    label 'smg-mitger'
}

stage('Connect to EC2 and Perform Operations') {
    steps {
        script {
            sh '''
            #!/bin/bash
            echo "Attempting to connect to EC2 instance"
            
            ssh 172.20.160.4 << 'EOF'
                echo "Connected to $(hostname)"
                cd /home/ops
                echo "Current directory:"
                pwd
                echo "Listing contents:"
                ls -la
                echo "Creating folder testfolder"
                mkdir -p testfolder
                echo "Folder created."
                ls -la
            EOF
            '''
        }
    }
}
  • 这里使用Here Document(<< 'EOF')语法,将EOF之间的所有内容作为ssh的输入,在远程实例中执行。'EOF'加单引号可以避免本地变量替换,确保命令完全在远程环境运行。

方式二:使用Jenkins SSH插件(更推荐)

如果频繁操作远程服务器,建议安装Jenkins SSH插件,通过插件提供的步骤执行远程操作,更简洁易维护:

  1. 先在Jenkins全局配置中添加目标EC2实例的SSH凭证(包含IP、用户名、密钥等信息)
  2. 修改Pipeline脚本:
agent {
    label 'smg-mitger'
}

stage('Connect to EC2 and Perform Operations') {
    steps {
        script {
            sshCommand(
                remote: [
                    name: 'EC2-172.20.160.4',
                    host: '172.20.160.4',
                    user: '你的远程用户名',
                    credentialsId: '你的SSH凭证ID'
                ],
                command: '''
                    echo "Connected to $(hostname)"
                    cd /home/ops
                    echo "Current directory:"
                    pwd
                    echo "Listing contents:"
                    ls -la
                    echo "Creating folder testfolder"
                    mkdir -p testfolder
                    echo "Folder created."
                    ls -la
                '''
            )
        }
    }
}

额外注意事项

  • 确保Jenkins节点(smg-mitger标签对应的节点)能通过SSH无密码登录目标EC2实例,比如提前配置好公钥认证,避免因需要输入密码导致执行失败。
  • 检查目标EC2实例的安全组规则,允许Jenkins节点的IP访问22端口。

内容的提问来源于stack exchange,提问作者asif kaif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:05:03