通过ssh传递find命令的问题

use*_*948 2 unix linux ssh bash solaris

我正在尝试阅读特定文件的内容.我有多个这些文件所在的主机.我在ssh期间传递下面的命令,以便它可以运行并获得输出.

  1. 使用下面的命令时,我得到指定的错误.(它主宰但没有任何反应)

    $ ssh host "more $(find /my/path -name "test*")"
    find: 0652-010 The starting directory is not valid.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当使用exec它不工作时,(它的sshed主机但没有任何反应)

    $ ssh host "find /my/path -name "test*" -exec more {} \;"`
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用xargs时,它按预期工作

    $ ssh host "find /my/path -name "test*" | xargs more"
    
    Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么方法1和2不起作用?

请注意,如果我在远程主机上直接运行命令,则每种方法都有效.例如,以下所有命令在远程主机中按预期工作.

more $(find /my/path -name "test*")

find /my/path -name "test*" -exec more {} \;

find /my/path -name "test*" | xargs more
Run Code Online (Sandbox Code Playgroud)

Dou*_*sDD 5

对于(1)"... $(command substitution)"本地 bash shell完成,你需要将其转义,以便"...$()"在命令到达远程框之前不会出现文字双引号字符串:

ssh ddd@$t "more \$(find ds -name README)"
Run Code Online (Sandbox Code Playgroud)

要么

ssh ddd@$t 'more $(find ds -name README)'
Run Code Online (Sandbox Code Playgroud)

对于(2)类似地,您需要转义它\以便它被正确地传递给远程盒:

ssh ddd@$t "find ds -name README -exec more {} \\;"
Run Code Online (Sandbox Code Playgroud)

要么

ssh ddd@$t 'find ds -name README -exec more {} \;'
Run Code Online (Sandbox Code Playgroud)