通过SSH进行远程循环


12

我在脚本中有以下内容

for server in ${servers[@]}; do
    echo ${server}
    ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done

但这是行不通的。奇怪的是,我看到$ I的返回行数量。因此,如果我有十个文件,我会看到十个空行。


还要看看GNU Parallel的 --sshlogin选项。
塞巴斯蒂安

Answers:


19

您的本地shell解释了${i}双引号(")内的内容,因此该命令可以计算出

ssh user@some.serv.er "for i in /tmp/foo* ; do echo; done"

只需使用单引号(')代替,问题就会消失:

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'

1

只是碰到这个问题,然后给出的解决方案虽然确实有效,但如果您还从本地shell提取变量,那么在ssh之前创建数组进行迭代。有点麻烦的是最初只是逃避$,所以

"for i in /tmp/foo* ; do echo \${i}; done"

它将在本地构造而不是所谓的ssh shell中转义。


0

我已经更新了以上答案,也可以从列表中获取端口。

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.