Bash脚本SSH命令变量插值



首先:我搜索了论坛,也查看了文档,但仍然无法正确处理。

因此,我有一个docker命令,我想从我的bash脚本在远程服务器上运行。我想将运行脚本的本地机器上的环境变量传递给远程服务器。此外,我需要远程命令的响应。

以下是我实际想要做的和我需要做的:该脚本是我们Traefik/Docker/Elixir/Phoenix应用程序设置的一个小包装,以便能够在Erlang观察程序中轻松连接到正在运行的Elixir应用程序。对于脚本,步骤是:

  • ssh到远程机器
  • docker ps查看所有正在运行的容器,因为在我们的蓝色/绿色部署中,活动容器更改了名称
  • docker exec插入正确的容器
  • 在docker容器内执行命令以连接到正在运行的Elixir应用程序

我现在使用的命令是:

CONTAINER=$(ssh -q $USER@$IP 'sudo docker ps --format "{{.Names}}" | grep ""$APP_NAME"" | head -n 1')

主要问题是带有grep和ENV变量的零件。它是空的,不会被替换。它使sence,因为var在远程机器上不存在,它在我的本地机器上存在。我试过单引号,$()。。。要么它不起作用,要么我在网上找到的解决方案执行命令,但我无法获得容器名称,这是我后续命令所需的:

ssh -o 'RequestTTY force'  $USER@$IP "sudo docker exec -i -t $CONTAINER /bin/bash -c './bin/app remote'"

感谢您的投入!

首先,您确定需要调用sudo docker stop吗?因为停止容器似乎不是您提到的工作流程的一部分[编辑:不再适用]

基本上,您使用双引号grep ""$APP_NAME"",但该变量似乎没有被替换(因为整个命令'sudo docker ps …'单引号(;根据你的问题,这个变量在本地可用,但在远程机器上不可用,所以你可以尝试写:

CONTAINER=$(ssh -q $USER@$IP 'f() { sudo docker ps --format "{{.Names}}" | grep "$1" | head -n 1; }; f "'"$APP_NAME"'"')

您可以尝试以下单个命令:

ssh -t $USER@$IP "docker exec -it $(docker ps -a -q --filter Name=/$APP_NAME) bash -c './bin/app remote'"

您需要使用<lt<因此:

CONTAINER=$(ssh -q $USER@$IP <<< 'sudo docker ps --format "{{.Names}}" | grep "$APP_NAME" | head -n 1 | xargs -I{} sudo docker stop {}')

最新更新