Использование rsync для удаления выбранных шаблонов, сопоставление всех файлов

Я стер файлы 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
1
02.10.2018, 10:10
2 ответа

Я забыл, что должен закрыть список шаблонов, исключив все, что не включено явно. Я использовал

comm="rsync -a --progress --delete ${INCLUDE_PATTERNS} --exclude=\"*\" ${EMPTYDIR}/ ${TARGET_DIR}"
1
27.01.2020, 23:31

Не слишком внимательно рассматривая фактическое использование из 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"
2
27.01.2020, 23:31

Теги

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