【问题标题】:Send text file, line by line, with netcat使用 netcat 逐行发送文本文件
【发布时间】:2012-12-07 20:01:15
【问题描述】:

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

nc host port < textfile
cat textfile | nc host port

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

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

我该怎么做?

【问题讨论】:

  • 你想用新行分隔行吗?
  • 您的意思是要为每行打开一个单独的连接吗?
  • 也许服务器的换行约定与 Unix 不同?如果是这样,您需要将换行符转换为服务器期望的代码。
  • 我希望 netcat 按行发送文件,而不是在唯一文件中。但正如@Barmar 所说,可能是 EoL。
  • TCP 是一种字节流传输,它没有为应用程序提供查看传输的块的方法。可以任意合并分割线。

标签: shell unix netcat


【解决方案1】:

你必须使用 netcat 吗?

cat textfile > /dev/tcp/HOST/PORT

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


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

试试

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

【讨论】:

  • 我做了一个小脚本来执行while循环,所以我可以将文件名和主机作为参数传递。谢谢!
  • 第一个 cat 文本文件 > /dev/tcp/HOST/PORT 非常酷。从man bash 来看,这些类型的文件要么实际由操作系统处理,要么 bash 模拟它们。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    stdbuf -oL cat textfile | nc host port
    

    【讨论】:

      【解决方案4】:

      OP 不清楚他们是否需要为每条线路建立一个新连接。但是基于OP's comment here,我认为他们的需求与我的不同。但是,Google 会派人来这里满足我的需求,所以我将把这个替代方案放在这里。

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

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

      $ 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
      

      【讨论】:

      • 我刚投了反对票,没有任何评论。我在传播错误信息吗?肯定不是。如果您觉得足以掩盖答案,请留下一些反馈。
      • 请我点个赞,我也有同样的问题(但想发送 UDP),你的慢猫想法正是我所需要的。
      • 为我所需要的工作;我想发送一个存储在文件中的 HTTP 请求。只是将它连接到 netcat 套接字是行不通的,我不会得到任何响应。这对我来说完美无缺。
      • @varfirstName 是的,有很多“对话式”协议,当他们没有机会发言时,这些协议的许多实现都无法处理。这对所有这些人都很有用。
      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 2013-10-16
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多