понимание вещания netcat

Это просто следствие того, как определена грамматика. Из спецификации грамматики оболочки POSIX:

command          : simple_command
                 | compound_command
                 | compound_command redirect_list
                 | function_definition
                 ;

И:

simple_command   : cmd_prefix cmd_word cmd_suffix
                 | cmd_prefix cmd_word
                 | cmd_prefix
                 | cmd_name cmd_suffix
                 | cmd_name
                 ;
[...]
cmd_prefix       :            io_redirect
                 | cmd_prefix io_redirect
                 |            ASSIGNMENT_WORD
                 | cmd_prefix ASSIGNMENT_WORD
                 ;
cmd_suffix       :            io_redirect
                 | cmd_suffix io_redirect
                 |            WORD
                 | cmd_suffix WORD
                 ;

Как видите, для составных команд перенаправление разрешено только после , а для простых команд оно разрешено и раньше. Итак, когда оболочка видит foo, fooобрабатывается как простая команда, а не как составная команда, а whileбольше не рассматривается как ключевое слово :

.

$ < foo while
bash: while: command not found

Таким образом, doявляется неожиданным, поскольку он разрешен только после определенных ключевых слов.

Таким образом, это относится не только к whileциклам, но и к большинству способов создания составных команд с использованием зарезервированных слов:

$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found

0
09.10.2021, 15:28
1 ответ

Пытаюсь добраться до точек:

  • TCP не работает с широковещательной рассылкой.

    Вы просто не можете использовать TCP для подключения к широковещательному IP-адресу. netcat использует TCP по умолчанию, если не указано использовать UDP, и такая попытка приводит к ошибке.

  • Широковещательная рассылка UDP требует установки флага, но GNU netcat не справляется с этим.

    Вот как работает API сокетов BSD и его расширения через setsockopt(2). Для возможности отправки пакета на широковещательный IPv4-адрес (для протоколов, поддерживающих широковещательную рассылку ), SO_BROADCASTявляется обязательным. Иначе это вызовет ошибку. Исходники GNU netcat нигде не включают строку SO_BROADCAST.

Таким образом, у GNU netcat нет возможности отправить широковещательную рассылку. Вы должны переключиться на другой инструмент. Либо другой вариант netcat(существует несколько вокруг ), либо используйте вместо него socat, который имеет больше возможностей. Вот ссылка о использовании socatс (многоадресной рассылкой и )широковещательной рассылкой . Он поддерживает наличие двух сторон с сокетом, как (, по-видимому, )туннельный режим GNU netcat.

0
14.10.2021, 19:14

Теги

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