Я не получаю кубика числа

Поздравляем, вы обнаружили ограничение в концепции фильтрации пакетов. Протоколы отслеживания многоадресной рассылки: ответ не может прийти с того же адреса, потому что вам категорически запрещено отправлять с многоадресного адреса. Брандмауэр не может сопоставить ответ на ваш запрос, поэтому блокирует его. Очевидно, что система MDNS dameon, avahi, избегает этого, отправляя с фиксированного порта 5353, так что именно туда он также получает ответы. Порт 5353 специально разрешен правилом брандмауэра. Если вы можете заставить программу взаимодействовать с avahi вместо , avahi порекомендует именно это решение.

В качестве альтернативы можно использовать параметр avahi по умолчанию disallow-other-stacks = no и настроить клиентское приложение на использование фиксированного порта 5353 . Неясно, как это повлияет на надежность Avahi. Или вы можете просто отключить Avahi, если он вам не нужен. Конечно, если приложение позволяет вам выбрать фиксированный порт источника, вы можете просто добавить его в брандмауэр, и он будет работать ...

... кроме случаев, когда вы говорите «клиентское приложение», вы вероятно, означает класс программного обеспечения, которое теоретически должно иметь возможность запускать несколько экземпляров одновременно. Он не выполняет все сетевые запросы через одного демона. И держу пари, что приложение не использует хак SO_REUSEPORT, который avahi реализует для disallow-other-stacks = no , поэтому это позволит вам запустить только один экземпляр приложения за раз .

Многие программы Linux для настольных компьютеров или изящных локальных сетевых устройств, вероятно, не предназначены для работы с брандмауэром хоста. Fedora - это основной дистрибутив, который это делает. Fedora Workstation недавно изменила зону своего брандмауэра по умолчанию на «FedoraWorkstation», которая позволяет подключаться к любому порту TCP или UDP выше 1024. Конфигурация FedoraWorkstation или работа без брандмауэра позволит вашему программному обеспечению работать без изменений.

Трудно выразить суть такого брандмауэра хоста, как Firewalld. Он не поддерживает маршрутизацию между зонами, как Shorewall. Это позволяет вам выбрать для зоны по умолчанию что-то более ограничительное, с более разрешительными настройками для вашей домашней беспроводной сети или VPN. Возможно, если вы усердно поработаете над NetworkManager, вы сможете заставить его работать и в домашней проводной сети. Но это так непонятно для того, что включено по умолчанию.

Совершенно безопасно запускать установку по умолчанию Fedora (или Ubuntu) без брандмауэра. Вы отказываетесь от централизованной политики, для которой порты открыты - на случай, если вы позже настроили какое-то случайное программное обеспечение и не поняли, что оно хочет прослушивать порт.

Люди пытаются сравнить брандмауэры в Linux и Windows, но брандмауэр Windows явно необходим и действительно доступен для понимания смертными, в отличие от Firewalld . Windows по умолчанию имеет открытые порты и использует брандмауэр хоста для их защиты. Он реализует доверенные / ненадежные зоны для проводных сетей. Новые сети по умолчанию являются ненадежными, и появляется всплывающее окно с вопросом, хотите ли вы изменить это.Различные проводные сети идентифицируются по MAC-адресу DHCP-сервера. По крайней мере, начиная с Window 8, «экспресс» первый запуск также отмечает текущую сеть как надежную, что теоретически меня раздражает, но на практике это, вероятно, весьма полезно.

Технически вы также можете изменить программное обеспечение, чтобы общаться с Firewalld через dbus и запрашивать, чтобы связанный с ним эфемерный порт был открыт для ответов. Почему-то я не думаю, что это полезное предложение.

2
11.01.2019, 21:52
2 ответа

У вас есть несколько проблем со сценарием оболочки. Во-первых, вы должны процитировать $cв то время как (все они — вы пропустили последнее ). В противном случае, когда $c пуст (, скажем, в начале вашей программы ), тест -z ничего не проходит вместо пустой строки, выдавая ошибку (что-то вроде «аргумент ожидается» ).

Во-вторых, вам нужно экранировать *в вашей команде expr. В противном случае он пытается сделать glob (совпадающим с именами файлов ), точно так же, как это сделал бы cat *. Проще всего перейти к \*. Ошибка от этого будет зависеть от того, что именно *расширяется до (, то есть какие файлы находятся в вашем текущем каталоге ), но, вероятно, это будет что-то запутанное!

По крайней мере, это должно запустить ваш скрипт.

PS :Существует множество других способов, которыми это можно улучшить, вы можете проверить ShellCheck для некоторых (автоматизированных )предложений.

6
27.01.2020, 21:52

В bash вы можете написать:

PS3="Continue? "
while true; do

    read -p "Enter a number: " n
    ((0 <= n && n <= 50)) && echo "cube = $((n * n * n))"

    select ans in yes no; do
        case $ans in
            yes) break ;;
            no) break 2 ;;
        esac
    done
done
1
27.01.2020, 21:52

Теги

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