stdin이 프로세스를 "건너뛰게" 하는 방법이 있습니까? 예를 들어, 다음 명령에서는
cat file | ssh host 'mkdir -p /some/directory && cat > /some/directory/file'
cat
이는 첫 번째에서 두 번째로 표준 입력을 보내고 mkdir
두 번째는 cat
표준 입력을 수신하지 않습니다. 첫 번째 표준 출력을 cat
건너뛰고 mkdir
두 번째 표준 출력으로만 보내길 원합니다 cat
. 나는 당신이 다음과 같은 것을 실행할 수 있다는 것을 알고 있습니다.
cat file | ssh host 'cat > /tmp/file2 ; mkdir -p /some/directory && mv /tmp/file2 /some/directory/'
파일을 복사할 때만 또는
cat file | ssh host 'tee >(mkdir -p /some/directory) >/some/directory/file'
그러나 이는 mkdir
명령이 표준 입력을 사용하지 않기 때문에 작동합니다. 이 기능을 복제하는 명령이 있습니까? 그것은 다음과 같습니다:
cat file | ssh host 'stdinhop mkdir -p /some/directory | cat > /some/directory/file'
stdinhop
stdin을 mkdir로 보내지 않고 두 번째 고양이가 읽을 수 있도록 stdout으로 리디렉션하는 곳은 어디 입니까?
답변1
다음에서 첫 번째 명령의 표준 입력을 리디렉션할 수 있습니다 /dev/null
.
anthony@Watt:~$ echo -e 'hello\nworld' | ssh localhost 'cat < /dev/null && cat -n'
1 hello
2 world
줄에는 번호가 매겨져 있으므로 두 번째 줄에서 가져옵니다 cat
.
SSH를 사용하지 않는 경우 하위 쉘을 사용할 수 있습니다.echo -e 'hello\nworld' | ( cat < /dev/null && cat -n )
답변2
사실 당신이 원하는 일은 이미 이루어졌습니다. 물론 mkdir
귀하의 문제는 아닙니다 . stdin
어쨌든 읽혀지지 않습니다. 파이프는 ssh
와 같은 것을 얻지 않는 한 표준 입력으로 - 의 모든 하위 항목에 상속됩니다 ssh -t
.
그 외에도 문제는 이러한 명령을 실행하는 셸이 ssh
자식 중 하나라는 것입니다. 작업의 일부는 실행하는 각 명령 그룹에 대해 0,1,2를 여는 것입니다. 입력은 공통 설명자(셸이 각 하위 항목에 대해 다시 여는 설명자)에 있기 때문에 셔플에서 손실됩니다.
따라서 가장 간단한 것은 입력을 이 세 가지 기본값 중 하나가 아닌 설명자로 옮기는 것입니다. 예를 들어 다음은 나에게 효과적이었습니다.
echo hey there >file
cat file | ssh mikeserv@localhost '
exec 3<&0
mkdir -p .
echo ho there
cat <&3'
위를 실행하면 다음과 같이 인쇄됩니다.
ho there
hey there
-W
옵션 중에서 일부 유틸리티를 찾을 수도 있습니다 ssh
. man ssh
설명하다:
-W
주인 :포트- 클라이언트의 표준 입력 및 출력을 다음으로 전달하도록 요청합니다.주인존재하다포트안전한 통과를 통해-N
,-T
,ExitOnForwardFailure
및 을 의미합니다ClearAllForwardings
.프로토콜 버전 2에서만 사용 가능