文件传输完成后如何让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"

读取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 来执行此操作,而不是使用ncSSH:

cat filename | ssh user@somehost receive.sh

相关内容