2014-04-21 2 views
0

특정 파일의 내용을 읽으려고합니다. 이 파일이있는 여러 호스트가 있습니다. 내가 실행하고 출력을 얻을 수 있도록 ssh 중에 아래 명령을 전달하고 있습니다.ssh를 통해 find 명령을 전달할 때 발생하는 문제

  1. 아래의 명령을 사용하면 지정된 오류가 발생합니다. 작동하지 않는 그 간부를 사용하는 경우

    $ ssh host "more $(find /my/path -name "test*")" 
    find: 0652-010 The starting directory is not valid. 
    
  2. (자사가 호스팅하는 sshed하지만 아무 일도 발생하지 않습니다) (호스트하지만 아무 반응이 없습니다 sshed)

    를 예상대로 작동하고 xargs를 사용하는 경우

    $ ssh host "find /my/path -name "test*" -exec more {} \;"` 
    
  3. $ 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를 사용하여 이러한 파일 목록을 처리 (사용) 할 수 있지만 거기에 터미널이 없으므로 _server_ 측에서'more' ('less')를 사용하십시오. 이 명령은 화면의 길이를 결정할 수 없으므로 출력을 중단 할 수 있습니다. 대신'cat'처럼 전체 파일을 플러시합니다. 다시 말하지만 그 출력을 _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 쉘에 의해 수행되는 명령이 원격 상자에 도달 할 때까지 "...$()" 문자를 두 번 인용 문자열이 존재하지 않는 것을 그 :

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 {} \\;" 

또는

ssh [email protected]$t 'find ds -name README -exec more {} \;'