Як перевірити групові дозволи файлу


9

Я хотів би ознайомитись з груповими дозволами файлу із скрипту bash. Зокрема, мені потрібно перевірити, чи є у файлі біт для запису групи.

Це воно. Просто як це. Однак:

  1. Мені також потрібно, щоб це було портативним.
  2. test -w <file не скаже мені, чи це група, яку можна записати.
  3. Результат роботи ls -ldхороший для людей, але не дуже впевнений у сценаріях. Технічно я міг би проаналізувати вихід, такий як drwxrwxr-xвилучення бітів групи, але це здається крихким.
  4. Інтерфейс для statповністю сумісний між OS X та іншими системами.
  5. find <file> -perm ... не може бути відповіді?

Чи потрібно перевірити біт дозволів для групи чи потрібно перевірити, чи певна група має дозволи на запис? Група (або користувач) може мати дозвіл на запис через ACL.
Жил "ТАК - перестань бути злим"

Просто біт дозволу групи. Жодна конкретна група не має значення.
міслав

Відповіді:


8

Спосіб №1 - стат

Ви можете використовувати statкоманду для отримання бітів дозволів. statдоступний на більшості Unixes (OSX, BSD, а не AIX з того, що я можу знайти). Це повинно працювати на більшості Unixes, за винятком OSX та BSD, які я можу знайти.

$ stat -c "%a" <file>

Приклад

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

Використовуйте цю команду:

$ stat -c "%a" afile.txt
664

І скористайтеся простим, grepщоб побачити, чи режим дозволів для груп становить 6 або 7.

$ stat -c "%a" afile.txt | grep ".[67]."

Для OSX і BSD ви повинні використовувати цю форму stat, stat -f(або , можливо stat -x), і розібрати відповідно. Оскільки варіанти statвідрізняються, ви можете зафіксувати цю команду в lsb_release -aкоманді та викликати відповідну версію на базі ОС. Не ідеально, але працездатно. Зрозумійте, що lsb_releaseце доступно лише для дистрибутивів Linux, тому для тестування інших ОС Unix потрібно розробити іншу альтернативу .

Метод №2 - знайти

Я думаю, що ця команда може вам краще служити. Я використовую findі printfперемикач.

Приклад

$ find a -prune -printf '%m\n'
664

Спосіб №3 - Perl

Perl може бути більш портативним способом зробити це залежно від ОС, яку ви намагаєтеся охопити.

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

ПРИМІТКА . Вищенаведене використовує stat()функцію Perl для запиту бітів файлової системи.

Ви можете зробити це більш компактним, відправивши використання масиву @pvта stat()безпосередньо вирішивши:

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

Я думаю, ви пропустили його пункт 4. statКоманда сильно відрізняється між різними системами і не є портативною.
jordanm

@jordanm - дякую, що я це побачив, шукав альтернативу. Я думаю, що find . -printfможна це зробити, але не можу визначити, чи доступний він у пошуку OSX.
slm

1
Я не зміг знайти його на посилання в посібнику POSIX2008, тому я схильний погодитися. Я не впевнений у будь-яких інших методах. Я думаю, вам доведеться кусати кулю тут і виявити, яка ОС і викликати відповідну. командування, здавалося б, найкращий підхід.
slm

1
Я також не міг придумати метод, що використовує стандартну утиліту оболонки. Тому моя відповідь використовує perl.
jordanm

1
@jordanm - чудові розуми. Я теж працював над рішенням perl 8-)
slm

2

Я закінчив ls-парши:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

Я вдячний за широку відповідь @ slm, але жоден з інших методів не є настільки простим. statМетод зажадав би мені написати , по крайней мере два різних викликів для покриття OS X, і навіть після того, що вона повертає вісімкове подання , яке я до сих пір застосовувати арифметичні дії . Метод Perl в порядку, але вимагає від мене запустити перекладача для такого простого завдання, і я хотів би зробити його простим і використовувати лише утиліти posix.


2
Ви використовуєте bash, а не лише POSIX. В POSIX:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Жил "SO- перестань бути злим"

1

Один із варіантів - використання perl, яке буде портативним скрізь, де perlє доступ. Важко знайти систему Unix без неї. Ось приклад того, як його можна інтегрувати в сценарій оболонки:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

Подібні perlприклади можна знайти у stat perldoc .


0
FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

Всі стандартні інструменти Unix / Linux

Я думаю, МОЖЛИВО мати групове записування, але не групове читання. З такою можливістю це буде або випадок справи 2 | 3 | 6 | 7), або відповідь "[2 | 3 | 6 | 7]"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.