【发布时间】: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(这很危险,如果您使用它进行更改,它们将在容器退出时丢失)。