Мне нужно это для модульного теста. Есть функция, которая делает lstat для пути к файлу, переданного в качестве его параметра. Я должен вызвать путь кода, где происходит lstat
сбой (потому что охват кода должен достигать 90%)
Тест может выполняться только под одним пользователем, поэтому мне было интересно, есть ли в Ubuntu файл, который всегда существует, но у обычных пользователей нет доступа для чтения к нему или к его папке. (Таким образом, lstat
произойдет сбой, если он не выполнен от имени пользователя root.)
Несуществующий файл не является решением, потому что для этого есть отдельный путь к коду, который я уже запускаю.
РЕДАКТИРОВАТЬ: Недостаток доступа только для чтения файла недостаточно. С этим lstat
еще можно выполнить. Я смог запустить его (на моей локальной машине, где у меня есть права доступа root), создав папку в / root и файл в ней. И установив разрешение 700 на папку. Поэтому я ищу файл, который находится в папке, доступной только пользователю root.
источник
/etc/shadow
/proc/1/fd/0
следует сделать.Ответы:
В современных системах Linux вы должны быть в состоянии использовать
/proc/1/fdinfo/0
(информацию для файлового дескриптора 1 (stdout) процесса с идентификатором 1 (init
в пространстве имен корневого pid, которое должно работать какroot
)).Вы можете найти список с (как обычный пользователь):
(удалите,
-type f
если вы не хотите ограничиваться обычными файлами)./var/cache/ldconfig/aux-cache
еще один потенциальный кандидат, если вам нужно только рассмотреть системы Ubuntu. Он должен работать на большинстве систем GNU, так как/var/cache/ldconfig
создается для чтения + записи + с возможностью поиска в корневом каталоге толькоldconfig
командой, поставляемой с GNU libc.источник
/proc/1/fdinfo/0
работает на Ubuntu 16.04 и 18.04, этого более чем достаточно./proc/1/fdinfo/0
не обязательно работает в контейнере (например, контейнере Docker), и часто модульные тесты выполняются в таких контейнерах в CI.Глядя на справочную страницу lstat (2), вы можете получить некоторое представление о случаях, которые могут привести к сбою с ошибками, отличными от ENOENT (файл не существует).
Самый очевидный из них:
Таким образом, вам нужен каталог, из которого вы не можете искать.
Да, вы можете найти тот, который уже есть в вашей системе (возможно,
/var/lib/private
если он существует?), Но вы могли бы также создать его самостоятельно, с эквивалентом:Операция lstat (2) завершится с ошибкой EACCES. (Удаление всех разрешений из каталога гарантирует это. Может быть, вам даже не нужно так много, и
chmod -x
удаления разрешений на выполнение будет достаточно, поскольку для доступа к файлам в нем необходимы разрешения на выполнение.)Есть еще один творческий способ сделать так, чтобы lstat (2) потерпел неудачу, посмотрев его справочную страницу:
Таким образом, попытка доступа к файлу, например,
/etc/passwd/nonexistent
должна вызвать эту ошибку, которая опять-таки отличается от ENOENT («Нет такого файла или каталога») и может удовлетворить ваши потребности.Еще один:
Но вам может понадобиться действительно длинное имя для этого (я думаю, что 4096 байт - это типичное ограничение, но ваша система / файловая система может иметь более длинное имя).
Наконец, трудно сказать, будет ли что-нибудь из этого действительно полезным для вас. Вы говорите, что хотите что-то, что не вызывает сценарий «файл не существует». Хотя обычно это означает ошибку ENOENT, на практике многие проверки более высокого уровня будут просто интерпретировать любые ошибки из lstat (2) как «не существует». Например,
test -e
или эквивалент[ -e ...]
из оболочки может просто интерпретировать все вышеперечисленное как «не существует», тем более что у него нет хорошего способа вернуть другое сообщение об ошибке, и не возвращая ошибку, можно предположить, что файл существует, что, безусловно, не так.источник
Вы можете сделать
find
это сами.Использование
/etc
- каталог файлов конфигурации в качестве отправной точки:В моей системе это ничего не возвращает.
Вы можете быть менее строгой и разрешить группу
root
(только пользовательroot
должен быть членом группыroot
), и искать разрешение440
:В моей системе это возвращает:
Редактировать:
Основываясь на ваших изменениях, вы ищете каталог, который не имеет достаточных прав для вызывающего пользователя, чтобы предотвратить листинг каталога:
здесь я ищу каталоги (
-type d
), в которых отсутствуют биты perm для чтения-записи-выполнения для других (o-rwx
) и которые принадлежатroot:root
.Технически, просто отсутствие
x
бита execute ( ) предотвратило бы каталог (lstat(2)
) в каталоге.В выводе я нашел
/run/systemd/inaccessible/
в моей системе на основе инициализации Systemd.Что касается файлов
/proc
,/sys
,/dev
:Эти файловые системы являются виртуальными ФС, то есть они находятся в памяти, а не на диске
Если вы планируете полагаться
/proc
, используйте,/proc/1/
т.е. полагайтесь на что-то в соответствии с PID 1, а не на любые более поздние PID для обеспечения надежности / согласованности, поскольку более поздние PID (процессы) не гарантируются.источник
find / -type d -perm 0400 -user root
я нашел каталог/proc/20/map_files/
, если я ссылаюсь на имя файла в этой папке, например/proc/20/map_files/asdasd
, он всегда терпит неудачу. Эта папка всегда существует в Ubuntu?/proc/1/
могут быть более безопасными, так как init всегда существует. Но этоproc
не обычная файловая система, если это имеет значение./proc/1/fdinfo/0
работает на современном Ubuntus.-perm o-rwx
это как-perm 0
биты все с начала. Вот, ты бы хотел! -perm -1
.