2014-04-21 33 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 {} \;'