У нас здесь есть разные машины со всевозможным оборудованием и операционными системами, большинство из них выполняет обычные задачи с помощью 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
. Это всего лишь пример. Вы можете настроить его в соответствии со своими потребностями.