bash中的嵌套引用

  • 本文关键字:引用 嵌套 bash bash
  • 更新时间 :
  • 英文 :


我正在通过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'

最新更新