Вопрос или проблема
Моя программа ранее создала правило перенаправления..
uci add firewall redirect
uci set firewall.@redirect[-1].dest="lan"
uci set firewall.@redirect[-1].target="DNAT"
uci set firewall.@redirect[-1].name="transmission"
uci set firewall.@redirect[-1].src="https://serverfault.com/questions/1167277/wan"
uci set firewall.@redirect[-1].src_dport=""$port""
uci set firewall.@redirect[-1].dest_ip='192.168.1.5'
uci set firewall.@redirect[-1].dest_port=""$port""
uci commit firewall
service firewall restart
Мне нужно программно обновлять это правило периодически, но я не понимаю, где ручка. Я не могу быть уверенным, что это будет последнее правило [-1], добавленное. Конечно, есть способ создать ручку при создании правила? Единственная информация, которая будет постоянной, это имя, которое я дал правилу, но это не кажется ручкой.
Ответ или решение
Чтобы программно обновить правило перенаправления (redirect rule) в OpenWrt с использованием UCI, используя только имя, вам необходимо следовать нескольким шагам. Это решение основано на эффективном извлечении и настройке правила в зависимости от его имени, что позволит вам избежать неопределенности, связанной с использованием последнего добавленного элемента (-1) в списке.
Шаг 1: Поиск правила по имени
Для начала вам нужно найти ID вашего правила, основываясь на заданном вами имени. Вы можете использовать команду uci get
, чтобы получить список всех правил перенаправления и выявить нужное по имени.
rule_name="transmission"
rule_id=$(uci show firewall | grep "firewall.@redirect[.*].name='$rule_name'" | cut -d. -f2 | cut -d' ' -f1)
Объяснение:
uci show firewall
— показывает все настройки фаервола.grep "firewall.@redirect[.*].name='$rule_name'"
— находит строку, содержащую имя вашего правила.cut
— используется для извлечения ID правила.
Шаг 2: Обновление параметров правила
Сейчас, когда у вас есть ID правила, вы можете использовать его для обновления нужных параметров. Допустим, вам нужно обновить порт и IP-адрес назначения (dest_ip). Вы можете использовать следующую последовательность команд:
new_port="8080" # Замените на ваш новый порт
new_dest_ip="192.168.1.10" # Замените на новый IP-адрес назначения
if [ -n "$rule_id" ]; then
uci set firewall.$rule_id.src_dport="$new_port"
uci set firewall.$rule_id.dest_ip="$new_dest_ip"
uci commit firewall
service firewall restart
else
echo "Правило с именем $rule_name не найдено."
fi
Шаг 3: Команда для выполнения
Как итог, вам нужно собрать все вышеописанные команды в один скрипт, чтобы он выполнялся периодически (например, через cron или другой планировщик задач). Вот пример простого скрипта:
#!/bin/bash
rule_name="transmission"
new_port="8080"
new_dest_ip="192.168.1.10"
# Найти ID правила по имени
rule_id=$(uci show firewall | grep "firewall.@redirect[.*].name='$rule_name'" | cut -d. -f2 | cut -d' ' -f1)
# Обновить параметры правила
if [ -n "$rule_id" ]; then
uci set firewall.$rule_id.src_dport="$new_port"
uci set firewall.$rule_id.dest_ip="$new_dest_ip"
uci commit firewall
service firewall restart
else
echo "Правило с именем $rule_name не найдено."
fi
Заключение
Таким образом, у вас есть способ программного обновления правила перенаправления в OpenWrt, основываясь на заданном имени. Это не только упрощает процесс изменения параметров, но и уменьшает риск ошибок, связанных с поиском и использованием последнего добавленного элемента. Успехов в вашем проекте!