我想让我的服务器上的 netcat 执行一个脚本,该脚本适用于刚刚发送的文件,并将该脚本的输出作为对客户端的响应发送。我的做法是:
在接收站点上:
nc.traditional -l -p 2030 -e "./execute.sh" > file.iso
在发送站点上:
cat file.iso - | nc.traditional -w 1 serverAddress 2030
现在,接收站点在文件完全传输之前执行脚本,但将脚本的输出发送回发送站点,然后关闭连接。我希望接收站点等到文件完全传输后再执行脚本。
您需要某种方式让接收端识别传输文件的结尾。在
cat file - | nc
发送端,通过管道的数据流不会将文件内容与用户在终端上键入的任何内容分开(cat -
读取终端)。此外,默认情况下,netcat 不会对其输入的 EOF 做出反应,但我们可以使用-q
它来让它发送 EOF。所以,接收脚本可能是这样的:
cat
读取输入直到 EOF,保存文件。接下来的任何内容都在收到文件后执行。在这里,脚本发回它接收到的数据的 SHA-256 哈希值。然后,在接收端,运行:
在发送方:
上面的脚本将文件名作为参数,所以我使用
-c
了代替-e
,但当然你也可以将输出重定向nc
到目标文件,就像你在问题中所做的那样。如果你也想从发送端发送文件名,你可以在接收端做这样的事情:
然后发送
(echo filename; cat filename) | nc -q 9999 localhost 12345
。(您可能希望在此处对远程提供的文件名更加小心。或者只使用专为文件传输而设计的名称,例如scp
.)您可以使用 SSH 类似地执行此操作,而不是使用
nc
: