2013-04-20 4 views
1

좋아요, 그래서 최근 stdin 스타일 줄을 대화식 명령으로 제공하기 위해이 문서의 마술을 발견했습니다. 그러나 SSH를 사용하여 원격 서버에서 많은 명령을 실행하려고하지만 추가 명령을 실행하기 전에 실제 입력을 파이프해야합니다. 문제를 더욱 혼란에 빠뜨리므로 결과가 필요합니다. 백업)SSH 용 셸에서 파이프와 여기에있는 문서를 결합하십시오.

여기 내가 사용하려고 해요 내용은 다음과 같습니다

#!/bin/sh 
RESULT=$(find -type f "$PATH" | gzip | ssh "$HOST" <<- 'REMOTE_SYNC' 
    cat > "/tmp/.temp_file" 

    # Do something with /tmp/.temp_file 
REMOTE_SYNC 

이 실제로 맞습니까? 내가 가지고있는 문제 중 일부는 데이터를/tmp에있는 파일에 파이프해야한다는 것입니다.하지만 무작위로 명명 된 임시 파일을 생성해야합니다.하지만 어떻게 할 수 있는지 잘 모르겠습니다. 변수에 대한 이름 (그래서 나는 그것에 되돌아 갈 수있다.) 그리고 여전히 stdin을 그것 안으로 보낸다.

나는 또한 find | gzip 부분을 별도의 명령으로 로컬로 먼저 실행하십시오. gzipped 파일은 준비가되었을 때 보내면 SSH 연결이 훨씬 짧아지고 결과적으로 생성 된대로 보내지 만 그 사실을 알지 못합니다. SSH에 stdin과 여분의 명령을 모두 제공 할 수 있어야합니다.

+1

; 그 대신에 그것을 사용하는 것이 좋습니다. – msw

답변

4

아니요, 이렇게 할 수 없습니다. heredoc과 파이프 된 입력은 모두 stdin과 경쟁하며 단 하나만 승리합니다. 이 예를보세요 :

echo test | cat << EOF 
TEST 
EOF 

인쇄 내용 test, TEST 또는 둘 다? 그것은 TEST을 출력하므로 heredoc이 승리합니다 (최소한 bash에서는).

어쨌든 이것을 사용하지 않아도됩니다. 다행히도 sshcommand 인수를 취합니다.이 인수는 원격 호스트의 쉘로 전달되므로 명령을 여기 문자열로 사용할 수 있습니다. 이 같은 뭔가 : (훨씬 이해가되지 않습니다 althoug)

echo TEST | ssh [email protected] 'cat > tempfile; cat tempfile; rm tempfile' 

일하는 것이, 왼쪽 명령의 출력은 원격 호스트에 ssh을 통해 파이프 및이 표준 입력으로 제공됩니다.

ssh를 통해 데이터를 보낼 때 데이터를 압축하려면 -C 옵션을 사용하여 압축을 활성화하면됩니다.


편집 : 문자열 내부

사용 바꿈 완벽하게 괜찮습니다, 그래서 이것은 좋은 작품도 :

echo TEST | ssh [email protected] ' 
    cat > tempfile 
    cat tempfile 
    rm tempfile 
' 

히어 닥의 유일한 차이점은 당신이 따옴표를 탈출해야한다는 것입니다. 당신이 echo TEST | ssh [email protected] "$(<script.sh)" 같은 것을 사용하는 경우

당신은 ... 파일에 모든 것을 기록 할 수

당신은`rsync`를 재발견하려고하는 것 같습니다
+0

흠, 문자열 명령에 내 명령을 응축하기보다는 여기 문서를 계속 사용하고 싶습니다. stdin을 통해 데이터와 명령을 하나의 스트림으로 보내야 할 수도 있습니다. 따라서 명령을 추가하여 셸 스크립트를 실행하기 만하면됩니다. 그래도 고마워! – Haravikk

+0

에 몇 가지 예가 추가되었습니다. 같은 입력 스트림에 명령과 입력을 보내는 것이 좋지 않다고 생각합니다 ... – mata