在Netcat中一次接收多个文件而不覆盖最后一个文件


0

1台机器侦听(linux),而多个客户机(Windows)在同一个侦听端口上向其发送文件。 Netcat使用-k标记以串行方式接收文件。

Listening machine: 
  nc -lp PORT -k > fileX
Clients: 
  nc IP PORT < file??

我想要的是从多个源接收多个文件,而不会相互覆盖。

请查看以前的命令。侦听器总是将输出写入文件,这会覆盖以前客户端的文件。

我想以某种方式能够为每个不同的客户端更改输出文件名。客户端能否以某种方式通过netcat发送字符串“file10”,因此告诉监听器输出到&gt; file10?

谢谢。

编辑: 想出了一个主意:

这是通过脚本自动执行的:

  1. 首先,监听器将输出文件设置为file.txt。 (nc -lp PORT&gt; file.txt)

  2. 客户端通过netcat发送字符串(例如“file123”)。 (这将是将来发送的文件的文件名。)

  3. 监听器写入file.txt,然后读取file.txt,并启动一个新的netcat监听器,输出文件&gt; file123

  4. 最后,客户端发送数据。

Answers:


0

这是另一个答案 讨论了自定义协议/设置的重点。我不会重复。我假设你的 拥有 解决方案就是你想要的。

nc -k 不是从“多个来源”接收“多个文件”的最佳工具,因为它只会在当前连接终止后才会侦听另一个连接。这意味着它将逐个接收多个文件,而不是并行接收。你的“多个来源”会相互阻挡。

socatreuseaddrfork 可能更好。

作为一个概念证明,让我们创造(在一个 又脏又脏 方式)我们的自定义协议。文件将作为包含以下内容的流传输:

  1. 接收方使用的文件名或路径(没有换行符);
  2. 单线换行( \n,LF,0x0a)作为分隔符;
  3. 二进制数据;
  4. EOF。

这是接收命令:

socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && cat >"$f"'

(编辑)这是剥离尾随的通用接收命令 \r (如果有的话)来自文件名(对于不完全符合协议的Windows客户端非常有用):

socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && f="${f%$(printf "\r")}" && cat >"$f"'

(编辑在这里结束)。

要发送文件:

(echo "The new name.foo" && cat "./the file to send.bar") > /dev/tcp/192.168.22.33/50011

笔记:

  • 50011 是一个TCP端口号,你可以选择自己的;
  • 192.168.22.33 是服务器的地址,更改它以符合您的设置;
  • 我用了 /dev/tcp/…/… 在Bash中工作的语法,管道到 nc 如果你想要/需要;
  • 文件名冲突仍然是问题,你需要一些脚本逻辑(而不是普通的 cat 解决它们;
  • SYSTEM 有其局限性(见 man socat );而不是将一些大型脚本体传递给它,将脚本写入文件并运行该文件;你也可以调查一下 EXEC;
  • 我们的协议(快速和脏)不会为服务器提供任何方式向客户端报告错误(如果有)或成功。

我用Debian接收器和Ubuntu发送器测试了这个。有一次,三个不同的连接从两个不同的IP地址传输三个不同的文件。完成所有转移后, md5sum 用于验证副本是否( 最有可能的 )与原件相同;他们是。


尼斯。如果客户端是Windows,我该如何发送文件?我尝试过powershell ..这是我得到了多远。 $ file = Get-Content ./somefile; echo“filename10”$ file | ./Netcat32 IP PORT。在linux机器上,我得到一个名为“'filename10'$'\ r''的文件(没有双引号)。文件内容正确但文件名已关闭。
MyWays

@MyWays我无法帮助你使用这个PowerShell代码(我是一个Linux人,我从未使用过PowerShell),但问题看起来像是由于 Windows和Unix中不同的行结尾
Kamil Maciorowski

@MyWays虽然之间有正确的代码 readcat 在Linux中可以解决这个问题。给我几分钟。
Kamil Maciorowski

@MyWays我的回答现在解决了这个问题。
Kamil Maciorowski

这是一些巫术。
MyWays

0

不,普通的netcat没有这样的特殊命令。它不解释它的输入,实际上它甚至不知道它的输入/输出是一个文件:重定向是由你完成的,而netcat并不打算看。

所以你需要一个额外的程序 解释收到的输入并自行打开输出文件。最后,你几乎会重新发明 tar。 (要么 cpio,或十几种其他类似的格式。)

[client] tar -cf - fileXYZ | nc <ip> <port>
[server] nc -lp <port> | tar -xvf -

有GNU的Windows版本 柏油 和Win10最近开始包括 让bsdtar 。如果两者都不可用,则必须创建自己的协议 - 例如发送文件名作为第一行,然后是数据;您需要为发件人编写自定义代码 对于接收器。

将括号中的多个命令分组为单个管道单元将有助于:

[client] (echo fileXYZ && type fileXYZ) | nc <ip> <port>
[server] nc -lp <port> | (read name; name=${name##*/}; name=${name%$'\r'}; cat > "$name")

但相反,我会在Linux机器上设置Samba并配置公共共享,以便客户可以简单地进行 copy fileXYZ \\<ip>\incoming\fileXYZ


“......创建自己的一些协议” - OP的缺口是MyWays。 :d
Kamil Maciorowski

@grawity谢谢你的回答。我会尽力。请再次阅读我的回答,因为我已经添加了一个想法并告诉我你的想法是什么?
MyWays

@KamilMaciorowski哈哈,那是什么意思?
MyWays

@MyWays你可以重新发明 tar 你的方式。
Kamil Maciorowski

它的方式或tarway,jk。我的编辑是个好主意吗?
MyWays
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.