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'