Как отправить файл через netcat после получения ответа?

Я в основном хочу делать то, что описано в этот вопрос, но вместо последующих данных, поступающих из стандартного ввода, должны поступать из другого файла.

Если я сделаю это:

cat file.txt | netcat 192.168.121.15

netcat (кажется) просто закрывает соединение после передачи файла. В упомянутом выше сообщении предлагается следующее:

cat file.txt - | netcat 192.168.121.15

Однако это просто сохраняет соединение открытым для ввода из stdin, тогда как я хочу иметь возможность отправить второй файл после получения ответа о первом файле обратно с сервера.

Поэтому я не могу просто отправить сразу несколько файлов, поэтому ответ на этот вопрос - это не то, что я ищу, потому что я не могу изменить сервер для использования tar.

Может ли netcat это сделать, или я должен использовать какой-нибудь другой инструмент?


person user124384    schedule 15.08.2017    source источник
comment
Это наверняка похоже на проблему XY, решение которой вы уже решили. netcat, хотя на самом деле это не инструмент для передачи файлов.   -  person Andrew Henle    schedule 16.08.2017
comment
Я думал, что нас поощряют сказать то, что мы пробовали (mattgemmell.com/what-have-you- попробовал), чтобы попытаться решить проблему.   -  person user124384    schedule 16.08.2017


Ответы (1)


TL; DR: Да, но вам понадобится что-то более умное, чем подключенный cat

cat просто объединяет все файлы, предоставленные ему, и выгружает их в stdout, - представляет стандартный ввод, так что способ работы указанной пары Q / A заключался в объединении стандартного ввода-вывода с файлом.

netcat - прекрасный инструмент для того, что вы пытаетесь сделать, например, открыть необработанный канал для другого порта. Думаю, вам лучше задать вопрос: "Правильный ли инструмент" cat выводит вывод по конвейеру? Нет.

Проблема с простым использованием cat ... | netcat ... в том, что это односторонняя сделка. Выход cat используется как вход для netcat, но выход будет идти в stdout, канал не двусторонний, вам нужна интерактивность.

Если вы хотите интерактивно выполнять действия на основе ответов сервера по каналу netcat, существует целый ряд способов программного взаимодействия с каналом.

Вы можете использовать read например, или expect.

Если вы хотите немного расширить свой ящик с инструментами, я предлагаю использовать ncat, который является более современной реализацией netcat и имеет удобную опцию -e, которая позволяет прикреплять команду или скрипт к netcat каналу. Если вы не можете достать netcat с -e, вам может потребоваться кое-что узнать об именованных каналах и Перенаправление ввода-вывода, чтобы получить тот же эффект.

Я хотел протестировать некоторые из этих вещей, прежде чем писать этот ответ, см. ниже тесты / примеры

Я не писал сервер прослушивания, который обрабатывал несколько файлов, отправленных через netcat, я просто предполагаю, что у вас это работает, но я могу смоделировать некоторое программное взаимодействие со стороны клиента и сделать сервер вручную.

Мое фиктивное взаимодействие "клиент" / "сервер" здесь основано на этой забавной деятельности по установке 2 сеанса ncat для общения друг с другом

  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 vs O, я пометил ввод с помощью i:, а вывод с помощью o:):

    i:duck
    o:1 ...
    i:duck
    o:2 ...
    i:duck
    o:3 ...
    i:goose
    o:zoom
    
person Will Barnwell    schedule 15.08.2017
comment
Вот это да!! Большое спасибо!! По какой-то причине это не работает с моим реальным сервером, но полностью работает с тестированием через ncat, поэтому, по-видимому, я столкнулся с другой странной проблемой. - person user124384; 16.08.2017
comment
Использование сна вместо строки чтения сработало. Не уверен, почему он не может прочитать строку ... - person user124384; 16.08.2017
comment
Во время тестирования я заметил, что чтение внутри цикла while не работает без ввода. Здесь может пригодиться ожидание, или, как вы обнаружили, сон, а затем чтение - person Will Barnwell; 16.08.2017
comment
Он должен был получить ввод, поэтому я был сбит с толку. - person user124384; 16.08.2017