Sna*_*nar 5 scripting file-transfer netcat
我想让我的服务器上的 netcat 执行一个脚本,该脚本处理刚刚发送的文件,并将该脚本的输出作为对客户端的响应发送。我的做法是:
在接收站点上:
nc.traditional -l -p 2030 -e "./execute.sh" > file.iso
Run Code Online (Sandbox Code Playgroud)
在发送站点上:
cat file.iso - | nc.traditional -w 1 serverAddress 2030
Run Code Online (Sandbox Code Playgroud)
现在,接收站点在文件完全传输之前执行脚本,但将脚本的输出发送回发送站点,然后关闭连接。我希望接收站点在执行脚本之前等待文件完全传输。
您需要某种方式让接收端识别所传输文件的结尾。在发送端,通过cat file - | nc
管道的数据流不会在文件内容和用户在终端上键入的内容(cat -
读取终端)之间进行任何分离。另外,默认情况下,netcat 不会对其输入上的 EOF 做出反应,但我们可以使用-q
它来发送 EOF。
因此,接收脚本可能是这样的:
\n\n#!/bin/bash\nfilename=$1\ncat > "$filename"\n\nhash=$(shasum "$filename" |sed -e \'s/ .*//\')\nprintf "received file \\"%s\\" with SHA-1 hash %s\\n" "$filename" "$hash"\n
Run Code Online (Sandbox Code Playgroud)\n\n读取cat
输入直到 EOF,保存文件。接下来的内容都会在收到文件后执行。此处,脚本发回其收到的数据的 SHA-256 哈希值。
然后,在接收端运行:
\n\n$ nc.traditional -l -p 12345 -c "./receivefile.sh somefilename"\n
Run Code Online (Sandbox Code Playgroud)\n\n在发送端:
\n\n$ cat sourcefile | nc.traditional -q 9999 localhost 12345\nreceived file "somefilename" with SHA-1 hash 3e8a7989ab68c8ae4a9cb0d64de6b8e37a7a42e5\n
Run Code Online (Sandbox Code Playgroud)\n\n上面的脚本将文件名作为参数,因此我使用-c
代替-e
,但当然您也可以将 的输出重定向nc
到目标文件,就像您在问题中所做的那样。
如果您也想从发送端发送文件名,您可以在接收端执行以下操作:
\n\n#!/bin/bash\nread -r filename\n[[ $filename = */* ]] && exit 1 # exit if the filename contains slashes\ncat > "$filename"\necho "received $filename"\n
Run Code Online (Sandbox Code Playgroud)\n\n然后用 发送(echo filename; cat filename) | nc -q 9999 localhost 12345
。(在这里,您可能需要更加小心地使用远程提供的文件名。或者只使用专为文件传输而设计的文件名,例如scp
。)
nc
您可以使用 SSH 来执行此操作,而不是使用 SSH:
cat filename |\xc2\xa0ssh user@somehost receive.sh\n
Run Code Online (Sandbox Code Playgroud)\n