How to SSH and run commands in EC2 using boto3?

前端 未结 6 1970
情深已故
情深已故 2020-12-03 05:02

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?

相关标签:
6条回答
  • 2020-12-03 05:28

    Here is how I have done

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

    For the credentails, I have added AWSCLI package, then in the terminal run

    aws configure
    

    enter the credentials. All of them will be saved in .aws folder, u can change the path too.

    0 讨论(0)
  • 2020-12-03 05:29

    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
    
    0 讨论(0)
  • 2020-12-03 05:42

    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",
    
    0 讨论(0)
  • 2020-12-03 05:43

    use boto3 to discover instances and fabric to run commands on the instances

    0 讨论(0)
  • 2020-12-03 05:45

    Boto provided a way to SSH into EC2 instances programmatically using Paramiko and then run commands. Boto3 does not include this functionality. You could probably modify the boto code to work with boto3 without a huge amount of effort. Or you could look into using something like fabric or ansible which provide a much more powerful way to remotely execute commands on EC2 instances.

    0 讨论(0)
  • 2020-12-03 05:46

    You don't SSH from python. You can use boto3 module to interact with the EC2 instance.

    Here you have a complete documentation of boto3 and what commands you can run with it.

    0 讨论(0)
提交回复
热议问题