Я стер файлы ifcfg, созданные установочным носителем CentOS, и использовал nmcli для их создания с нуля. Старые и новые файлы ifcfg оказались почти такими же. Различия заключаются в порядке содержимого, автоматически сгенерированном новом UID, и я дал соединению настраиваемое имя ext0, а не сгенерированное. И теперь работает отлично.
Итак, в конце концов, кто, черт возьми, знает. Смайлик флип-стола здесь пригодится.
Из того, что я обнаружил, NetworkManager полностью разделяет устройство и соединение. В моем случае каждый час по какой-то причине NetworkManager определял, что eth0 не настроен, несмотря на то, что это так, и генерировал временное новое соединение, которое затем не выполнялось. Следовательно, полное отключение текущего соединения, отказ временного и повторение.
Возможно, любой из этих двух элементов является ссылками в другом месте, о которых я не знаю, поэтому сообщаю NetworkManager, что он действительно используется и контролируется NetworkManager (NM_CONTROLLED = yes, для записи ничего не сделал).
В конце концов, это мой ifcfg-ext0:
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=yes
NAME=ext0 # Arbitrary name given
UUID=<UUID generated by NetworkManager>
DEVICE=eth0
ONBOOT=yes
ZONE=drop
DNS1=<IPv4 DNS server>
DNS2=<IPv4 DNS server>
IPADDR=<static IPv4address>
PREFIX=24
GATEWAY=<static IPv4 gateway>
DOMAIN=<my domain>
DNS3=<IPv6 DNS server>
DNS4=<IPv6 DNS server>
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no
Я забыл, что должен закрыть список шаблонов, исключив все, что не включено явно. Я использовал
comm="rsync -a --progress --delete ${INCLUDE_PATTERNS} --exclude=\"*\" ${EMPTYDIR}/ ${TARGET_DIR}"
Не слишком внимательно рассматривая фактическое использование из rsync
здесь, а вместо этого сосредоточившись на создании командной строки rsync
.
#!/bin/bash
target=$1
shift
empty=$( mktemp -d )
trap 'rmdir "$empty"' EXIT
for pattern do
incl+=( --include="$pattern" )
done
rsync --archive --progress --delete "${incl[@]}" --exclude='*' "$empty"/ "$target"
Используя массив (массив incl
выше ), вы сохраняете аргументы для rsync
отдельно, а не как строку. Расширение "${incl[@]}"
будет отдельными элементами массива в кавычках. Цитирование аргументов становится тривиальным, и нет необходимости вызывать eval
. Также обратите внимание, что все расширения параметров должны быть правильно заключены в двойные кавычки.
Проблема с вашим кодом заключается в том, что вы используете большинство раскрытий параметров без кавычек. Это заставляет оболочку выполнять разбиение слов и генерацию имен файлов (, подстановку )переменных. Это, в свою очередь, означает, что вы не можете использовать шаблоны, содержащие пробелы, или шаблоны подстановки оболочки, которые могут расширяться до имен существующих файлов.
Для /bin/sh
синтаксис становится еще менее подробным:
#!/bin/sh
target=$1
shift
empty=$( mktemp -d )
trap 'rmdir "$empty"' EXIT
for pattern do
set -- "$@" --include="$pattern"
shift
done
rsync --archive --progress --delete "$@" --exclude='*' "$empty"/ "$target"