Как мне запускать службу systemd oneshot, когда моя система получает новый адрес IPv6?

Для этого можно использовать подстановку команд (прочитайте man sh и поищите).

Если ls /list | tail -n 1 выводит правильный файл, вы можете сделать следующее:

file=$(ls /list | tail -n 1)
mv "/list/$file" "/list/PREFIX$file"

EDIT: Как указал @Wildcard, это может не сработать, если имена файлов содержат новые строки.

Решение, которое должно работать даже с новыми строками в именах файлов, использует find -print0 и {sort,head,tail} -z (похоже, не все версии поддерживают опцию -z/--zero-terminated, GNU поддерживает):

file=$(find /list -print0 | sort -z | tail -n 1 -z)
mv "$file" "$(dirname "$file")/PREFIX$(basename "$file")"
4
24.03.2016, 01:35
2 ответа

Я написал нечто подобное много лет назад под названием (без воображения) autoddns .

Он не вызывает службу systemd (я не думаю, что systemd существовал в то время!), Но вызывает внешний процесс для выполнения обновления DNS ( nsupdate ). Однако он отслеживает добавление и удаление IP-адресов непосредственно на уровне netlink, что означает, что он будет принимать их независимо от того, как они происходят (ручная административная конфигурация, SLAAC, DHCP, Network Manager). Он мгновенно реагирует на изменения. Он поддерживает фильтры (предназначенные для автоматического исключения таких вещей, как локальные адреса ссылок), поэтому вы можете заставить его уважать изменения адресов IPv6 и игнорировать IPv4, как вы хотите.

Возможно, вы сможете использовать его или изменить в соответствии со своими потребностями. Я думаю, что большая часть волшебства для обнаружения и реагирования на изменения IP-адреса находится в watchip.c .

3
27.01.2020, 20:57

Использование постоянной службы systemd, а не однократной обработки:

[Unit]
Description=Dynamic DNS updater
DefaultDependencies=no
Wants=local-fs.target
After=local-fs.target
Wants=network-pre.target
Before=network-pre.target

[Service]
Type=exec
ExecStart=/usr/local/sbin/ddns-updater

[Install]
WantedBy=sysinit.target

Соответствующий сценарий демона /usr/local/sbin/ddns-updaterс использованием инструмента ipиз пакета iproute2:

#!/bin/sh -e

ip -o -6 monitor address |
    while read index iface proto addr dummy scope temporary dummy; do
        case "$iface:$proto:$scope:$temporary" in
            enp2s0:inet6:global:dynamic)
                addr="${addr%/*}"
                if [ "$addr" != "$current" ]; then
                    nsupdate -k /etc/network/nsupdate/Kyour.dyn.domain.name.+157+58882.private <<EOF
update delete your.dyn.domain.name AAAA
update add your.dyn.domain.name 300 AAAA $addr
send
EOF
                    echo "AAAA record set to $addr"
                    current="$addr"
                fi;;
        esac
    done

Это позволяет избежать записи часто меняющегося рандомизированного (расширенного конфиденциального -временного )адреса на DNS-сервер, но сработает, если у вас есть несколько глобальных не -временных адресов (, как статический настроен один и один SLAAC ). При необходимости настройте (имя интерфейса, имя домена, путь к ключевому файлу, дополнительную логику, TTL...)

0
27.10.2020, 17:17

Теги

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