shell SSH和Docker Exec一起不接受多个命令

66bbxpm5  于 2023-02-05  发布在  Shell
关注(0)|答案(1)|浏览(110)

我需要创建一个shell脚本,该脚本使用SSH连接到远程机器,然后在该机器上运行的Docker容器中运行一些命令。
我希望下面的命令可以工作。但是它只执行容器中的第一个命令。

ssh -i key user@1.1.1.1 docker exec my-container bash -c command1 && command2 && command3

到目前为止,我能想到的最佳解决方案是:

ssh -i key user@1.1.1.1 "docker exec my-container bash -c 'command1 && command2 && command3'"

但是它只能和一些命令一起使用,我可以运行像mkdir echo这样的命令,但是我不能和curl一起使用。

ssh -i key user@1.1.1.1 "docker exec my-container bash -c 'curl --verbose --stderr stderr -X GET "http://2.2.2.2:5000/file/download" -H  "Authorization: Bearer $1" > curl_out

我不知何故需要使curl命令工作。它成功地扩展了$1作为授权令牌,但curl命令没有看到使用头。我不能让它工作。
有没有更好的方法来构造这种嵌套的命令管道。我尝试了50种不同的引号组合,不同的变量,尝试在容器内的shell脚本中编写回显,然后运行它。每种解决方案在尝试使用带有多个选项/参数的复杂命令时都失败了。

41zrol4v

41zrol4v1#

当你写下这段话时:

ssh -i key user@1.1.1.1 docker exec my-container \
  bash -c command1 && command2 && command3

您只是在创建一个本地shell管道,这与您要运行以下命令是一样的:

date && command2 && command3

您的shell并不神奇地知道您打算在远程主机上运行后两个命令,如果您想将整个shell管道传递给远程主机,则需要将其引用起来。
你可能会想做这样的事情:

ssh -i key user@1.1.1.1 docker exec my-container \
  bash -c "command1 && command2 && command3"

但这仍然无法达到预期效果:在本例中,您正在远程主机上运行命令docker exec my-container bash -c command1 && command2 && command3。也就是说,只有command1正在容器内运行。您需要另一层引号:

ssh -i key user@1.1.1.1 docker exec my-container \
  'bash -c "command1 && command2 && command3"'

相关问题