Если я могу немного расширьте вопрос и поймем его как «Есть ли более читаемый способ проверки файловых режимов? , То я предлагаю добавить пользовательское утверждение.Цель:
self.assertFileMode(my_directory, user="rwx", group="rx", others="rx")
Как это сделать.
Давайте положим, что утверждение в Mixin:
import os
import stat
class FileAssertions(object):
FILE_PERMS = {
'user': {'r': stat.S_IRUSR, 'w': stat.S_IWUSR, 'x': stat.S_IXUSR, 's': stat.S_ISUID},
'group': {'r': stat.S_IRGRP, 'w': stat.S_IWGRP, 'x': stat.S_IXGRP, 's': stat.S_ISGID},
'others': {'r': stat.S_IROTH, 'w': stat.S_IWOTH, 'x': stat.S_IXOTH},
}
def assertFileMode(self, path, **kwargs):
mode = os.stat(path).st_mode
for key, perm_defs in self.FILE_PERMS.items():
expected = kwargs.pop(key, None)
if expected is not None:
actual_perms = mode & sum(perm_defs.values())
expected_perms = sum(perm_defs[flag] for flag in expected)
if actual_perms != expected_perms:
msg = '{key} permissions: {expected} != {actual} for {path}'.format(
key=key, path=path,
expected=''.join(sorted(expected)),
actual=''.join(sorted(flag for flag, value in perm_defs.items()
if value & mode != 0))
)
raise self.failureException(msg)
if kwargs:
raise TypeError('assertFileMode: unknown arguments %s' % ', '.join(kwargs))
С его помощью
Теперь, как насчет проверить некоторые режимы файла?
# We use our mixin
class MyTestCase(FileAssertions, TestCase):
def test_some_paths(self):
# Test all permissions
self.assertFileMode('/foo/bar', user='rwx', group='rx', others='')
# Only test user permissions
self.assertFileMode('/foo/bar', user='rwx')
# We support the suid/sgid bits as well
self.assertFileMode('/foo/bar', user='rwxs', group='rxs', others='rx')
Пример вывода:
AssertionError: user permissions: rw != rwx for /foo/bar
Примечания:
- только права доступа, данные метода испытания. Чтобы проверить отсутствие разрешений, пропустите пустую строку.
- Большая часть сложностей связана с созданием удобного для пользователя сообщения.
- Права доступа сортируются в алфавитном порядке в сообщениях об ошибках, поэтому их легче сравнивать с глазным яблоком.
- Чтобы это было просто, я не обрабатывал тестирование sticky bit.
Возможно, в зависимости от того, что вы подразумеваете под понятием «читаемый». Код, который у вас есть в вашем вопросе, скрывает много вещей за кулисами. Например: 'os.stat (my_directory)' возвращает объект 'os.stat_return()', который имеет несколько свойств, включая 'st_mode'. Что касается демистификации «16877», вы можете присвоить значение переменной, которая названа соответствующим образом, но это все, что вы могли бы сделать, поскольку свойство 'st_mode' объекта' os.stat_return() 'всегда будет числовым значением. –
Установлена ли ваша система и проверьте это состояние? У вас есть функция, которая проверяет состояние? Не могли бы вы использовать это в утверждении? У вас есть имя для этого состояния в вашей системе (например, только для владельца)? –
@PeterWood да, моя система устанавливает это состояние. Да, он проверяет это состояние. Это вышеприведенная строка. Проверить это невозможно. Но тест, который содержит указанную выше строку. Пока нет имени. Но хорошая идея. Название государства было бы еще лучше. Спасибо – guettli