Поиск и замена цикла Bash с использованием sed

В соответствии с описанным вами поведением strongSwan, который не подключает новых пользователей или не подключает пользователей вообще, когда ipsec.secrets становится слишком большим, мы можем с уверенностью сказать, что проблема не в том, что ошибки в скриптах.

Похоже, вы достигли предела файла / буфера / памяти. Реальный вопрос в том, что ваша пользовательская база переросла ваши текущие настройки, например ваша установка может быть идеальной для небольшой базы пользователей, но не предназначена для такого количества пользователей.

В качестве временного решения можно рассмотреть возможность разбивки списка пользователей на несколько серверов VPN.

Однако в среднесрочной / долгосрочной перспективе я бы посоветовал настроить центральный сервер аутентификации, будь то RADIUS, LDAP, MySQL или Active Directory, вместо того, чтобы создавать пользователей в ipsec.secrets , и создание новой инфраструктуры, позволяющей StrongSwan аутентифицироваться через нее.

В документации подключаемый модуль SQL по-прежнему классифицируется как экспериментальный. Существуют также плагины для PAM, но я бы не рекомендовал их.

FreeRadius также взаимодействует с серверной конфигурацией LDAP и понимает больше протоколов при правильной настройке (а именно PAP, MSCHAPv2, EAP-PAP и EAP-MSCHAPv2). Использование протокола RADIUS также дает дополнительное преимущество, заключающееся в хранении учетных данных в центральной точке. При правильной настройке (например, учет сброса FreeRadius в MySQL, что является необязательной конфигурацией) вы можете очень легко получить списки использования VPN пользователями.

По существу, хотя это и более сложно, я бы порекомендовал для службы вашего размера, чтобы strongSwan общался с FreeRADIUS, а FreeRADIUS общался с сервером LDAP с вашими пользователями и паролями.

Согласно официальной документации:

Аутентификация с помощью RADIUS (например, с FreeRadius)

EAP-Radius Плагин eap-radius не реализует напрямую метод EAP , но он перенаправляет диалог EAP с клиентом на внутренний сервер RADIUS . На шлюзе пакеты EAP извлекаются из сообщений IKE и инкапсулируются в протокол RADIUS, и наоборот. Сам шлюз не требует специальной поддержки для конкретного метода EAP , поскольку он более или менее прозрачно обрабатывает диалог EAP между клиентом и серверной частью RADIUS.

Серверы RADIUS Подключаемый модуль должен работать с любым сервером RADIUS. Мы успешно протестировали его с FreeRADIUS и включенным сервером NPS с Windows Server 2008 R2.

Для методов EAP, предоставляющих MSK, сервер RADIUS должен включать ключ в ключи MPPE-Send / Receive; К сожалению, FreeRADIUS до 2.1.10 не включал эти атрибуты при использовании с EAP-MSCHAPv2.

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

Я также добавлю в качестве примера, что я управляю парой pfSense IPsec VPN для нескольких тысяч пользователей, аутентифицируемых в FreeRadius + Active Directory.Они используют собственные VPN-клиенты Windows 7–10, MacOS, iOS, Linux и Android.

Также в том, что касается интеграции с WHMCS: отказ от ответственности - я не знаком с WHMCS . Однако мне кажется, что это касается только биллинга в решении VPN. Я подозреваю, что после наличия унифицированной конфигурации RADIUS, позволяющей использовать MySQL, все еще необходимо разработать программное обеспечение для интеграции использования / выставления счетов с WHMCS. В противном случае гораздо сложнее выполнить тяжелую работу по извлечению с разных платформ журналов использования клиентов.

2
20.05.2017, 05:39
3 ответа

Создайте скрипт sed, который выполняет все подстановки, а затем примените этот скрипт sed к вашему файлу.

for (( i=0; i<${#OLD[@]}; ++i )); do
        printf 's/%s/%s/g\n' "${OLD[$i]}" "${NEW[$i]}"
done >script.sed

sed -f script.sed inputfile >outputfile && mv outptufile inputfile && rm script.sed

Таким образом, вы ограничиваете количество раз, которое вам нужно разобрать входной файл, до одного.

Для заданных данных в OLD и NEW скрипт sed будет сгенерирован как

s/_MAIN1_/#111/g
s/_MAIN2_/#222/g
3
27.01.2020, 22:18

Благодаря комментарию Rakesh Sharma я смог решить эту проблему, используя флаг -i в команде sed. Перед циклом создается резервная копия исходного файла:

cp oldfile.txt oldfile.backup
while (( i < length ))
do
  sed -i -e 's/'"${OLD[$i]}"'/'"${NEW[$i]}"'/g' oldfile.txt
  ((i++))
done

В следующий раз я буду использовать Perl для манипуляций со строками.

Изменить: Добавлено ((i++)) для предотвращения бесконечного цикла (благодаря комментарию Кусалананды).

-1
27.01.2020, 22:18

Весь ваш скрипт (, который не работает ), можно заменить одной строкой:

sed 's/_MAIN\([12]\)_/#\1\1\1/g' oldfile.txt > newfile.txt

Или, более читабельно, но эквивалентно:

sed 's/_MAIN1_/#111/g;s/_MAIN2_/#222/g' oldfile.txt > newfile.txt

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

0
27.01.2020, 22:18

Теги

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