当使用如下所示的多个 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 中,我们应该使用单引号代替双引号。