【问题标题】:How to send a file over netcat after receiving a response?收到响应后如何通过 netcat 发送文件?
【发布时间】:2017-08-15 20:53:27
【问题描述】:

我基本上想做this question 中描述的事情,但不是来自标准输入的后续数据,而是来自另一个文件。

如果我这样做:

cat file.txt | netcat 192.168.121.15

netcat(看起来)只是在传输文件后关闭连接。上面引用的帖子建议是这样的:

cat file.txt - | netcat 192.168.121.15

但是,这只是保持连接打开以接收来自标准输入的输入,而我希望能够在从服务器收到关于第一个文件的响应后发送第二个文件。

因此,我不能一次发送一堆文件,所以the answer to this question 也不是我要寻找的,因为我无法更改服务器以使用 tar。

netcat 甚至可以做到这一点,还是我应该使用其他一些工具?

【问题讨论】:

标签: bash file tar netcat


【解决方案1】:

TL;DR:是的,但你需要比管道cat更智能的东西

cat 简单地连接给它的所有文件并将它们转储到stdout- 代表标准输入,因此您引用的 Q/A 对的工作方式是将标准输入连接到文件。

netcat 是一个很好的工具,可以用来打开通往另一个端口的原始管道。我认为对您来说更好的问题是,cat 的管道输出是正确的工具吗?没有。

仅使用cat ... | netcat ... 的问题在于它是一种单向交易。 cat 的输出作为netcat 的输入,但是输出会到stdout,管道不是双向的,需要交互。

如果您想根据服务器通过 netcat 管道的响应以交互方式执行操作,有很多方法可以以编程方式与管道交互。

例如,您可以使用read,或expect

如果你愿意稍微扩展你的工具箱,我建议使用ncat,它是netcat 的更现代的实现,并且有一个方便的选项-e,它允许将命令或脚本附加到netcat 管道。如果您无法使用netcat-e,您可能需要了解一些有关命名管道和I/O Redirection 的知识才能获得相同的效果。

我想在写这个答案之前测试一些这些东西,请参阅下面的测试/示例

我没有编写一个侦听服务器来处理通过netcat 发送的多个文件,我只是假设您可以正常工作,但是我可以从客户端模拟一些编程交互并手动执行服务器.

我这里的虚拟“客户端”/“服务器”交互是基于seting up 2 ncat sessions to talk to each other这个有趣的活动

  1. 我编写了这个简单的交互式脚本:

    #!/bin/bash
    i=0
    while true; do
      read line
      if [[ $line == "goose" ]]; then
        echo "zoom"
        exit 0
      else
        i=$(expr $i + 1)
        echo "$i ..."
      fi
    done
    
  2. 我启动我的“服务器”ncat -l -p 1337

  3. 我启动了由交互式脚本ncat localhost 1337 -e ./interact.sh控制的“客户端”
  4. 我手动操作“服务器”(因为 ncat 没有清楚地显示 I 与 O,所以我用 i: 表示输入并用 o: 表示输出):

    i:duck
    o:1 ...
    i:duck
    o:2 ...
    i:duck
    o:3 ...
    i:goose
    o:zoom
    

【讨论】:

  • 哇!!太感谢了!!由于某种原因,这不适用于我的实际服务器,但它完全适用于通过 ncat 进行的测试,所以大概我面临着其他一些奇怪的问题。
  • 使用“睡眠”而不是“阅读行”有效。不知道为什么它无法读取一行...
  • 我在测试期间注意到,在 while 循环内读取并不能很好地处理没有输入的情况。这就是 expect 可能派上用场的地方,或者正如你所发现的,睡觉然后阅读
  • 应该是得到了输入,这就是我困惑的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2016-08-01
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多