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

Мне нужно отправить много сообщений через netcat или что-то подобное. Проблема в том, что когда я запускаю echo "something" | netcat ip port, соединение продолжает открываться после того, как я получил ответ. На самом деле соединение продолжает открываться в ожидании нового ввода. Однако мне нужно, чтобы соединение закрылось после получения ответа. Смотри, мой сценарий в основном таков:

#!/bin/bash
i=1
while [ $i -ne 10000 ];do
    sed -n $[i]p wordlist | netcat localhost 30002 >> result
    i=$[$i+1]
done

Если я смогу закрыть соединение после вывода ответа в результате, все будет работать нормально. Я знаю, что есть опция -w "x", которая закрывает соединение через "x" секунд, но минимальное значение для "x" равно 1, а 1 больше, чем я могу ждать, мне нужно закрыть соединение как можно скорее .


person Lucas Peixoto    schedule 18.01.2019    source источник


Ответы (2)


К сожалению, флаг -q у меня не сработал. Я использую «OpenBSD netcat (Debian patchlevel 1.187-1ubuntu0.1)», и хотя в руководстве отображается флаг -q, он не работает, как указано в ответе cnicutar.

Поэтому мой обходной путь был:

#!/bin/sh

# POSIX COMPLIANT

HOST="localhost"
PORT=30002

scan () {
    # Ensuring there is no file named msg
    rm msg

    # While msg file doesn't exist or is empty, do
    while [ ! -s msg ]; do
        # Remove instruction from within the loop
        rm msg

        # Append the received messages to msg file, and put the process in the background
        echo "$HOST $PORT" | xargs nc >> msg &

        # If the file exists and is not empty, return, we received the message
        [ -s msg ] && return;

        # A small timeout.. doing some tests I noticed that a timeout of zero sometimes didn't work to catch the message
        # Maybe nc needs a small time to receive everything. You might want to test and increase or decrease this timeout if needed.
        sleep 0.1

        # This script will be spawning a lot of nc process, to kill it before the loop runs again
        pkill -x nc
    done
} 2> /dev/null 

scan

# The function returned, so cat the file
cat msg

# make sure nc is killed
pkill -x nc > /dev/null 2>&1
rm msg
person Teodoro    schedule 27.01.2020
comment
Удивительный ответ. Именно то, что я искал. - person robe007; 17.11.2020

Вам нужен переключатель -q. Если указать:

netcat -q 0 localhost 30002

netcat немедленно выйдет.

person cnicutar    schedule 03.02.2019