我正在通过SSH连接到远程服务器:
ssh -i ~/.ssh/pk.pem user@server
,然后在该服务器上,在Docker容器中打开bash:
docker exec -it $(docker ps | grep ecs-worker-low | cut -d ' ' -f1) bash
这很好。(注意,我需要像这样获得容器ID。我不能命名容器
我想结合这两个命令,这样我只运行一个命令并在容器中获得shell。可以这样做:
ssh -i ~/.ssh/pk.pem user@server -t "bash -c 'docker exec -it $(docker ps | grep ecs-worker-low | cut -d ' ' -f1) bash'"
然而,由于嵌套的单引号,这不起作用。我还没有找到任何解决办法。你能帮帮我吗?谢谢你。
可以避免使用cut
与--filter
和--format
ssh -t -i ~/.ssh/pk.pem user@serve 'docker exec -it $(docker ps --filter ancestor=ecs-worker-low --format {{.ID}}) bash'
使用heredoc可能是最简单的:
ssh -i ~/.ssh/pk.pem user@server -t << EOF
docker exec -it $(docker ps | grep ecs-worker-low | cut -d ' ' -f1)
EOF
请确保使用非插值格式。如果省略初始分隔符上的反斜杠,则将在本地主机上进行进程替换。
交换引号:
ssh -i ~/.ssh/pk.pem user@server -t 'bash -c "docker exec -it $(docker ps | grep ecs-worker-low | cut -d " " -f1) bash"'
就ssh
而言,所有双引号都是文字字符,并且命令替换创建了一个新的上下文,因此第一个内引号不会关闭第一个外引号。也就是说…
…简化问题,您可能不需要外部bash
;ssh
可以直接为您运行docker
:
ssh -i ~/.ssh/pk.pem user@server -t 'docker exec -it $(docker ps | grep ecs-worker-low | cut -d " " -f1) bash'