【问题标题】:Execute a remote command over SSH with remote evaluation使用远程评估通过 SSH 执行远程命令
【发布时间】:2022-01-08 19:22:36
【问题描述】:

我正在尝试通过 SSH 运行命令,并希望在远程计算机上对命令中的表达式进行评估。

我正在尝试运行这个:

ssh -A username@ip "sudo docker exec -it "$(docker ps | grep 'some' | awk '{ print $1 }')" python manage.py shell"

但是当我使用 ssh 命令时,表达式 $(docker ps | grep 'some' | awk '{ print $1 }') 在远程机器上没有正确计算。

确认一下,如果我先 ssh 进入远程机器,然后运行sudo docker exec -it "$(docker ps | grep 'some' | awk '{ print $1 }')" python manage.py shell,它确实会正确评估并成功给我一个 shell。作为 ssh 命令参数的一部分,我无法直接从我的本地机器上运行它。

我该怎么做才能让它作为 ssh 命令的一部分工作?


执行以下命令的问题是我从终端 (iTerm) 收到 Pseudo-terminal will not be allocated because stdin is not a terminal. 消息,并且在执行此命令后没有得到预期的 shell。

ssh -A username@ip <<'EOL'
    name="$(docker ps | grep 'some' | awk '{ print $1 }')"
    docker exec -it $name python manage.py shell
EOL

【问题讨论】:

  • 为什么需要$(docker ps) 子shell 调用?如果项目由 Compose 管理,您可以使用docker-compose exec,它会自行查找容器。您还可以查看是否可以向应用程序添加某种管理界面以避免docker exec(这很危险,如果您使用它进行更改,它们将在容器退出时丢失)。

标签: linux bash docker ssh


【解决方案1】:

您需要像这样转义需要由远程 shell 解释的所有字符:

ssh -A username@ip "sudo docker exec -it \"\$(docker ps | grep 'some' | awk '{ print \$1 }')\" python manage.py shell"

这样,您将发送属于 -it 参数的引号以及 $ 符号不变,远程 shell 将执行它们。

【讨论】:

  • 如果你想看看它是如何工作的,请将“ssh -A username@ip”替换为“echo”,内部命令将打印在控制台中。然后复制它并在远程 shell 中执行 - 结果应该是相同的。
  • 对我有用的是您建议的稍微修改的版本,但您的建议非常有用 - ssh username@ip "sudo docker exec -it \$(sudo docker ps | grep 'some' | awk '{ print \$1 }') python manage.py shell"
  • 只要 $(....) 的返回值不包含空格,它就可以工作。如果是这样,那么您需要将其包装在转义引号中。我很高兴它成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-23
  • 1970-01-01
  • 2015-03-29
  • 2015-07-25
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多