2010-07-07 3 views
3

Короткий фон: мне нужно контролировать разрешения для файла unix (каталога) с помощью ZABBIX, чтобы увидеть, изменились ли они/когда они меняются. Для этого у ZABBIX нет встроенного, например vfs.file.mode [xxxx], поэтому мне пришлось свернуть собственный UserParameter с числовым типом.Ищете более эффективный (и переносимый) способ получения (числовых) прав доступа к файлам в unix

Что я до сих пор, является использование ls -l | cut -c 2-10, чтобы получить rwxr-xr-x часть, а затем использовать sed для преобразования букв в их «вес», и awk с substr, чтобы подвести итог, чтобы получить цифровую 755 или любое значение.

Это в настоящее время на Solaris, у меня нет команды GNU coreutils stat, и я хочу, чтобы она была портативной и эффективной, и только с использованием стандартных инструментов unix, которые всегда доступны. (IMHO, perl не всегда доступен).

Моя первая попытка (например, для корневого каталога):

ls -ld/| \ 
cut -c 2-10 | \ 
sed -e 's%-%0%g' -e 's%r%4%g' -e 's%w%2%g' -e 's%x%1%g' | \ 
awk '{print (100 * ((substr($0,1,1)) + (substr($0,2,1)) + (substr($0,3,1))) + \ 
    (10 * ((substr($0,4,1) + (substr($0,5,1)) + (substr($0,6,1))))) + \ 
    ((substr($0,7,1)) + (substr($0,8,1)) + (substr($0,9,1))));}' 

Как вы можете видеть, я не забочусь о Setuid бит или что-либо иное, чем файлы, но пурист ответы всегда приветствуются!

Разумеется, должно быть более элегантное решение. Возможно, стандартный инструмент unix, о котором я не думал.

Я нашел это место «случайно» около недели назад, и мне действительно очень нравится! Удивительно видеть, что много знаний, навыков и дружелюбия в одном месте! Это мой первый вопрос, поэтому я очень рад видеть, есть ли у меня ответ! :-) Спасибо большое!

+1

То, что вы ищете, легко доступно с помощью системных вызовов. Нет необходимости изобретать велосипед, кроме «забавы». – Ether

+0

Дело в том, что написание собственной 'stat (2)' wrapper фактически _is_ изобретает колесо. Мне нужно что-то, что я могу добавить в конфигурационный файл, не требуя установки дополнительных программ на контролируемые хосты. – MattBianco

ответ

1

Я не полагайте, что это более элегантно/эффективно nt, чем ваша собственная версия, но я поставлю ее на случай, если какая-либо из этих методик будет полезна для улучшения вашей собственной. Это, очевидно, можно было бы сделать намного проще/элегантно со сценарием, хотя

Основная предпосылка - использовать tr для перевода rwx в соответствующие восьмеричные числа, а затем использовать sed для разделения на группы из 3 добавленных плюсов, а затем сгенерировать Командная строка awk whicg передается awk для их добавления.

ls -ld/| \ 
cut -c2-10 | \ 
tr 'rwx-t' '42100' | \ 
sed -E -e 's/(...)(...)(...)/\1 \2 \3/g' \ 
-e 's/([0-9])([0-9])([0-9])/\1+\2+\3/g' \ 
-e 's/^(.*)$/BEGIN {print \1}/g'|\ 
awk -f -` 
+0

Мой' tr' жаловался на дефис, если я не убежал от него. Ваш первый и третий 'g' не нужны. Вот вам версия GNU sed, которая значительно упрощена. Его можно легко преобразовать в форму '-e'. 'ls -ld/cur -c2-10 | tr 'rwx \ -t' '42100' | sed -r 's/(...)/\ 1 /g;s/([0-9])/\1+0/g;s/.*/BEGIN {print &} /' | awk -f -' –

+0

Я всегда помещаю дефис в последний раз, когда я использую 'tr' или записываю регулярные выражения. Конечно, 'tr' является более элегантным, чем мой первоначальный' sed' за то же самое. Спасибо, Стив! Я посмотрю, могу ли я использовать 'bc' или' expr' вместо awk. – MattBianco

0

stat должно иметь то, что вы ищете. Попробуйте один из них:

stat -c "%a" <filename> 

или

stat --printf="%a" <filename> 
+1

Команда stat не поставляется со всеми объединениями. Вот почему я написал, что не хотел его использовать. – MattBianco

+0

Ах, дерьмо. Я пропустил эту заметку в вашем посте. Извините: ^) – bedwyr

+0

'stat' инструмент командной строки не может, но есть такой системный вызов, доступный со всеми дистрибутивами unix. – Ether

4

если вы можете использовать find, то это выглядит лучше:

find FILENAME -prune -printf '%m\n'

нашел here

+0

Отлично! Слишком плохо, что он не работает на Solaris 'find' – MattBianco

0

Это длинно, но я думаю, что это более удобно, чем ваше. Вы можете назвать это следующим образом: ls -ld/| cut -c 2-10 | ./perm.awk.

#!/usr/bin/gawk -f 
# OR: #!/usr/bin/nawk -f 

function conv(num, len, i, val) { 
    # converts binary string to decimal (or octal if fed 3 "bits" at a time) 
    # call with num as argument, others are local variables 
    len = length(num) 
    for(i = len; i > 0; i--) { 
     if (substr(num, i, 1) == 1) { 
      val = val + 2^(len - i) 
     } 
    } 
    return val 
} 

# main loop 
{ 
    # TODO: handle [sStT] 
    gsub("[rwx]", 1) # make it look binary 
    gsub("-", 0) 
    for(i = 0; i < 3; i++) { 
     perm = perm conv(substr($0, i * 3 + 1, 3)) # convert the "bits" 3 at a time 
    } 
} 

END { 
    print perm 
} 
+0

Ницца. Благодаря! Тем не менее, я ищу что-то, что не требует дополнительных установочных файлов/файлов. – MattBianco

0

ls Реализация различается, так что ваш ls не очень портативный либо.

Я решил бы эту проблему, используя Lua, который компилируется на любой платформе ANSI Standard C вместе с Lua POSIX library, который должен строиться из коробки на любой платформе POSIX. Там вы можете сделать свой звонок stat напрямую и написать простой код для выполнения арифметики. Отличное введение в Lua Programming in Lua доступно бесплатно онлайн (для предыдущей версии Lua). Наконец, если вы заботитесь об эффективности, результаты будут чрезвычайно эффективными, отчасти потому, что Lua работает быстро, но в основном потому, что вы сможете делать все, только разворачивая только один процесс. — Lua-интерпретатор.

+0

Lua выглядит интересно. Я обязательно посмотрю на это (для других вещей). – MattBianco

1

Если ваша система имеет bash и ls -l показывает права доступа к файлам (rwxrwxrwx), то вы можете сделать то, что вы искали на следующем примере:

#!/bin/sh 
[ ! -d $1 ] && echo "Error: "$1" is not a directory" && exit 1 
set -- `ls -ld $1`;P=${1:1:9};P=${P//r/4 };P=${P//w/2 };P=${P//x/1 };P=${P//-/0 } 
set -- $P; echo $((($1+$2)+$3))$((($4+$5)+$6))$((($7+$8)+$9)) 

Преимущество заключается в том, что другие утилиты, такие как AWK или СЭД не нужны.