서버의 netcat이 방금 보낸 파일을 처리하는 스크립트를 실행하고 해당 스크립트의 출력을 클라이언트에 응답으로 보내길 원합니다. 내가 하는 일은:
수신 사이트에서:
nc.traditional -l -p 2030 -e "./execute.sh" > file.iso
전송 사이트에서:
cat file.iso - | nc.traditional -w 1 serverAddress 2030
이제 수신 사이트는 파일이 완전히 전송되기 전에 스크립트를 실행하지만 스크립트의 출력을 전송 사이트로 다시 보낸 다음 연결을 닫습니다. 수신 사이트에서 스크립트를 실행하기 전에 파일이 완전히 전송될 때까지 기다리기를 원합니다.
답변1
전송된 파일의 끝을 수신측에서 인식할 수 있는 방법이 필요합니다. 송신 측 에서 cat file - | nc
파이프를 통한 데이터 흐름은 파일 내용과 사용자가 터미널에 입력하는 내용( cat -
터미널 읽기)을 분리하지 않습니다. 또한 기본적으로 netcat은 입력 시 EOF에 반응하지 않지만 -q
이를 사용하여 EOF를 보낼 수 있습니다.
따라서 수신 스크립트는 다음과 같습니다.
#!/bin/bash
filename=$1
cat > "$filename"
hash=$(shasum "$filename" |sed -e 's/ .*//')
printf "received file \"%s\" with SHA-1 hash %s\n" "$filename" "$hash"
cat
EOF까지 입력을 읽고 파일을 저장합니다. 파일을 받은 후 다음 내용이 실행됩니다. 여기에서 스크립트는 수신한 데이터의 SHA-256 해시를 다시 보냅니다.
그런 다음 수신 측에서 다음을 실행합니다.
$ nc.traditional -l -p 12345 -c "./receivefile.sh somefilename"
송신 측에서:
$ cat sourcefile | nc.traditional -q 9999 localhost 12345
received file "somefilename" with SHA-1 hash 3e8a7989ab68c8ae4a9cb0d64de6b8e37a7a42e5
위의 스크립트는 파일 이름을 인수로 사용하므로 -c
대신 사용했지만 질문에서 했던 것처럼 -e
출력을 대상 파일로 리디렉션할 수도 있습니다 .nc
보내는 쪽에서도 파일 이름을 보내려면 받는 쪽에서 다음을 수행할 수 있습니다.
#!/bin/bash
read -r filename
[[ $filename = */* ]] && exit 1 # exit if the filename contains slashes
cat > "$filename"
echo "received $filename"
그런 다음 보내기를 사용하십시오 (echo filename; cat filename) | nc -q 9999 localhost 12345
. (여기서 원격으로 제공되는 파일 이름에 좀 더 주의를 기울이는 것이 좋습니다. 또는 파일 전송용으로 설계된 파일 이름을 사용하십시오(예 scp
: .)
SSH를 사용하는 대신 nc
SSH를 사용하여 이 작업을 수행할 수 있습니다.
cat filename | ssh user@somehost receive.sh