如何在收到回复后通过netcat发送文件?

时间:2017-08-15 20:53:27

标签: bash file tar netcat

我基本上想要做this question中描述的内容,而不是来自stdin的后续数据来自另一个文件。

如果我这样做:

cat file.txt | netcat 192.168.121.15

netcat(似乎)只是在传输文件后关闭连接。上面引用的帖子表明的是:

cat file.txt - | netcat 192.168.121.15

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

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

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

1 个答案:

答案 0 :(得分:2)

TL; DR:是的,但是您需要比管道cat

更聪明的东西

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

netcat是一个很好的工具,可以帮助您打开原始管道到另一个端口。我认为一个更好的问题是,cat管道输出是正确的工具吗?否。

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

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

您可以使用readexpect

如果您愿意稍微扩展您的工具箱,我建议使用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. 控制
  5. 我操作"服务器"手动(因为ncat没有清楚地显示我vs O我用i:表示输入并用o:输出):

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