Назад | Перейти на главную страницу

Восьмеричное представление разрешений для файлов / папок с использованием awk?

У нас здесь есть разные машины со всевозможным оборудованием и операционными системами, большинство из них выполняет обычные задачи с помощью bash, которые выполняет агент. Однако я обратил внимание на то, что некоторые машины Solaris, которыми мы владеем, не имеют stat util, и добавление этого может потребовать времени (ирония)

Тем временем я пытался имитировать одну сизифову задачу, которую stat великолепно справлял: вернуть права доступа к файлам в Octal

Я нашел старый пример, который печатает обычные разрешения в Octal - rwx, но не для «специальных» разрешений - липкой группы, липкого пользователя и т. Д.

Мой основной метод заключался в следующем: сначала вычислить восьмеричное значение специальных битов, а затем добавить обычное 'rwx', но, похоже, он не работает.

ls -lah $file  | awk '{k=0;for(i=0;i<=8;i++) {if (substr($1,i+2,1)~/[s]/) k += ((substr($1,i+2,1)~/[s]/)*2^9);else k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));}if (k)printf("%0o ",k);}'


ls -lah $file  | awk '{k=0;for(i=0;i<=8;i++){k+=((substr($1,i+2,1)~/[rwxs]/)*2^(8-i));printf("%0o\n",k)}if(k)printf("%0o ",k);}'

может кто-нибудь намекнуть мне, что было бы хорошим решением?

Он должен обрабатывать любой набор разрешений, включая sticky, setuid и setgid («s» означает «набор», а не «липкий», который равен «t»). Печатаются ведущие нули.

ls -lahd "$file" | awk '{k = 0; for (g=2; g>=0; g--) for (p=2; p>=0; p--) {c = substr($1, 10 - (g * 3 + p), 1); if (c ~ /[sS]/) k += g * 02000; else if (c ~ /[tT]/) k += 01000; if (c ~ /[rwxts]/) k += 8^g * 2^p} if (k) printf("%05o ", k)}'

Вот он на нескольких строках для удобства чтения:

awk '{k = 0; 
      for (g=2; g>=0; g--) 
          for (p=2; p>=0; p--) {
              c = substr($1, 10 - (g * 3 + p), 1); 
              if (c ~ /[sS]/) 
                  k += g * 02000; 
              else 
                  if (c ~ /[tT]/) 
                      k += 01000; 
              if (c ~ /[rwxts]/) 
                  k += 8^g * 2^p
      } 
      if (k) {
          printf("%05o ", k); 
     }'

Демо:

$ touch foo
$ chmod 7654 foo
$ ls -l foo
-rwSr-sr-T 1 user user 0 2012-01-29 13:21 foo
$ ls -l foo | awk '...'
07654

Вы можете выполнить следующую команду, чтобы получить восьмеричные права доступа к файлу / папке:

$ find /tmp/ -printf "%m,%p\n"

Это напечатает список файлов / папок в /tmp с разрешениями в восьмеричном формате. Это также распечатывает специальные разрешения, такие как s. Это всего лишь пример. Вы можете настроить его в соответствии со своими потребностями.