【问题标题】:Remote SSH commands with for loop带有 for 循环的远程 SSH 命令
【发布时间】:2019-11-14 15:19:18
【问题描述】:

我正在远程机器上从客户端机器运行 ssh 命令:

ssh  -o "StrictHostKeyChecking no" -i $key 'user'@$public_ip "    
i=1;
workerips: "ip1 ip2";
for ip in $worker_ips; do
    echo \"ipis: ${ip} and i is ${i}\"
done;"

我的问题是 '$ip' 和 '$i' 在 'for' 循环中是空的。 '$i' 将其值保持在 for 循环之外。我做错了什么?

【问题讨论】:

  • 第三行不应该是workips="ip1 ip2";吗?实际上,您可能需要转义这些引号:workerips=\"ip1 ip2\";。您可能还需要将每个$ 转义为\$,以便在远程机器上而不是在本地进行解释。
  • 感谢将 $ 转义为​​ \$ 修复了它。我已经在代码中使用了带有转义引号的第 3 行,但问题中没有包含它。

标签: bash shell unix ssh


【解决方案1】:

根据您要执行的操作,并行 ssh 程序 (pssh) 可以为您工作。

https://linux.die.net/man/1/pssh

这个想法是你可以在你定义的节点上执行相同的命令(无论是全面还是批量)。基本工作负载可能会跨多个节点更新配置文件,更复杂的情况包括跨 Cassandra 集群的快照等内容,以确保您几乎同时运行这些内容。

【讨论】:

    【解决方案2】:

    很多使用heredoc来做这种事情会更容易:

    $ ssh -o "StrictHostKeyChecking no" -i "$key" user@$public_ip << \EOF
    > i=1
    > workerips="ip1 ip2"
    > for ip in $workerips; do echo "ipis: ${ip} and i is ${i}"
    > done
    > EOF
    

    【讨论】:

    • 谢谢,但我想在自动脚本而不是交互式会话中运行它。
    • 您可以在脚本中使用 heredocs。我展示了一个交互式会话这一事实并没有改变任何东西。只需删除提示的前两列即可。
    • 你知道为什么'for'循环在heredoc中不起作用:> ~/uniquefile $i >> ~/uniquefile i=$((i+1)) done 循环外的 EOF 命令正在工作.
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2017-05-11
    • 2014-01-20
    • 2015-01-26
    • 2020-09-24
    • 1970-01-01
    • 2019-06-24
    • 2011-11-02
    相关资源
    最近更新 更多