Linux 通过ssh传递find命令时出现问题
我正在尝试读取特定文件的内容。我有多个主机,这些文件位于其中。我在ssh期间传递下面的命令,以便它可以运行并获得输出Linux 通过ssh传递find命令时出现问题,linux,bash,unix,ssh,solaris,Linux,Bash,Unix,Ssh,Solaris,我正在尝试读取特定文件的内容。我有多个主机,这些文件位于其中。我在ssh期间传递下面的命令,以便它可以运行并获得输出 当使用下面的命令时,我得到指定的错误。(已发送至主机,但未发生任何事情) 当使用exec时,它不工作,(它被发送到主机,但什么也没有发生) 当使用xargs时,它会按预期工作 $ ssh host "find /my/path -name "test*" | xargs more" 有人能解释为什么方法1和2不起作用吗? 请注意,若我直接在远程主机上运行该命令,那个么每个
$ ssh host "find /my/path -name "test*" | xargs more"
more $(find /my/path -name "test*")
find /my/path -name "test*" -exec more {} \;
find /my/path -name "test*" | xargs more
你的语法错了。特别是看一下双引号:将
test*
周围的双引号集括在另一组双引号中。shell应该如何理解这一点?相反,你必须“逃避”(所以要保护)内在的引语。您应该在本地使用more
(或less
)命令,因为您希望限制本地终端长度:
此版本的第一次尝试按预期工作:
ssh host "find /my/path -name \"test*\"" | more
答案是引用
在第一种情况下,在本地运行find
。请尝试ssh主机“echo$(主机名)”
。第二种方法分别在每个文件上运行更多的。对于(1)“…$(命令替换)”
由您的本地bash shell执行,您需要对其进行转义,以便在命令到达远程框之前,“…$()”
文本双引号字符串不会出现:
ssh ddd@$t "more \$(find ds -name README)"
ssh ddd@$t "find ds -name README -exec more {} \\;"
或
对于(2)类似地,您需要转义\
,以便将其正确地传递到远程框:
ssh ddd@$t "more \$(find ds -name README)"
ssh ddd@$t "find ds -name README -exec more {} \\;"
或
您应按以下步骤操作:
ssh主机“ksh-c'find/my/path-name\”test*\“-exec more{}\;”`
当使用“-c”作为选项时,ksh将命令作为字符串读取并直接运行它我正在尝试查找文件并使用更多命令读取该文件。方法3也有内部引号,但那一个是有效的,那么为什么方法1不起作用呢?正如你提到的,我也尝试过转义内部引号,但它不起作用。啊,这是不同的。。。您会看到find返回文件列表,而不是文件内容。。。您可以使用xargs
进一步处理(使用)这样的文件列表,但不能使用服务器端的more
(less
),因为那里没有终端。命令无法决定屏幕的长度,因此在何处停止输出。相反,它将刷新整个文件,就像cat
一样。这同样意味着您可以通过管道将输出传输到本地命令:ssh-host“find/my/path-name\”test*\“| xargs cat”| more
。。。
ssh ddd@$t "find ds -name README -exec more {} \\;"
ssh ddd@$t 'find ds -name README -exec more {} \;'