如何在不关闭连接的情况下通过“netcat”EOF“cat”?

如何在不关闭连接的情况下通过“netcat”EOF“cat”?

我遇到了一个问题,我有一个带有命令的 ncat 服务器ncat -l [port] -k -c "cat > foo; cat > bar"。当我通过 netcat 连接到该服务器时,它允许我写入文件foo,然后写入bar.问题是,当连接的客户端想要foo通过发送 a 来停止写入时^D,它会关闭客户端而不是继续写入到bar,因此bar永远不会被写入。我怎样才能绕过这个?有什么替代方法cat可以让我使用命令而不是 退出EOF

答案1

如果您想要做的是仅使用 1 个连接传输 2 个文件,则必须以某种方式使用标记来分隔数据流中的文件,因为文件结尾是长度为 0 的读取,netcat 将使用它来关闭插座。

Control-DControl-D可能是您可以在终端中键入的内容来表示文件结束,但它不会生成字符,它会以长度 0 终止读取。数据流中没有。

要简单地传输 2 个文件,您可以使用现有的打包命令,例如tar.用作nc -k -l 4458 -v -c 'tar xf - >&2'您的接收者和tar cf - foo bar发送者。 (由于文件名来自发件人,您必须信任发件人)。

或者,如果您的文件是简单文本,您可以引入特殊行来分隔这两个文件。例如,在发送方cat foo; echo bye; cat bar和接收方类似

nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'

这个 GNU awk 脚本将第一个文件名保存在变量中file,然后当它看到“bye”行时,它会更改为第二个文件名。

相关内容