我正在尝试阅读特定文件的内容。我有多个这些文件所在的主机。我在ssh期间传递下面的命令,以便它可以运行并获得输出。
使用以下命令时,我会收到指定的错误。 (它主宰但没有任何反应)
$ ssh host "more $(find /my/path -name "test*")"
find: 0652-010 The starting directory is not valid.
当使用exec它不工作时,(它的sshed主机但没有任何反应)
$ ssh host "find /my/path -name "test*" -exec more {} \;"`
使用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 :(得分: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会将命令读取为字符串并直接运行