표준 입력 "건너뛰기" 프로세스?

표준 입력 "건너뛰기" 프로세스?

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'

stdinhopstdin을 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에서만 사용 가능

관련 정보