Bash: Отказано в разрешении при попытке передать данные напрямую в Сеть

В Виртуальном Режиме Замены Буфер тяжелее прикреплен к своему положению источника.

1. Hello World
         ^ Cursor
2. I like cheese
3. And beer

При переходе к нормальному режиму замены и удару Internet<CR>And others новый буфер будет похож на это:

1. Hello Internet
2. And others
3. I like cheese
4. And beer

При выполнении того же в Виртуальной Замене результат будет

1. Hello Internet
2. And othersese
3. And beer

Другой пример (tabstop=2; sts=0):

1. 012345678901234567890
2. Hello beautiful World
         ^ Cursor

Нажатые клавиши: <Tab><Tab>

Результат режима замены:

1. 012345678901234567890
2. Hello     autiful World

Результат виртуального режима замены:

1. 012345678901234567890
2. Hello     tiful World

Поскольку в режиме Replace замена сделана символ символом, где Tab один символ, неважно, сколько символов отображено. В Виртуальном Режиме Замены видимая длина Tab (:h 'ts', :h 'sts') используется для замены символов.

5
13.04.2017, 15:37
2 ответа

Отредактировано после разъяснения OP относительно варианта использования:

Вы не можете сделать это, используя последний официальный выпуск bash (в настоящее время 4.3.30 согласно эта страница ). lib / sh / netopen.c показывает, что bash открывает сокет UDP ( SOCK_DGRAM ), а затем пытается подключиться напрямую, не глядя на IP-адрес, чтобы определить, имеет ли смысл устанавливать определенные параметры сокета (в вашем случае SO_BROADCAST ).

Лучше всего отправить патч текущим разработчикам bash или в соответствующий список рассылки, включить его в официальные выпуски, а затем подождать, пока довольно современная версия bash в вашем NAS не будет обновлена ​​до еще более современная версия, включающая вашу функцию.

Краткий ответ: bash в настоящее время не может делать это.

Предыдущий ответ :
Вы должны использовать socat :

$ echo -e "\xff" | socat - UDP-DATAGRAM:255.255.255.255:4000,broadcast

Запись в / dev / udp использует bash Реализация встроенного сокета .Насколько мне известно, эта реализация не позволяет отправлять дейтаграммы UDP на широковещательный адрес, так как это требует установки флага SO_BROADCAST для сокета перед отправкой.

Использование netcat также не вариант, поскольку он отклоняет широковещательную рассылку UDP:

$ echo -e "\xff" | nc -u 255.255.255.255 4000
nc: netcat.c:573: main: Assertion `connect_sock.proto != NETCAT_PROTO_UDP' failed.
Aborted (core dumped)

Изменить:

Иногда netcat имеет флаг -b для включения широковещательного адреса. См. этот ответ о широковещательной передаче UDP в Ubuntu.

8
27.01.2020, 20:36

Откройте два терминала и введите на обоих:

nc -u -l 55555

Откройте третий терминал, установите socat, если нужно, и введите:

echo -n "TEST" | socat - udp-datagram:127.255.255.255:55555,broadcast

Вы должны увидеть, что оба терминала получили сообщение.

Если вы попробуете провести тот же эксперимент с 127.0.0.1, только один терминал получит сообщение, как и ожидалось.

0
27.01.2020, 20:36

Теги

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