이 답변에서는 대화형 프로그램의 표준 입력을 구분 기호와 연결하여 구분 기호를 사용하여 대화형 프로그램과 상호 작용하는 방법을 설명합니다.
https://stackoverflow.com/questions/21130757/send-commands-to-socket-using-netcat
"아 파일!"이라고 생각했기 때문에 프로세스 교체를 사용할 수 있습니다!
그래서 나는 다음을 시도했습니다.
nc -lvkp 8000 <(echo "test")
그런 다음 오류가 발생했습니다.
Ncat: Could not resolve hostname "/dev/fd/63
그럼 파일이군요! 그러나 netcat은 그것을 이해하지 못합니다(내가 작성한 일반 파일에서는 그것을 이해합니다 /tmp/commands.txt
). netcat이 그것을 이해하지 못한다면 나는 정말로 상관하지 않습니다.
제가 정말 염두에 두는 점은 제가 올바르게 이해했다면 heredoc도 임시 파일이라고 생각한다는 것입니다. 그러나 분명히 netcat은 이것을 이해합니다. 따라서 이것 과 구분 기호 /dev/fd/63
사이에는 차이가 있어야 합니다 .
그렇다면 차이점은 무엇입니까?
나는 그것의 일부가 /dev/fd/63
영구적이지 않거나 dev/fd
부분적으로 다르다고 생각합니다. 그러다가 구분 기호가 거기가 아니라 다른 곳에 저장되어 있다고 생각했습니다.
편집: 은 echo "test"
"인쇄 단어 테스트"를 의미합니다.
답변1
여기 문서는표준 리디렉션, 프로세스 대체는 표준이 아니지만(따라서 모든 쉘이 이를 지원하는 것은 아님) 리디렉션도 아닙니다.
명시적 프로세스 교체주문 실행특정 경로 이름에서 읽을 수 있고 여기에 문서화된 출력을 생성합니다.텍스트 파일 만들기즉시 리디렉션하세요. 여기 문서가능한이는 임시 파일에 쓰는 방법으로 수행할 수 있지만 명명된 파이프나 유사한 항목에 쓰는 방법으로도 수행할 수 있습니다.
호출은 nc
프로세스 대체 결과를 표준 입력 스트림으로 전달하는 것이 아니라 nc
명령줄의 파일 이름으로 전달합니다. echo
프로세스 대체를 사용하여 표준 입력의 출력을 전달 하려면 다음을 사용하십시오.
nc -lvkp 8000 < <( echo "test" )
<
첫 번째 경로가 프로세스 대체에 의해 생성된 경로 이름에서 어떻게 리디렉션되는지 확인하세요 .
이 문서를 사용하여 작성하게 됩니다.
nc -lvkp 8000 <<'END'
test
END
여기 문서에서 특정 경로 이름을 참조하지 않고 리디렉션을 수행하는 방법에 유의하세요. 또한 echo
리디렉션된 문서의 텍스트를 생성하기 위해 해당 명령을 사용하지 않는 방법에 유의하세요 .
답변2
여기에 있는 문서는 리디렉션입니다. 쉘은 텍스트를 어딘가에 저장한 다음 명령 입력으로 리디렉션합니다. (정확한 메커니즘은 아닐 수도 있지만, 시스템을 생각하기에는 충분합니다.)
프로세스 대체는 명령의 입력 또는 출력에 대한 경로를 제공합니다.~에프로세스 대체. 그러나 해당 명령 이외의 다른 항목에는 자체적으로 리디렉션을 적용하지 않습니다. 리디렉션 기호( >
in >(...)
또는 <
in <(...)
)로 인해 다르게 생각하게 되면 내부에 있는 모든 것에 적용된다고 생각하십시오. >
프로세스 대체를 가리키는 것은 다음에 적용됩니다.입력하다내부 명령은 <
출력에도 동일하게 적용됨을 나타냅니다. 그들은 아무것도 영향을 미치지 않습니다외부.
따라서:
nc 192.168.1.186 9760 <<END
command1
command2
END
nc
입력이 리디렉션되지만
nc -lvkp 8000 <(echo "test")
nc
입력은아니요리디렉션. ( echo
그러나 의 출력은 프로세스 대체에서 읽은 내용으로 파이프됩니다.) nc
추가 인수를 얻습니다.
리디렉션을 직접 적용해야 합니다.
nc -lvkp 8000 < <(echo "test")
답변3
이는 차이점을 강조합니다. wc는 두 경우 모두 동일한 데이터를 봅니다. 먼저 명령줄에서 인수(임시 파일 이름)를 가져옵니다. 두 번째 예에서 파일 이름은 쉘 리디렉션에 의해 사용되고 wc는 인수를 얻지 못하며 기본적으로 stdin을 읽습니다.
Paul--) wc <( echo one two three )
1 3 14 /dev/fd/63
Paul--) wc < <( echo one two three )
1 3 14
Paul--)
답변4
저는 몇 가지 좋은 답변을 읽었지만 제가 작성하려는 답변만큼 간단하지는 않습니다. 따라서 다음과 같습니다.
- 여기 문서는
<<
표준에 연결됩니다. - 대체를 처리하려면
<(...)
"file"에 연결한 다음 파일 이름을 바꾸십시오.
참고: 파일이라고 하면 Unix 방식으로 사용하는 것입니다. 반드시 디스크에 파일이 있는 것은 아닙니다. 이는 명명된 파이프, 익명 파이프, net-socket, unix-socket 등의 디렉터리일 수 있습니다. 이 경우에는 (익명화되지 않음: 해당 프로세스에만 표시되는 파일 이름이 있음) 연결 대상) 익명 파이프가 됩니다. .