使用netcat逐行发送文本文件

11
我正在尝试使用以下命令逐行发送文件:

nc host port < textfile
cat textfile | nc host port

我尝试使用tail和head,但结果相同:整个文件被作为一行发送。 服务器正在使用特定的守护进程监听接收数据日志信息。
我想逐行发送和接收数据,而不是一次性发送整个文件。
如何实现这一点?

你想要这些行用换行符分隔吗? - Shamis Shukoor
1
你的意思是每行都要打开一个单独的连接吗? - Fred Foo
也许服务器的换行约定与Unix不同?如果是这样,您需要将换行符转换为服务器所期望的代码。 - Barmar
我希望netcat按行发送文件,而不是作为一个唯一的文件发送。但可能是EoL,正如@Barmar所说。 - Possa
TCP是一种字节流传输协议,它不提供应用程序查看已传输块的方法。它可以任意合并和拆分行。 - Barmar
这不是 EoL 问题...在将其发送到 netcat 之前,我必须将该行分割:读取行 -> netcat;读取行 -> netcat... - Possa
4个回答

15

关于是否需要针对每行建立一个新连接,OP的问题不太清楚。但是根据OP在这里的评论,我认为他们的需求与我的不同。然而,谷歌会将有相似需求的人引导到这里,所以我会在这里提供另一种选择。

我需要通过单一连接逐行发送文件。基本上,这就是一个“慢”的cat。(这将是许多“交流”协议的共同需求。)

如果我尝试使用nc将电子邮件消息传送给cat,我会因为服务器无法与我进行“交流”而出现错误。

$ cat email_msg.txt | nc localhost 25
554 SMTP synchronization error

现在,如果我将一个slowcat插入管道中,就可以收到电子邮件。

$ function slowcat(){ while read; do sleep .05; echo "$REPLY"; done; }
$ cat email_msg.txt | slowcat | nc localhost 25
220 et3 ESMTP Exim 4.89 Fri, 27 Oct 2017 06:18:14 +0000
250 et3 Hello localhost [::1]
250 OK
250 Accepted
354 Enter message, ending with "." on a line by itself
250 OK id=1e7xyA-0000m6-VR
221 et3 closing connection

email_msg.txt看起来像这样:

$ cat email_msg.txt
HELO localhost
MAIL FROM:<system@example.com>
RCPT TO:<bbronosky@example.com>
DATA
From: [IES] <system@example.com>
To: <bbronosky@example.com>
Date: Fri, 27 Oct 2017 06:14:11 +0000
Subject: Test Message

Hi there! This is supposed to be a real email...

Have a good day!
-- System


.
QUIT

1
我刚刚收到了一个没有评论的踩票。我是在传播错误信息吗?当然不是。如果你有足够强烈的感受来埋掉一个答案,请留下一些反馈。 - Bruno Bronosky
1
我给你点个赞,我之前也遇到了同样的问题(但是我想发送UDP),你的slowcat想法正是我所需要的。 - Guntram Blohm
1
对我所需的工作很好;我想发送存储在文件中的HTTP请求。只是将其cat到netcat套接字上不起作用,我将得不到响应。这对我来说完美无缺。 - var firstName
@varfirstName 是的,有许多协议是“对话式”的,而且其中许多实现在没有机会发言时无法处理。这对于所有这些都是有用的。 - Bruno Bronosky
1
一件美好的事物,网络陌生人,谢谢! - tony ennis

14

你必须使用netcat吗?

cat textfile > /dev/tcp/HOST/PORT

可以使用Bash实现你的目标。


我想逐行发送和接收,而不是一次性发送整个文件。

尝试:

while read x; do echo "$x" | nc host port; done < textfile

我写了一个小脚本,使用while循环,这样我就可以将文件名和主机作为参数传递。谢谢! - Possa
第一个猫文本文件 > /dev/tcp/HOST/PORT 非常酷。根据“man bash”的说明,这些类型的文件实际上是由操作系统处理的,或者是由bash模拟的。 - math2001

4

使用stdbuf -oL来调整标准输出流的缓冲。如果MODE是'L',则相应的流将是行缓冲:

stdbuf -oL cat textfile | nc host port

2

我猜想你可能是在使用CR-NL来结束每一行:

sed $'s/$/\r/' textfile | nc host port

1
有太多的编辑待处理,所以我只想说,根据nc OP和glenn使用的是哪个版本,他们可能根本不需要使用sed。在其中一个netcat(或者也许两个都有,我只有一个方便使用),有一个选项“-c”可以强制使用crlf行结尾。 - Chrstfer CB
1
这个答案毕竟已经有10年了。 - glenn jackman
1
这个答案毕竟已经有10年了。 - glenn jackman
当然,但作为一个声望较低的用户,我认为最好说我知道我本应该只建议编辑,但是不能。有很多旧的但偶尔更新的答案。虽然这不是非常受欢迎,但我喜欢netcat,所以想给它一些关注。 - Chrstfer CB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接