如何使用boto3在EC2中SSH和运行命令?

时间:2017-03-07 10:01:02

标签: python amazon-ec2 boto3

我希望能够ssh到EC2实例,并在其中运行一些shell命令,如this

我如何在boto3中执行此操作?

7 个答案:

答案 0 :(得分:24)

这个帖子有点老了,但是因为我花了一个令人沮丧的下午发现一个简单的解决方案,我不妨分享它。

注意:对于OP的问题,这不是严格的答案,因为它没有使用ssh。但是,boto3的一点是你不必 - 所以我认为在大多数情况下这将是实现OP目标的首选方式,因为他/她可以使用他/她现有的boto3配置简单。

AWS'运行命令内置于botocore中(因此,据我所知,这应该适用于boto和boto3)但免责声明:我只用boto3 测试了这个。

def execute_commands_on_linux_instances(client, commands, instance_ids):
    """Runs commands on remote linux instances
    :param client: a boto/boto3 ssm client
    :param commands: a list of strings, each one a command to execute on the instances
    :param instance_ids: a list of instance_id strings, of the instances on which to execute the command
    :return: the response from the send_command function (check the boto3 docs for ssm client.send_command() )
    """

    resp = client.send_command(
        DocumentName="AWS-RunShellScript", # One of AWS' preconfigured documents
        Parameters={'commands': commands},
        InstanceIds=instance_ids,
    )
    return resp

# Example use:
ssm_client = boto3.client('ssm') # Need your credentials here
commands = ['echo "hello world"']
instance_ids = ['an_instance_id_string']
execute_commands_on_linux_instances(ssm_client, commands, instance_ids)

对于Windows实例powershell命令,您可以使用其他选项:

        DocumentName="AWS-RunPowerShellScript",

答案 1 :(得分:7)

您可以使用以下代码段ssh到EC2实例并从boto3运行一些命令。

import boto3
import botocore
import paramiko

key = paramiko.RSAKey.from_private_key_file(path/to/mykey.pem)
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Connect/ssh to an instance
try:
    # Here 'ubuntu' is user name and 'instance_ip' is public IP of EC2
    client.connect(hostname=instance_ip, username="ubuntu", pkey=key)

    # Execute a command(cmd) after connecting/ssh to an instance
    stdin, stdout, stderr = client.exec_command(cmd)
    print stdout.read()

    # close the client connection once the job is done
    client.close()
    break

except Exception, e:
    print e

答案 2 :(得分:3)

您也可以使用 kitten python 库,它只是 boto3 的包装器。您还可以使用此实用程序在多个服务器上同时运行相同的命令。

例如。

kitten run uptime ubuntu 18.105.107.20

答案 3 :(得分:2)

使用boto3发现实例,使用fabric在实例上运行命令

答案 4 :(得分:1)

你没有从python SSH。您可以使用boto3模块与EC2实例进行交互。

Here您有boto3的完整文档以及可以使用它运行的命令。

答案 5 :(得分:1)

Boto提供了一种使用Paramiko以编程方式SSH进入EC2实例的方法,然后运行命令。 Boto3不包含此功能。您可以修改boto代码以使用boto3而无需花费大量精力。或者你可以考虑使用像fabric或ansible这样的东西来提供一种更强大的方法来远程执行EC2实例上的命令。

答案 6 :(得分:1)

以下是我的工作方式

import boto3
import botocore
import boto
import paramiko

ec2 = boto3.resource('ec2')

instances = ec2.instances.filter(
    Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
i = 0
for instance in instances:
    print(instance.id, instance.instance_type)
    i+= 1
x = int(input("Enter your choice: "))
try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    privkey = paramiko.RSAKey.from_private_key_file('address to .pem key')
    ssh.connect(instance.public_dns_name,username='ec2-user',pkey=privkey)
    stdin, stdout, stderr = ssh.exec_command('python input_x.py')
    stdin.flush()
    data = stdout.read().splitlines()
    for line in data:
        x = line.decode()
        #print(line.decode())
        print(x,i)
        ssh.close()

对于凭证,我添加了AWSCLI包,然后在终端运行中

aws configure

输入凭据。所有这些都将保存在.aws文件夹中,你也可以改变路径。