Почему файлы не могут быть обработаны inode?
Почему вы не можете получить доступ к файлу, когда знаете только его индекс, без поиска файла, который ссылается на этот индекс? Жесткая ссылка на файл содержит только имя и номер, указывающие, где найти индекс со всей реальной информацией о файле. Я был удивлен, когда мне сказали, что не было способа пользовательского режима использовать номер inode напрямую, чтобы открыть файл.
Это кажется такой безвредной и полезной возможностью для системы. Почему это не предусмотрено?
5 ответов
Некоторые операционные системы имеют такую возможность. Например, OS X нуждается в нем для поддержки Carbon File Manager, а в Linux вы можете использовать debugfs
, Конечно, вы можете сделать это на любом UNIX из командной строки через find -inum
, но настоящая причина, по которой вы не можете получить доступ к файлам по индоду, состоит в том, что это не особенно полезно. Это как бы обходит права доступа к файлам, потому что если есть файл, который вы можете прочитать в папке, которую вы не можете прочитать или выполнить, то открытие inode позволит вам его обнаружить.
Причина, по которой это не очень полезно, заключается в том, что вам нужно найти номер инода через *stat()
вызовите, в этот момент у вас уже есть имя файла (или открытый файл)... или вам нужно угадать inum.
Из соображений безопасности - для доступа к файлу вам нужно разрешение на файл КАК ХОРОШО КАК разрешение на поиск во всех каталогах из корня, необходимых для доступа к файлу. Если бы вы могли получить доступ к файлу по индексу, вы могли бы обойти проверки на содержащихся каталогах.
Это позволяет вам создать файл, к которому может получить доступ набор пользователей (или набор групп), а не кто-либо другой - создать каталоги, доступные только пользователям (один каталог на пользователя), а затем жестко связать файл со всеми этими каталогами - сам файл доступен любому, но на самом деле доступ к нему может получить только тот, у кого есть разрешения на поиск в одном из каталогов, с которыми он связан.
В ответ на ваш комментарий: чтобы "передать файл", вы можете использовать fd, передавая через сокеты AF_LOCAL с помощью SCM_RIGHTS
(увидеть man 7 unix
).
Btrfs имеет ioctl для этого (BTRFS_IOC_INO_PATHS, добавленный в этот патч), однако он не пытается проверять разрешения на пути и просто зарезервирован для root.
Конечно, если вы уже искали файл по пути, вам не нужно делать это снова и снова?
stat(f,&s); i=open(f,O_MODE);
включает в себя два трала через структуру каталогов. Это приводит к потере циклов ЦП ненужными строковыми операциями. Да, хорошо спроектированный fs-кеш будет скрывать большую часть этой неэффективности от случайного конечного пользователя, но повторять работу без причины - некрасиво, если не просто глупо.