【问题标题】:How to pass variable inside the ssh command inside for loop如何在for循环内的ssh命令中传递变量
【发布时间】:2021-11-08 07:22:17
【问题描述】:

我有一个虚拟机,其中有一个文件夹 A,其中包含 doc1.txt doc2.txt king1.soking2.so
我正在尝试使用来自另一个 VM 的 ssh 列出特定扩展名的文件。

VAR_PATH="/predefined/path/to/A"
echo $VAR_PATH

for file_path in `ssh user@xxx.xxx.xxx.xxx "find $VAR_PATH -iname "*.so""`
do
        echo $file_path
done

这不起作用并给我错误

find:路径必须在表达式之前:sample.so 用法:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

当我在find 命令中硬编码路径时,相同的命令起作用

for file_path in `ssh user@xxx.xxx.xxx.xxx "find /predefined/path/to/A -iname "*.so""`
do
        echo $file_path
done

如何在这个 for 循环中的 ssh 命令中传递路径变量

【问题讨论】:

  • 快速说明 -- 你真的不想在这里使用反引号;它们改变了其他反引号和反斜杠在其中的行为方式。 $( ) 是进行命令替换的现代方式,它自 1990 年代初就已标准化,因此真的没有任何借口。
  • 无论如何——我更担心你代码中的*.so。双引号在到达远程服务器之前丢失了。设置为"set -x; find ...",您将能够看到服务器如何解释它接收到的命令。
  • (虽然quotes-getting-lost 不是远程服务器问题;这是本地解析问题:"foo""bar" 完全"foobar" 相同-- 成对的双引号只是相互抵消;不像其他一些语言,它们只翻译成一个字面引号)。
  • 另外,for file_path in $(anything) 是一个整体的反模式。见BashPitfalls #1BashFAQ #1 中记录了逐行读取流的正确方法,BashFAQ #24 中介绍了如何将 ssh 之类的命令的输出馈送到此类循环中的注意事项。
  • 除非循环体有更多内容,否则根本不需要。

标签: linux shell ssh script


【解决方案1】:

试试这个:(centos 8 测试通过)

D=/tmp/test/ && for i in `ssh xxx@xxxxx "find $D -name '*.so'"`;do echo $i;done

【讨论】:

    【解决方案2】:

    最好不要使用 for 循环并将输出存储在一个数组中,然后你可以循环或任何你想要的。

    array_result=(`ssh user@xxx.xxx.xxx.xxx "find ${VAR_PATH} -iname *.so"`)
    

    【讨论】:

    • array_result 不是数组,而是字符串。 (另外,ls 命令不等同于它所取代的find——后者是递归的,f/e)。
    • 那不是数组;它只是一个以换行符分隔的字符串。
    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多