Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to SSH and run commands in EC2 using boto3?

I want to be able to ssh into an EC2 instance, and run some shell commands in it, like this.

How do I do it in boto3?

like image 622
Dawny33 Avatar asked Mar 07 '17 10:03

Dawny33


People also ask

How do I connect to EC2 instance boto3?

You just connect to EC2 service, and from there you can start/stop and interact with the different instances, but never SSH into them. For that you don' need boto3 at all. You can simply SSH from your terminal. If you still want to execute commands using python over SSH, you can take a look at this question.


2 Answers

This thread is a bit old, but since I've spent a frustrating afternoon discovering a simple solution, I might as well share it.

NB This is not a strict answer to the OP's question, as it doesn't use ssh. But, one point of boto3 is that you don't have to - so I think in most circumstances this would be the preferred way of achieving the OP's goal, as s/he can use his/her existing boto3 configuration trivially.

AWS' Run Command is built into botocore (so this should apply to both boto and boto3, as far as I know) but disclaimer: I've only tested this with 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) 

For windows instance powershell commands you'd use an alternative option:

        DocumentName="AWS-RunPowerShellScript", 
like image 72
thclark Avatar answered Sep 21 '22 22:09

thclark


You can use the following code snippet to ssh to an EC2 instance and run some command from 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 
like image 25
Venkatesh Wadawadagi Avatar answered Sep 21 '22 22:09

Venkatesh Wadawadagi