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

如何通过本地Python代码运行AWS EC2(Ubuntu18)上的Python脚本?

嘿,我懂你想通过本地Python代码触发AWS EC2(Ubuntu 18)上的脚本运行——你提到了boto,但其实boto3主要是用来管理AWS资源(比如创建、启停实例)的,要直接执行实例上的脚本,我们得结合**SSH连接工具(比如paramiko)**和boto3来获取实例的必要信息。下面是完整的步骤和可运行的示例代码:

完整实现方案

1. 前置准备

先确保这些前提条件都满足:

  • 你的EC2实例处于运行状态,安全组已经开放SSH端口(22),且允许你的本地IP访问
  • 你拥有能登录该实例的SSH密钥对(.pem文件)
  • 本地Python环境安装好必要的库:
    pip install boto3 paramiko
    
  • 配置AWS凭证:可以通过~/.aws/credentials文件配置,或者设置环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY

2. 用boto3获取EC2实例的公网IP

首先我们需要通过boto3查询目标实例的公网IP,这是建立SSH连接的基础:

import boto3

def get_ec2_public_ip(instance_id, region):
    # 初始化EC2客户端
    ec2_client = boto3.client('ec2', region_name=region)
    # 查询实例信息
    response = ec2_client.describe_instances(InstanceIds=[instance_id])
    # 提取公网IP字段
    public_ip = response['Reservations'][0]['Instances'][0]['PublicIpAddress']
    return public_ip

# 替换成你的实例ID和AWS区域
TARGET_INSTANCE_ID = 'i-xxxxxxxxxxxxxxxxx'
AWS_REGION = 'us-east-1'  # 比如你的实例在新加坡区就是ap-southeast-1

instance_public_ip = get_ec2_public_ip(TARGET_INSTANCE_ID, AWS_REGION)
print(f"目标EC2实例的公网IP: {instance_public_ip}")

3. 建立SSH连接并执行远程脚本

拿到公网IP后,用paramiko建立SSH连接,然后执行服务器上的Python脚本:

import paramiko

def execute_remote_python_script(public_ip, key_file_path, remote_script_path, username='ubuntu'):
    # 创建SSH客户端对象
    ssh = paramiko.SSHClient()
    # 自动接受未知主机的密钥(生产环境建议手动验证,更安全)
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    try:
        # 连接EC2实例
        ssh.connect(
            hostname=public_ip,
            username=username,
            key_filename=key_file_path
        )
        print("✅ 成功连接到EC2实例")
        
        # 构造执行命令,Ubuntu18默认Python3是3.6,根据你的脚本调整版本
        exec_command = f'python3 {remote_script_path}'
        # 执行命令并获取输出
        stdin, stdout, stderr = ssh.exec_command(exec_command)
        
        # 打印脚本的正常输出
        print("\n📜 脚本执行输出:")
        print(stdout.read().decode('utf-8'))
        
        # 打印错误信息(如果有的话)
        error_output = stderr.read().decode('utf-8')
        if error_output:
            print("\n❌ 错误信息:")
            print(error_output)
    finally:
        # 不管执行成功与否,都关闭SSH连接
        ssh.close()
        print("\n🔌 SSH连接已关闭")

# 替换成你的密钥文件路径和远程脚本的绝对路径
SSH_KEY_PATH = '/Users/yourname/.ssh/your-key-pair.pem'
REMOTE_PYTHON_SCRIPT = '/home/ubuntu/your_script_to_run.py'

# 调用函数执行脚本
execute_remote_python_script(instance_public_ip, SSH_KEY_PATH, REMOTE_PYTHON_SCRIPT)

4. 关键注意事项

  • 密钥文件权限:在Linux/macOS系统下,务必设置密钥文件的权限为chmod 400 your-key-pair.pem,否则paramiko会拒绝使用该密钥
  • 安全组配置:如果连接失败,先检查安全组是否允许你的本地IP访问22端口
  • 生产环境优化:不要使用AutoAddPolicy(),应该手动验证主机密钥;另外也可以考虑用AWS Systems Manager Run Command来执行脚本,不需要开放SSH端口,安全性更高(不过如果你的场景必须用SSH,上面的方案完全可行)
  • Python版本兼容:确保远程脚本的语法和EC2实例上的Python版本兼容(Ubuntu18默认Python3是3.6)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:32:50