2014-04-21 43 views
0

我正在尝试阅读特定文件上的内容。我有多个这些文件所在的主机。我在ssh中传递下面的命令,以便它可以运行并获取输出。通过ssh传递find命令的问题

  1. 当使用下面的命令时,我得到指定的错误。 (其sshed到主机上,但没有任何反应)

    $ ssh host "more $(find /my/path -name "test*")" 
    find: 0652-010 The starting directory is not valid. 
    
  2. 当使用EXEC它不工作,(其sshed到主机上,但没有任何反应)

    $ ssh host "find /my/path -name "test*" -exec more {} \;"` 
    
  3. 使用时,它正在xargs的预期

    $ ssh host "find /my/path -name "test*" | xargs more" 
    

有人能解释为什么方法1 & 2不工作?

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

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

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

find /my/path -name "test*" | xargs more 

回答

0

您的语法错误。特别要看看双引号:您将围绕test*围绕另一组双引号的双引号括起来。壳应该如何理解?相反,你必须“逃避”(保护)内部报价。

这是你第一次尝试的版本按预期工作:

ssh host "find /my/path -name \"test*\"" | more 
+0

我想找到的文件和阅读使用更多。方法3也有内部引号,但那个工作,然后为什么方法1不起作用?正如你所提到的,我试图逃避内部报价,但它不起作用。 – user1028948

+0

啊,这是不同的...你看到find返回一个文件列表,而不是文件内容......你可以使用'xargs'来进一步处理(使用)这样的文件列表,但不能与'_''''''''''''''',因为你没有终端。该命令无法决定屏幕的长度,所以停止输出。相反,它会刷新整个文件,就像“猫”一样。这又意味着你可以将该输出传递给_local_命令:'ssh host“find/my/path -name \”test * \“| xargs cat”| more' ... – arkascha

0

答案是引用而且,由于要限制在本地终端长度应该使用more(或less)命令本地

在第一种情况下,您在本地运行find。试试ssh host "echo $(hostname)"。第二种方法分别在合适的上运行more,每个文件

5

对于(1)"... $(command substitution)"是由您当地 bash shell中完成的,你需要逃避它,使得直到命令到达远程框中"...$()"字面双引号的字符串不存在:

ssh [email protected]$t "more \$(find ds -name README)" 

OR

ssh [email protected]$t 'more $(find ds -name README)' 

对于(2)同样,你需要躲避\故correcltly传递到远程箱:

ssh [email protected]$t "find ds -name README -exec more {} \\;" 

OR

ssh [email protected]$t 'find ds -name README -exec more {} \;'