Я получаю неожиданное поведение при проверке разрешений на чтение файлов с использованием встроенной программы bash test в образе докера ubuntu: 21.04. При запуске test -r для файлов, для которых у пользователя есть разрешение на чтение, значение выхода равно 1. Файл доступен для чтения всем. Насколько я могу судить, это происходит со всеми файлами, независимо от разрешений или происхождения файла (изображение vs скопировано или смонтировано). Как заставить test -r FILE или [ -r FILE ] работать правильно?
Кроме того, если бы кто-нибудь мог протестировать это на неконтейнерной установке Ubuntu 21.04, я был бы признателен. У меня нет доступа к хосту 21.04.
Следующее было выполнено в play-with-docker, чтобы убедиться, что моя конфигурация / среда не является причиной.
[node1] (local) [email protected] ~
$ docker run --rm -it ubuntu:21.04 ls -l /bin/bash
-rwxr-xr-x 1 root root 1404744 Mar 19 16:02 /bin/bash
[node1] (local) [email protected] ~
$ docker run --rm -it ubuntu:21.04 /bin/bash -c 'test -r /bin/bash && echo readable || echo not readable'
not readable
Решено См. Обновление 2
I have tried tracing
test -r FILEwithstrace. If I understand the documentation correctly, strace is supposed to exit with the same code as the traced program. The output ofstraceindicates thattestis exiting with0. From the strace output:... access("/bin/bash", R_OK) = 0 ... +++ exited with 0 +++I have confirmed that the exit code from strace is, in fact
0.&>/dev/null; echo $? 0 ```
При запуске ubuntu: 20.04 поведение такое, чего я ожидал:
[node1] (local) [email protected] ~
$ docker run --rm -it ubuntu:20.04 /bin/bash -c 'test -r /bin/bash && echo readable || echo not readable'
readable
Версия bash изменилась с 20.04 на 21.04, но, похоже, это не проблема.
[node1] (local) [email protected] ~
$ docker run --rm -it bash:5.1.4 /usr/local/bin/bash -c 'test -r /usr/local/bin/bash && echo readable || echo not readable'
readable
Это мой первый вопрос, поэтому, если вы считаете, что вопрос можно улучшить, предлагайте свои предложения.
test -x, но не с test -ftest -x
[node1] (local) [email protected] ~
$ docker run --rm -it ubuntu:20.04 /bin/bash -c 'test -x /bin/bash; echo $?'
0
[node1] (local) [email protected] ~
$ docker run --rm -it ubuntu:21.04 /bin/bash -c 'test -x /bin/bash; echo $?'
1
test -f
[node1] (local) [email protected] ~
$ docker run --rm -it ubuntu:20.04 /bin/bash -c 'test -f /bin/bash; echo $?'
0
[node1] (local) [email protected] ~
$ docker run --rm -it ubuntu:21.04 /bin/bash -c 'test -f /bin/bash; echo $?'
0
Я пробовал те же команды test -r на zsh, и zsh работает должным образом. Это интересно, потому что bash: 5.1.4 работает правильно. Также стоит отметить, что /bin/sh ведет себя так же, как /bin/bash.
Еще я обнаружил, что есть исполняемый файл /bin/test. Программа /bin/test работает как положено. При запуске strace test -r /bin/bash я фактически отслеживал /bin/test, а не встроенный в bash test. Теперь, когда я могу сравнить результаты трассировки встроенной программы bash, встроенной функции zsh и /bin/test, я немного лучше понимаю проблему.
faccessat2access и работает должным образомaccess и работает должным образомfaccessat2 и работает ли нет должным образомПохоже, что системный вызов faccessat2 был введен в ядре Linux 5.8, так что, возможно, это ошибка ядра?





Кстати, если вам нужна встроенная программа, используйте
builtin test.