Как закрыть сервер netcat через n секунд

float=$( openstack floating ip list -c 'Floating IP Address' -f value )

Это подстановка командвнутри обычного присвоения переменной, а не присвоение массива. Все назначения составного массива имеют форму x=( ... ), как вы использовали ниже. Здесь нет подоболочки (кроме краткого контекста выполнения подставляемой команды).

Когда вы используете подстановку команд, она ведет себя так же, как переменная с этим содержимым в этой позиции, и аналогично с float=$xздесь, а также с ls $ xили foo=($x). Разбиение словвыполняется по результату расширения, которое разделяет значение на отдельные аргументы по любому символу в переменной IFS.

Вы можете подавить разделение слов, заключив в кавычки расширение "$(...)".

Если вы хотите создать массив разделенных слов, вам нужно обадля создания массива и разделения слов: это означает присвоение массива foo=(...)и подстановка параметра или команды $... в сочетании, как в вашем втором случае:

float=( $( openstack floating ip list -c 'Floating IP Address' -f value ) )

The float=(...)создает массив, а элементы происходят из-за разделения слов, выполняемого во время подстановки команды $(...).


Что может сбивать с толку, так это то, что Bash автоматически преобразует немассивы в одноэлементные массивы, когда вы используете их как единое целое, поэтому похоже, что вы получили массив, но из одного элемента.

echo ${float[0]}
echo ${#float[@]}

Это очень тонко задокументировано:

Любая ссылка на переменную с допустимым нижним индексом допустима, и bash при необходимости создаст массив.

Вы увидите это более четко, если воспользуетесь другим индексом:

float[1]=abc
echo ${#float[@]} # => 2

Процесс преобразования просто использует существующее значение переменной, если оно есть, в качестве элемента с индексом 0 в массиве.

1
05.01.2016, 16:02
3 ответа

Из-за документации:The -w flag has no effect on the -l option, i.e. nc will listen forever for a connection, with or without the -w flag

Пробовал ncncatsocat, никто не может установить таймаут для режима сервера.

Насколько мне известно, только busybox ncможет следовать за опцией -wв режиме сервера.

Таким образом, вам нужно скачать busybox, скомпилированный с опцией CONFIG_NC_SERVER=y, или скомпилировать его самостоятельно.

Чтобы ты мог

$busybox nc -w 10 -l -p 9999

Но Busybox моей системы не компилировался с параметром CONFIG_NC_SERVER=y, и я не хочу его компилировать. Поэтому я использую это решение:

portnum=9999
(sleep 10 ;echo "T" | nc -w 1 127.0.0.1 $portnum) | nc -N -l -p $portnum 

Через 10 секунд отправьте «T» на локальный хост :9999

Полный код

#!/bin/sh
portnum=9999
testmsg="Hello_World"
if [ "$( (sleep 10 ;echo "T" | nc -w 1 127.0.0.1 $portnum) | nc -N -l -p $portnum )" = $testmsg ]; then
  echo "Test pass"
else
  echo "Test not pass"
fi

Если сервер получил Hello_Worldчерез 10 секунд, он напечатает Test pass. В противном случае выведитеTest not pass

Вы можете попробовать открыть другую консоль и ввести

echo "Hello_World" | nc -w 1 127.0.0.1 9999

, чтобы проверить это.

2
27.01.2020, 23:20

Использование тайм-аута bash:

$ timeout 3s nc -l -p 2000
2
27.01.2020, 23:20

Как заявил peterph , тайм-аут(-w)при прослушивании(-l)соединений работает (только )с традиционными ncреализациями.

В Ubuntu такую ​​реализацию можно установить с помощью apt install netcat-traditionalи вызвать с помощью nc.traditional.

1
30.06.2021, 11:31

Теги

Похожие вопросы