SSH executa automaticamente o bash no contêiner do Docker ao conectar

0

Eu tenho o Docker em execução em uma instância do AWS EC2 (Elastic Beanstalk). Eu gostaria de executar interativamente bash no contêiner automaticamente com um script que eu corro do meu shell sem passar por todos os comandos de digitação de cada vez.

Eu fiz isso usando uma resposta de superusuário sobre a impressão de argumentos individuais baseados em regex. Se eu digitar ou colá-lo enquanto estiver conectado ao AWS, ele funcionará bem.

sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash

Este é o meu "script" de conexão SSH:

#!/usr/bin/env bash
ssh -i /path/to/my.pem awsuser@myhost

Eu tentei combinar os dois sem sucesso usando ssh -t:

#!/usr/bin/env bash
ssh -i /path/to/my.pem awsuser@myhost -t "sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash"

Mas sem sorte. Aqui está a transcrição da sessão de console:

myuser@MYCOMPUTER:~$ ./myscript.sh
sudo: unable to resolve host MYCOMPUTER
[sudo] password for myuser:

myuser@MYCOMPUTER:~$

Parece que está tentando executar o comando e ENTÃO se conectar? Então eu troquei para isso:

#!/usr/bin/env bash
ssh -i /path/to/my.pem -t "sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash" awsuser@myhost

Ainda o mesmo problema. Obrigado pela ajuda!

    
por OrgnlDave 01.12.2016 / 21:07

2 respostas

0

Você está correto em sua afirmação de que o subcomando está sendo executado antes do ssh acontecer. Isso porque seu shell vê o texto em $( ... ) e o executa primeiro. É possível contornar isso colocando o comando inteiro entre aspas simples ' em vez de aspas duplas " , mas isso fica complicado ao tentar obter cotas aninhadas. Felizmente, há uma maneira mais fácil.

Suponho que você esteja querendo se conectar a um contêiner que já está em execução em vez de criar um novo contêiner para cada nova conexão. Eu recomendo dar ao seu contêiner um nome consistente para que você possa consultá-lo quando se conectar. Por exemplo

docker rename dc66a6ad31ca container_shell

Substitua dc66a6ad31ca pelo nome do seu contêiner em execução (o que você pode obter executando docker ps )

Depois de fazer isso, execute seu comando ssh assim:

ssh -i /path/to/my.pem awsuser@myhost -t "sudo docker exec -it container_shell bash"

e isso deve ser feito. A opção -t no comando ssh é necessária para forçar a alocação de um pty e, em seguida, o -t no comando docker faz o mesmo dentro do contêiner.

Também é possível eliminar o sudo no comando se você colocar seu usuário no grupo de encaixe, mas essa é uma etapa opcional.

EDITAR

@OrgnlDave apontou que o Elastic Beanstalk não permite que alguém renomeie um contêiner, daí a necessidade de procurar por ele. Sua solução foi fazer isso:

ssh -i /path/to/my.pem myuser@host -t 'sudo docker exec -it $(sudo docker ps | grep -o ecs-awseb-mything-.*) bash'

Também pode ser útil limitar a saída do grep para apenas a primeira correspondência, caso haja vários contêineres que correspondam ao padrão. Isso pode ser feito adicionando -m 1 ao comando grep, fazendo com que a linha de comando fique assim:

ssh -i /path/to/my.pem myuser@host -t 'sudo docker exec -it $(sudo docker ps | grep -om1 ecs-awseb-mything-.*) bash'
    
por 01.12.2016 / 21:57
-1

Você não precisa de um tty, apenas adicione o comando remoto sem alternar.

#!/usr/bin/env bash
ssh -i /path/to/my.pem awsuser@myhost "sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash" 
    
por 01.12.2016 / 21:37