разбор нескольких полей csv с помощью gawk на solaris

Разрешение a + x (выполнение) должно применяться только к каталогам и не должно наследоваться для файлов автоматически.

Вы можете указать для каждой ACE (записи управления доступом) ACL (полного списка), как она должна наследоваться. Параметры взяты из руководства администратора Solaris , которое также применимо к OmniOS (таблицы 8.1–8.3):

  • file_inherit (f): Наследовать ACL только от родительского каталога к файлы каталога.
  • dir_inherit (d): Наследовать ACL только от родительского каталога к подкаталогам каталога.
  • inherit_only (i): Наследовать ACL от родительского каталога, но применяется только к вновь созданным файлам или подкаталогам, а не к самому каталогу. Требуется ж / д / пп.
  • no_propagate (n): Наследовать ACL от родительского каталога только к содержимому первого уровня каталога, но не к содержимому второго уровня или последующему. Требуется ж / д / пп.

Вы можете добавить несколько ACE для одного и того же пользователя и добиться желаемого эффекта, поскольку они объединяются при применении (аналогично спискам ACL Windows). Пример сокращен до @owner, потому что для остальных он будет таким же:

/usr/bin/chmod A=\
    owner@:rw-p-D-ARWcCos:fd-----:allow, \
    owner@:--x---a-------:-d-----:allow, \
    [...]
$@

Это означает, что

  • первый ACE применяется к каталогу и наследуется для всех файлов и каталогов, но исключает разрешения a + x
  • второй ACE применяется к каталогу и наследуется для всех подкаталогов, но не для файлов, и имеет только разрешения a + x
  • для получения результирующего полного ACL, вы можете "наложить" обе строки для каталогов (вот почему Я предпочитаю синтаксис с дефисами, вы видите, чего не хватает)

Я не проверял, делает ли он то, что вы хотите, иногда это зависит и от приложений, поэтому вам следует проверить его. Унаследованные файлы и списки управления доступом к каталогам помечены большим I в последней позиции, например owner @: rw-p-D-ARWcCos: fd ---- I: allow .

Разрешение o + r (чтение) должно применяться только к файлам, а не каталогам, потому что я хочу отключить возможность ls для анонимных пользователей.

Аналогично первому вопросу, но наоборот. Вы также можете комбинировать его с n , если вам просто нужно наследование первого уровня (аналогично find -maxdepth 1 ). Опять же, позаботьтесь о тестировании, потому что, скорее всего, простых флагов недостаточно, и вам также понадобятся расширенные ( ARWC ).Кроме того, вы по-прежнему можете применять ACL рекурсивно с опцией chmod -R для файлов и каталогов, что может потребоваться в некоторых случаях (например, если ACL должны быть изменены задним числом, потому что после записи файла его ACL фиксируется в зависимости от свойства aclinherit ).


Я очень доволен OmniOS / Illumos и ZFS, но, к сожалению, они используют схему ACL Solaris, которая сильно отличается от более распространенного синтаксиса ACL Linux.

Сейчас это может выглядеть неудачно с вашей стороны, но списки ACL точно моделируют ACL NFSv4, поэтому вам не нужно ничего менять, если вы решите использовать NFS версии 4. Он также точно представляет списки ACL Windows (единственное исключение: порядок на SOlaris установлен фиксированный порядок в Windows всегда Запрещено перед Разрешить, но если вы не используете Запретить, это не имеет значения), что означает, что вы можете редактировать разрешения с каждого ПК с Windows, на котором установлены права Co разрешено. Это работает для доменов и рабочих групп, поэтому совместимость с Windows лучше, чем обходные пути, которые Samba использовала в прошлом.

2
19.07.2016, 13:54
1 ответ

Следующая программа gawk должна работать для вас:

echo -e "unixtime;host_name;ip_adress;description;2;0;1\n1234567890;hName;hIP;hDesc;2;1;0" |
gawk -F";" 'BEGIN {OFS=";"} {
  if (NR<2) next;
  $1=strftime("%Y-%m-%d %H:%M:%S", $1);
  $5=($5==2?"CRITICAL":$5);
  $6=($6?"Yes":"No") ; $7=($7?"Yes":"No") ;
  print}'

2009-02-14 00:31:30;hName;hIP;hDesc;CRITICAL;Yes;No

Главное здесь то, что вы можете поместить несколько команд за один вызов awk .

$ 6 = ($ 6? «Да»: «Нет») или, более формально (условие? Последствие: альтернатива) , называется «тернарным» оператором, и это сокращение for if (условие) последствие иначе альтернатива

Если вы хотите напечатать строку заголовка без изменений , а не «пропустить ее», вы можете написать if (NR <2) {print ; next};

Edit: Реализована подсказка по повышению производительности от @cas, чтобы переместить назначение OFS в блок BEGIN.

2
27.01.2020, 22:11

Теги

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