8

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

nc host port < textfile
cat textfile | nc host port

我尝试过使用tailhead,但结果相同:整个文件作为唯一行发送。服务器正在侦听特定的守护进程以接收数据日志信息。

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

我怎样才能做到这一点?

4

4 回答 4

13

你必须使用netcat吗?

cat textfile > /dev/tcp/HOST/PORT

也可以达到您的目的,至少使用 bash。


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

尝试

while read x; do echo "$x" | nc host port; done < textfile
于 2012-12-20T11:31:27.533 回答
11

OP 不清楚他们是否需要为每条线路建立新的连接。但根据OP 的评论,我认为他们的需求与我的不同。但是,Google 会派人来这里满足我的需求,所以我将在这里放置这个替代方案。

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

如果我尝试将电子邮件发送给nc我,则会收到错误消息,因为服务器无法与我进行“对话”。

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

现在,如果我将 aslowcat插入管道,我会收到电子邮件。

$ 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
于 2017-10-27T06:33:35.373 回答
4

使用 stdbuf -oL 调整标准输出流缓冲。如果 MODE 为“L”,则相应的流将被行缓冲:

stdbuf -oL cat textfile | nc host port
于 2016-03-08T02:06:58.597 回答
2

只是在这里猜测,但您可能 CR-NL 行尾:

sed $'s/$/\r/' textfile | nc host port
于 2012-12-20T15:05:19.167 回答