Список каталогов при использовании setfacl ACL

Так как bashв любом случае не может хранить NUL-байты в своих переменных, вы всегда можете сделать:

IFS= read -rd '' var < file

в котором будет храниться содержимое файла до первого нулевого байта или конца файла, если в файле нет нулевых байтов (текстовые файлы по определению (по определению POSIX по крайней мере )не содержат байты NUL ).

Другим вариантом является сохранение содержимого файла в виде массива его строк (, включая разделитель строк, если он есть):

readarray array < file

Затем вы можете присоединиться к ним с помощью:

IFS=; var="${array[*]}"

Если вход содержит байты NUL, все, что находится после первого вхождения в каждой строке, будет потеряно.

В синтаксисе POSIX sh вы можете сделать:

var=$(cat < file; echo.); var=${var%.}

Мы добавляем ., который затем удаляем, чтобы обойти тот факт, что подстановка команд удаляет все завершающие символы новой строки.

Если файл содержит байты NUL, поведение будет различаться в зависимости от реализации.zsh— единственная оболочка, которая их сохранит. (это также единственная оболочка, которая может хранить байты NUL в своих переменных ). bashи несколько других оболочек просто удаляют их, в то время как некоторые другие задыхаются от них и отбрасывают все после первого появления NUL.

Вы также можете хранить содержимое файла в какой-либо закодированной форме, например:

var=$(uuencode -m - < file)

И получить обратно с:

printf '%s\n' "$var" | uudecode

Или с NUL, закодированными как \0000, чтобы иметь возможность использовать его в аргументах для printf %bв bash(, предполагая, что вы не используете локали с кодировкой BIG5, GB18030, GBK, BIG5 -HKCSC):

var=; while true; do
  if IFS= read -rd '' rec; then
    var+=${rec//\\/\\\\}\\0000
  else
    var+=${rec//\\/\\\\}
    break
  fi
done < file

А потом:

printf %b "$var"

, чтобы получить его обратно.

0
17.03.2021, 12:22
3 ответа

Как я проверял, это работает, когда я не использую опцию d, что означает значение по умолчанию.

setfacl -Rdm g :grouptoadd :rx /path/directory/ эта команда разрешает новые файлы в разрешении rx каталога.

setfacl -Rm g :grouptoadd :rx /path/directory/ эта команда разрешает группе grouptoadd просматривать и читать каталог

0
18.03.2021, 22:24

Вы устанавливаете ACL по умолчанию с помощью флага -d, а не действующие ACL . ACL по умолчанию — это механизм для установки ACL для файлов и каталогов, созданных в каталоге, для которого вы устанавливаете ACL по умолчанию. Удалите параметр -d, если хотите применить ACL к самому каталогу.

Если вы выполните getfacl, вы увидите записи "по умолчанию". Я предлагаю прочитать больше о Linux ACL.

[lzap@x1 foreman-packaging-rpm]$ getfacl /tmp/test
# file: tmp/test
# owner: lzap
# group: lzap
user::rwx
group::rwx
other::r-x

[lzap@x1 foreman-packaging-rpm]$ setfacl -dm u:lzap:rx /tmp/test

[lzap@x1 foreman-packaging-rpm]$ getfacl /tmp/test
# file: tmp/test
# owner: lzap
# group: lzap
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:lzap:r-x
default:group::rwx
default:mask::rwx
default:other::r-x

[lzap@x1 foreman-packaging-rpm]$ setfacl -m u:lzap:rx /tmp/test

[lzap@x1 foreman-packaging-rpm]$ getfacl /tmp/test
# file: tmp/test
# owner: lzap
# group: lzap
user::rwx
user:lzap:r-x
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:lzap:r-x
default:group::rwx
default:mask::rwx
default:other::r-x

Чтобы увидеть списки ACL по умолчанию в действии, просто создайте файл в каталоге с ACL по умолчанию. В моем случае touch /tmp/test/a_fileи он унаследует u:lzap:r-xACL.

0
18.03.2021, 22:24

Я считаю, что "grouptoadd" не имеет разрешения на выполнение в каталоге пути . Вы можете ls /path/directory/только в том случае, если у вас есть разрешение на выполнение для всех каталогов, составляющих ваш путь.

Попробуйте $ getfacl /pathи убедитесь, что " grouptoadd " имеет разрешение на выполнение.

Если нет, вы можете просто добавить его:$ setfacl -m g:grouptoadd:x /path.

Также используйте команду setfaclбез опции -d.

0
18.03.2021, 22:24

Теги

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