CentOS включает SELinux по умолчанию, что накладывает дополнительные ограничения безопасности на систему. Политика по умолчанию в основном охватывает стандартные конфигурации/конфигурации по умолчанию для ограниченного программного обеспечения. Когда доступ запрещен, обычно в журналах аудита создается запись в /var/log/audit/audit.log
.
При использовании съемного носителя следует рассмотреть возможность подключения устройства с опцией контекста SELinux. Таким образом, вы избежите изменения политики SELinux вашей системы и необходимости перемаркировки файловой системы на съемном устройстве. Вы можете использовать samba_share_t
, если вы собираетесь использовать только точку монтирования с samba. Если вы используете/маркируете тип user_home_t
,файлы будут обрабатываться так, как если бы они находились в домашнем каталоге пользователя.
mount -t ext4 /dev/sdb /mnt/ELEMENTERY-1TB \
-o context="system_u:object_r:samba_share_t:s0"
Или в/etc/fstab
UUID=<...> /mnt/ELEMENTERY-1TB/ ext4 defaults,errors=remount-ro,context="system_u:object_r:samba_share_t:s0" 0 1
Если у вас по-прежнему возникают проблемы с SELinux, вы можете использовать audit2why
, чтобы узнать, почему доступ был запрещен, и, возможно, существует ли логическое значение SELinux , разрешающее доступ. Если вам нужно изменить политику SELinux, вы можете использоватьaudit2allow
для создания модуля политики, чтобы разрешить доступ.
Есть также два логических значения samba_export_all_ro
и samba_export_all_rw
, если они включены, разрешают Samba доступ к (и совместное использование )любых файлов. В этом случае это дает samba значительно больший доступ, чем требуется, и поэтому не следует использовать в этой ситуации , так как параметры монтирования можно легко настроить.
Попробуйте:
find -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;
(удалить "эхо", если команды выглядят хорошо)
.
└── 1
└── 2
├── 3
│ └── 4
│ └── foo.dat
└── foo.dat
Урожайность:
cp./1/2/3/4/foo.dat./1-2-3-4-foo.dat
cp./1/2/foo.dat./1-2-foo.dat
По сути, вы запускаете специальный -небольшой скрипт(cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"
для каждого файла, который соответствует и этот сценарий генерирует целевое имя, заменяя все /
в исходном пути на -
. Строка tinyscript
может быть любой, это просто имя, которое используется как имя скрипта в случае ошибок.
Предпочитая простоту производительности, это не особенно эффективно (из-за запуска процесса bash для каждого файла ). Если у вас много файлов и/или время является фактором, может потребоваться более сложное решение.
find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'