파일 전송이 완료된 후 Netcat이 명령을 실행하도록 하려면 어떻게 해야 합니까?

파일 전송이 완료된 후 Netcat이 명령을 실행하도록 하려면 어떻게 해야 합니까?

서버의 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"

catEOF까지 입력을 읽고 파일을 저장합니다. 파일을 받은 후 다음 내용이 실행됩니다. 여기에서 스크립트는 수신한 데이터의 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를 사용하는 대신 ncSSH를 사용하여 이 작업을 수행할 수 있습니다.

cat filename | ssh user@somehost receive.sh

관련 정보