web-dev-qa-db-fra.com

Comment SSH et exécuter des commandes dans EC2 en utilisant boto3?

Je veux pouvoir utiliser ssh dans une instance EC2 et y exécuter des commandes Shell, comme this .

Comment puis-je le faire dans boto3? 

10
Dawny33

Vous pouvez utiliser l'extrait de code suivant pour ssh en une instance EC2 et exécuter une commande de 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
5
Venkatesh

Ce fil est un peu vieux, mais puisque j'ai passé une après-midi frustrante à découvrir une solution simple, je pourrais aussi bien la partager.

NB Ce n'est pas une stricte réponse à la question du PO, car il n'utilise pas ssh. Mais un point de boto3 est que vous n’avez pas à le faire - je pense donc que dans la plupart des circonstances, c’est le moyen privilégié pour atteindre l’objectif du PO, puisqu’il peut utiliser sa configuration de boto3 existante de manière triviale.

AWS 'Run Command est intégré à botocore (cela devrait donc s'appliquer à boto et à boto3, pour autant que je sache), mais disclaimer: je n'ai testé cela qu'avec 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)

Pour les commandes powershell d'instance Windows, vous utiliseriez une autre option:

        DocumentName="AWS-RunPowerShellScript",
22
thclark

utiliser boto3 pour découvrir les instances et fabric pour exécuter des commandes sur les instances

2
James Soubry

Vous ne faites pas SSH de python. Vous pouvez utiliser le module boto3 pour interagir avec l'instance EC2. 

Ici vous avez une documentation complète de boto3 et des commandes que vous pouvez exécuter avec.

1
Carles Mitjans

Boto a fourni un moyen de programmer SSH dans des instances EC2 à l'aide de Paramiko, puis d'exécuter des commandes. Boto3 n'inclut pas cette fonctionnalité. Vous pourriez probablement modifier le code boto pour qu'il fonctionne avec boto3 sans trop d'effort. Vous pouvez également utiliser quelque chose comme fabric ou ansible, qui offre un moyen beaucoup plus puissant d’exécuter à distance des commandes sur des instances EC2.

1
garnaat

Voici comment j'ai fait

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()

Pour les identifiants, j'ai ajouté le package AWSCLI, puis dans le terminal run

aws configure

entrez les informations d'identification. Tous seront sauvegardés dans le dossier .aws, vous pourrez aussi changer le chemin.

0