Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 通过ssh传递find命令时出现问题_Linux_Bash_Unix_Ssh_Solaris - Fatal编程技术网

Linux 通过ssh传递find命令时出现问题

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期间传递下面的命令,以便它可以运行并获得输出

  • 当使用下面的命令时,我得到指定的错误。(已发送至主机,但未发生任何事情)

  • 当使用exec时,它不工作,(它被发送到主机,但什么也没有发生)

  • 当使用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
    

    你的语法错了。特别是看一下双引号:将
    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 {} \;'