По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Одной из основных задач, с которой сталкивается администратор IP-АТС, является её защита от внешних вторжений. Как правило, все IP-АТС закрываются от внешней сети по средствам NAT-ирования и порт-форвардинга, но даже в этом случае, сервер может оставаться незащищенным от порт-сканеров, в частности, открытых SIP-портов 5060 и 5061. В сегодняшней статье рассмотрим механизмы внутренней защиты IP-АТС Asterisk, доступные в web-интерфейсе Elastix 4. Инструменты, о которых пойдёт речь получили общее название Firewall Итак, для того, чтобы попасть в модуль, переходим по следующему пути: Security → Firewall, перед нами открывается доступный функционал: Рассмотрим каждую вкладку Firewall Rules В данной вкладке, настраиваются правила разрешающие или запрещающие прохождение трафика к IP-интерфейсам вашей IP-АТС. По умолчанию, Firewall выключен и первое, что необходимо сделать – это активировать его, нажав Activate Firewall. С этого момента, Elastix Firewall , будет контролировать ваши IPTables и все настройки, которые были сделаны вручную до этого – аннулируются. После активации Firewall, перед нами откроется нумерованный список правил для всех портов, которые может использовать Elastix, а также возможность добавления собственного правила - Add Rule В качестве примера покажем правило, запрещающее подключаться к нашей IP-АТС по протоколу SIP из некоторой подсети. Допустим мы в логах обнаружили слишком частые запросы из подсети 31.54.0.0/24. Для того, чтобы заблокировать доступ для этой сети, выбираем правило №4 (SIP) и редактируем его следующим образом: Таким же образом можно заблокировать, например, протоколы, которые вы не используете (часто IAX, MGCP). Также, будет полезно ограничить возможность доступа к web-интерфейсу для всех, кроме администраторов Elastix по таким протоколам как HTTP(порт 80/8080/8088), HTTPS(порт 443), SSH(порт 22), Telnet (порт 23) Define Ports В данной вкладке можно настроить номера портов, которые впоследствии можно применить в правилах. Например, как правило, HTTP может использовать два порта 80 и 8080, в интерфейсе же мы видим только порт 80. Добавим его, для этого нажимаем View → Edit добавляем запись 8080 и кликаем Save. Можно добавить только ещё один номер порта. Port Knocking Interfaces Ещё один механизм защиты, позволяющий получать доступ к выбранным интерфейсам вашей IP-АТС, только после последовательности подключений к специальным портам. По умолчанию, порт, который вы хотите защитить, будет закрытым, пока на него не поступит последовательность пактов, которая заставит его открыться. Port Knocking Users Данная вкладка позволяет настроить механизм Port-Knocking для определенных пользователей и соответствующих портов.
img
Когда мы только начинаем изучать Python, мы закладываем некоторые вредные привычки при написании кода, о которых мы можем даже не подозревать. Вы можете написать код, который сработает сейчас, но может не сработать в будущем, или вы можете использовать какие-то хитрые ходы вместо встроенной функции, которая могла бы облегчить вашу жизнь. У большинства из нас сохранились не одна из тех вредных привычек при программировании на Python, что формируются в период первых месяцев обучения. Отличная новость в том, что вы можете с легкостью искоренить их, прочитав приведенный ниже текст. 1. Использование import * Каждый раз, когда нам становится лень, то возникает соблазн импортировать все необходимое из модуля с помощью from xyz import *. Это не самый лучший подход по многим причинам. Кот несколько из них: Это может оказаться неэффективно: если в модуле очень много объектов, то вам придется долго ждать, пока все импортируется. Это может вызвать конфликт имен переменных: когда вы используете *, то вы понятия не имеете, какие объекты вы импортируете и как они называются. Как же с этим бороться? Импортируйте либо какой-то конкретный объект, либо весь модуль целиком. # Using import * # Bad from math import * print(floor(2.4)) print(ceil(2.4)) print(pi) # Good import math from math import pi print(math.floor(2.4)) print(math.ceil(2.4)) print(pi) 2. Try/except: отсутствие указания исключения в блоке «except» Я очень долго пренебрегал этим. Сложно посчитать, сколько раз Pycharm давал мне понять (этими противными подчеркиваниями), что не нужно использовать «голое» исключение. Это идет в разрез с рекомендациями PEP8. # Try - except # Bad try: driver.find_element(...) except: print("Which exception?") # Good try: driver.find_element(...) except NoSuchElementException: print("It's giving NoSuchElementException") except ElementClickInterceptedException: print("It's giving ElementClickInterceptedException") Проблема «голых» исключений заключается в том, что оно будет перехватывать исключения SystemExit и KeyboardInterrupt, что затрудняет прерывание программы с помощью Control-C. В следующий раз, когда вы будете использовать try/except, укажите исключение в блоке except. 3. Не использовать Numpy для математических вычислений Очень часто мы забываем, что в Python есть множество пакетов, которые могут значительно облегчить нашу жизнь и сделать ее более продуктивной. Одним из таких пакетов является Numpy – пакет для математических вычислений. Numpy может помочь вам вычислять математические операции быстрее, чем циклы for. Допустим, что у нас есть массив random_scores, и мы хотим получить средний балл тех, кто не сдал экзамен (score>>dict_countries.keys() dict_keys(['USA', 'UK', 'Canada'])>>>dict_countries.values() dict_values([329.5, 67.2, 38]) Проблема тут заключается в том, что мы не всегда используем их должным образом. Например, мы хотим просмотреть словарь и получить ключи. Вы можете использовать метод .keys, но знаете ли вы, что ключи можно получить, просто перебирая словарь? В этом случае использование метода .keys будет излишним. # Not using .keys() properly # Bad for key in dict_countries.keys(): print(key) # Good for key in dict_countries: print(key) Кроме того, можно придумать некоторые хитрости для получения значений словаря, например, с помощью метода .items(). # Not using .items() # Bad for key in dict_countries: print(dict_countries[key]) # Good for key, value in dict_countries.items(): print(key) print(value) 7. Никогда не использовать генераторы (или использовать их всегда) Генератор предлагает более простой синтаксис при создании новой последовательности (списка, словаря и т.д.) на основе уже определенной последовательности. Допустим, мы хотим перевести все элементы в нашем списке countries в нижний регистр. И хотя вы могли бы это сделать просто с помощью цикла for, но также вы можете упростить работу при помощи генератора списка. # Bad countries = ['USA', 'UK', 'Canada'] lower_case = [] for country in countries: lower_case.append(country.lower()) # Good (but don't overuse it!) lower_case = [country.lower() for country in countries] Генераторы – это очень полезно, но не злоупотребляйте ими! Помните правило Дзен Python: «Простое лучше, чем сложное». 8. Использование range(len()) Одни из первых функций, которые мы изучили будучи новичками – это range и len, поэтому не удивительно, почему многие люди имеют дурную привычку писать range(len()) при переборе списков. Допустим у нас есть два списка: countries и populations. Если мы хотим пройтись по обоим спискам одновременно, то, вероятнее всего, вы воспользуетесь range(len()). # Using range(len()) countries = ['USA', 'UK', 'Canada'] populations = [329.5, 67.2, 38] # Bad for i in range(len(countries)): country = countries[i] population = populations[i] print(f'{country} has a population of {population} million people') И хотя это в принципе выполняет свою работу, вы все равно можете упростить задачу, воспользовавшись enumerate (или, что еще лучше, воспользовавшись функцией zip для сопряжения элементов из обоих списков). # OK for i, country in enumerate(countries): population = populations[i] print(f'{country} has a population of {population} million people') # Much Better for country, population in zip(countries, populations): print(f'{country} has a population of {population} million people') 9. Форматирование с помощью оператора + Вероятно, одна из первых вещей, которую мы изучаем в Python, - это то, как соединять строки с помощью оператора +. Это полезный, но не самый эффективный способ соединения строк в Python. Помимо этого, это не очень красиво – чем больше строк вам нужно соединить, тем больше операторов + вы будете использовать. Вместо этого вы можете воспользоваться f-строкой. # Formatting with + operator # Bad name = input("Introduce Name: ") print("Good Morning, " + name + "!") # Good name = input("Introduce Name: ") print(f'Good Morning, {name}') Преимуществом f-строк в том, что они полезны не только для конкатенации, но и для других целей. 10. Использование изменяемых значений в качестве значений по умолчанию Если вы включите изменяемое значение (например, список) в качестве параметра функции по умолчанию, то увидите нечто неожиданное. # Bad def my_function(i, my_list=[]): my_list.append(i) return my_list>>> my_function(1) [1] >>> my_function(2) [1, 2] >>> my_function(3) [1, 2, 3] В приведенном выше коде каждый раз, когда мы вызываем функцию my_function, список my_list сохраняет значения из предыдущих вызовов (а мы, скорее всего, хотим инициировать пустой список при каждом вызове функции). Чтобы избежать такой проблемы, мы должны установить этот параметр my_list равным None и добавить условие if как показано ниже. # Good def my_function(i, my_list=None): if my_list is None: my_list = [] my_list.append(i) return my_list>>> my_function(1) [1] >>> my_function(2) [2] >>> my_function(3) [3]
img
diskonaut - простой навигатор дискового пространства терминала, созданный с помощью Rust и поддерживающий Linux и macOS. Чтобы использовать его, укажите абсолютный путь в файловой системе, например, /home/merionet или запустите его в интересующем каталоге, он будет сканировать каталог и сопоставлять его с памятью, позволяя исследовать его содержимое. Он позволяет проверять использование места даже в процессе сканирования. По завершении сканирования можно переходить по подкаталогам, получая визуальное представление о том, что занимает место на диске. Diskonaut позволяет удалять файлы и каталоги и в результате отслеживает объем освободившегося в процессе пространства. Он также поддерживает горячие клавиши для облегчения навигации. В этой статье вы узнаете, как установить и использовать diskonaut в системах Linux. Установка diskonaut на Linux Чтобы установить diskonaut на Linux в система должна поддерживать язык программирования Rust. Если в системе не установлена соответствующая библиотека это можно сделать с помощью следующей команды: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh После того как Rust установлен на вашей системе, также будет необходимо установить пакетный менеджер для Rust – cargo. С помощью cargo нужно установить diskonaut на систему как показано ниже: cargo install diskonaut Если используется система Fedora, Cent OS или Arch Linux вы можете установить последний предварительный релиз diskonaut из репозиториев по умолчанию как показано ниже. sudo dnf install diskonaut yay diskonaut После установки diskonaut можно либо запустить diskonaut в каталоге, который нужно проверить, либо указать абсолютный путь к каталогу для сканирования в качестве параметра. cd /home/user diskonaut Или diskonaut /home/user В нижней части можно увидеть доступные сочетания клавиш для использования с diskonaut. После завершения сканирования можно выбрать подкаталоги, например, виртуальные машины Virtual Box, а затем нажать Enter, чтобы просмотреть его. Репозиторий diskonaut на Github: https://github.com/imsnif/diskonaut Вот и все! diskonaut – это простой терминальный навигатор дискового пространства, используемый для быстрого анализа использования дискового пространства.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59