이 명령은 어떻게 작동하나요? mkfifo /tmp/f; 고양이 /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

이 명령은 어떻게 작동하나요? mkfifo /tmp/f; 고양이 /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

오늘 나는 nc매뉴얼 페이지를 읽다가 우연히 이 명령을 발견했습니다. 나는 그것을 알고 있다:

  • mkfifo /tmp/f명명된 파이프를 생성 중입니다./tmp/f.

  • cat /tmp/f해당 명명된 파이프에 기록된 모든 내용을 인쇄하고 의 출력은 cat /tmp/f다음으로 파이프됩니다./bin/sh

  • /bin/sh대화형으로 실행 중이며 stderr은 stdout으로 리디렉션됩니다.
  • `출력은 포트 1234에서 수신 대기 중인 nc로 파이프됩니다.
  • 출력은 마침내 명명된 파이프로 다시 리디렉션됩니다.

실행 시 해당 포트(예: 1234)의 원격 서버에 연결하면 셸 프롬프트가 열리고 클라이언트는 임의의 명령을 실행할 수 있습니다. 그런데 어떻게 그런 식으로 작동하나요?

답변1

이러한 명령은 IO 리디렉션 및 TTY에 연결될 때 기본적으로 활성화되는 sh 대화형 모드를 활용합니다.

cat은 FIFO에서 열린 상태로 유지됩니다. 그것이 첫 번째 단서입니다. sh가 실행될 때 수행하는 모든 작업은 stdout 및 strerr을 TTY로 보내는 것입니다. 대신 sh는 TTY에 연결되지 않습니다. 일반적으로 sh는 TTY에 연결되면 자동으로 대화형 모드로 전환되지만 -i 옵션이 추가되지 않기 때문입니다. 이는 새로운 명령에 대해 계속해서 입력을 받는다는 것을 의미합니다. 이러한 명령의 출력은 nc의 stdin으로 전달되고 nc의 출력(네트워크를 통해 들어오는 명령)은 FIFO로 리디렉션됩니다.

FIFO는 본질적으로 리디렉션 링을 완료하기 위해 명명된 파이프로 사용됩니다.

sh와 nc가 루프에서 서로 리디렉션되는 것으로 더 간단하게 생각할 수 있습니다. 나머지 명령은 단지 보풀입니다.

관련 정보