it-swarm.com.de

Wie kann ich SSH ausführen und Befehle in EC2 mit boto3 ausführen?

Ich möchte in der Lage sein, SSH in eine EC2-Instanz einzubinden und darin einige Shell-Befehle auszuführen, z. B. this .

Wie mache ich das in boto3? 

10
Dawny33

Sie können den folgenden Code-Ausschnitt für ssh für eine EC2-Instanz verwenden und einen Befehl von boto3 ausführen.

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

Dieser Thread ist ein bisschen alt, aber da ich einen frustrierenden Nachmittag damit verbracht habe, eine einfache Lösung zu finden, könnte ich es genauso gut teilen.

Anmerkung: Dies ist keine strikte Antwort auf die Frage des OP, da ssh nicht verwendet wird. Aber ein Punkt von boto3 ist, dass Sie dies nicht tun müssen - daher denke ich, dass dies in den meisten Fällen der bevorzugte Weg ist, um das OP-Ziel zu erreichen, da er/sie seine vorhandene boto3-Konfiguration trivial verwenden kann.

AWS 'Run Command ist in Botocore integriert (dies sollte, soweit ich weiß, für Boto und Boto3 gelten), aber Disclaimer: Ich habe dies nur mit Boto3 getestet.

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)

Für Windows-Instanz-Powershell-Befehle verwenden Sie eine alternative Option:

        DocumentName="AWS-RunPowerShellScript",
22
thclark

verwenden Sie boto3, um Instanzen zu ermitteln, und fabric , um Befehle für die Instanzen auszuführen

2
James Soubry

Du machst keine SSH von Python. Sie können das Modul boto3 verwenden, um mit der EC2-Instanz zu interagieren. 

Hier hast du eine vollständige Dokumentation von boto3 und welche Befehle du damit ausführen kannst.

1
Carles Mitjans

Boto bot die Möglichkeit, mithilfe von Paramiko programmgesteuert SSH in EC2-Instanzen einzuführen und anschließend Befehle auszuführen. Boto3 enthält diese Funktionalität nicht. Sie könnten den Boto-Code wahrscheinlich ohne großen Aufwand an boto3 anpassen. Oder Sie können in der Lage sein, etwas wie Fabric oder ansible zu verwenden, das eine wesentlich leistungsfähigere Möglichkeit bietet, Befehle auf EC2-Instanzen remote auszuführen.

1
garnaat

So habe ich es gemacht

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

Für die Credentails habe ich das AWSCLI-Paket hinzugefügt und dann im Terminal ausgeführt

aws configure

Geben Sie die Anmeldeinformationen ein. Alle werden im .aws-Ordner gespeichert. Sie können auch den Pfad ändern.

0