多个 SSH 无法运行多个命令

多个 SSH 无法运行多个命令

当使用如下所示的多个 SSH 时,我只能运行一个命令,如果尝试运行多个命令,则会失败。

这件事失败了:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $PEM -t -t $APP_CLUSTER_USER@$APP_CLUSTER_IP "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $PEM -t -t $INSTANCE_USER@$INSTANCE_IP "rm -rf /home/$INSTANCE_USER/$INSTANCE_DEPLOY_DIR ;mkdir $INSTANCE_DEPLOY_DIR"" || exit 1

但可以正确地将同一个命令分成两次运行。

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $PEM -t -t $APP_CLUSTER_USER@$APP_CLUSTER_IP "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $PEM -t -t $INSTANCE_USER@$INSTANCE_IP "rm -rf /home/$INSTANCE_USER/$INSTANCE_DEPLOY_DIR"" || exit 1

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $PEM -t -t $APP_CLUSTER_USER@$APP_CLUSTER_IP "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $PEM -t -t $INSTANCE_USER@$INSTANCE_IP "mkdir $INSTANCE_DEPLOY_DIR"" || exit 1

为什么是这样?

答案1

您正尝试""在另一组 内嵌套使用 命令""。除非您对内部对使用反斜杠,否则此方法无效。按照您的方式,有两个带引号的字符串:

"ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $PEM -t -t $INSTANCE_USER@$INSTANCE_IP "

""

以及中间一系列未加引号的标记:

rm -rf /home/$INSTANCE_USER/$INSTANCE_DEPLOY_DIR ;mkdir $INSTANCE_DEPLOY_DIR

因此分号由您原来的本地 shell 解释,从而使得 mkdir 命令与 ssh 完全分开。

简化版本完全是靠运气才能运行的。(决定性因素是您在未加引号的部分没有分号,但您也很幸运,ssh 并不关心您给出的命令是否是单个参数。)

将内部部分更改为

\"rm -rf /home/$INSTANCE_USER/$INSTANCE_DEPLOY_DIR ;mkdir $INSTANCE_DEPLOY_DIR\"

答案2

谢谢凯文,这有效。

我又找到了一个解决方案。

在嵌套的 SSH 中,我们应该使用单引号代替双引号

相关内容