通过ssh传递find命令的问题

时间:2014-04-21 21:25:46

标签: linux bash unix ssh solaris

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

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

    $ 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"
    
  4. 有人可以解释为什么方法1& 2不工作?

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

    more $(find /my/path -name "test*")
    
    find /my/path -name "test*" -exec more {} \;
    
    find /my/path -name "test*" | xargs more
    

4 个答案:

答案 0 :(得分:5)

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

ssh ddd@$t "more \$(find ds -name README)"

OR

ssh ddd@$t 'more $(find ds -name README)'

对于(2)同样,你需要转义\,以便它被正确地传递给远程盒子:

ssh ddd@$t "find ds -name README -exec more {} \\;"

OR

ssh ddd@$t 'find ds -name README -exec more {} \;'

答案 1 :(得分:0)

你的语法错了。特别是看一下双引号:你将test* 里面的双引号括在另一组双引号中。 shell应该如何理解?相反,你必须“逃避”(以保护)内部引号。您应该使用more(或less)命令本地,因为您要限制本地终端长度:

此版本的首次尝试按预期工作:

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

答案 2 :(得分:0)

答案是引用。

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

答案 3 :(得分:0)

您应该执行以下操作:

ssh主机“ ksh -c'找到/ my / path -name \” test * \“ -exec more {} \;'”`

当使用“ -c”作为选项时,ksh会将命令读取为字符串并直接运行