Bash脚本SSH命令变量插值

问题描述

首先:我已经搜索了该论坛,还浏览了文档,但仍然无法正确处理。

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

这实际上是我要做的,也是我需要的:该脚本是我们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 var的零件。它是空的,不会被替换。这表明,因为var在远程计算机上不存在,所以在我的本地计算机上存在。我尝试使用单引号$(),...或者它只是行不通,或者我在网上找到的解决方案都执行了该命令,但是后来我无法获取容器名称,我需要以下命令:

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

感谢您的输入!

解决方法

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

基本上,您使用双引号双引号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'"
,

您将需要使用

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...