收到响应后如何通过 netcat 发送文件?

How to send a file over netcat after receiving a response?

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

如果我这样做:

cat file.txt | netcat 192.168.121.15

netcat(看起来)只是在传输文件后关闭连接。上面引用的 post 暗示的是:

cat file.txt - | netcat 192.168.121.15

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

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

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

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

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

netcat 是一个很好的工具,可用于您尝试打​​开到另一个端口的原始管道。我认为对您来说更好的问题是,cat 的管道输出是正确的工具吗?号

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

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

你可以使用 read for instance, or expect.

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

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

我没有写一个监听服务器来处理通过 netcat 发送的多个文件,我只是假设你有那个工作,但我可以从客户端模拟一些编程交互并做手动服务器。

我的虚拟 "client"/"server" 互动是基于 seting up 2 ncat sessions to talk to each other

的这个有趣的 activity
  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. 我开始我的"server"ncat -l -p 1337

  3. 我开始我的 "client" 由交互式脚本控制 ncat localhost 1337 -e ./interact.sh
  4. 然后我手动操作 "server"(因为 ncat 没有清楚地显示 I vs O 我已经用 i: 标记输入并用 [=34= 输出]):

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