Предотвратить кражу stdin сокатом

Я использую socat для быстрого захвата баннера telnet, например:

for ip in $list
do
    socat -T 1 - tcp:$ip:23 &
done

Он перебирает список указанных IP-адресов и для каждого из них вызывает socat, который связывает TCP socket на порту 23 с stdin (-) и отключается через одну секунду, работая в фоновом режиме. Проблема в том, что все фоновые процессы используют один и тот же stdin, поэтому все они будут зависать. Я пробовал вариант readline, а также подавлял stdin с помощью </dev/null, но безрезультатно. Например, netcat ведет себя точно так же, если только -d не указано для игнорирования ввода.

Строка socat, которую я указал, является частью скрипта, который используется для других целей, поэтому было бы неплохо, если бы проблему можно было решить, не прибегая к masscan, nmap или netcat. Спасибо.


person Ulrik    schedule 03.10.2015    source источник
comment
Я действительно не знаю, чего вы пытаетесь достичь, но поможет ли это, если вы замените - заменой процесса, которая ничего не делает? это: socat -T 1 <(:) tcp:$ip:23 &.   -  person gniourf_gniourf    schedule 04.10.2015
comment
Вы указали < /dev/null перед &, верно?   -  person that other guy    schedule 04.10.2015
comment
socat должно быть разрешено время ожидания через одну секунду. Если echo -n | или </dev/null предоставляются с одного конца конвейера или с другого, он ничего не отправляет и немедленно завершает сеанс, иногда даже до отображения баннера. При наличии <(:) socat жалуется на то, что /dev/fd/.. является файловой системой только для чтения.   -  person Ulrik    schedule 04.10.2015


Ответы (1)


Должен быть лучший способ сделать это, но пока я его не нашел.

Проблема с echo -n | заключается в том, что когда эхо завершится, на socat будет отправлен сигнал sigpipe.

поэтому, чтобы обойти это, я сделал

пока верно; спать 10 ; сделано | сокат -T 1 - tcp:$ip:23

это дает трубу и не заканчивается.

person John Kearney    schedule 05.03.2020