Я хотел бы понять, в каких случаях пользователю root может быть отказано в доступе к файлу. Я работаю на машине, которую я не настраивал (на моем персональном ноутбуке у меня, очевидно, нет этой проблемы), и у меня возникла эта проблема, которую можно свести к следующему:
touch test.sh &&\
echo 'echo $PATH' >> test.sh &&\
sudo sh test.sh
будет дать ошибку: sh: 0: Can't open test.sh
(bash: test.sh: Permission denied
с bash
).
Я попытался проверить, был ли я под SELinux, запустив getenforce
, но команда не была найдена.
Я пробовал sudo chown root test.sh
, но выдает ошибку: chown: cannot access 'test.sh': Permission denied
.
То же самое произошло при попытке изменить владельца каталога.
Я не обязательно прошу решение общей проблемы, но я хочу понять, как возможно, что root не имеет доступа.
РЕДАКТИРОВАТЬ
На том же компьютере, если я создаю локального пользователя (все вышеперечисленное было сделано как пользователь, вошедший в систему через общую сеть), все работает нормально.
tl; доктор, если Вы работаете
export PATH=.:$PATH # wrong
затем Ваш вышеупомянутый набор команд будет ~~ работать, ~~ однако избегают этого решения... Почему?..., когда Вы выполняете исполняемый файл, дающий его любой полный путь
/my/cool/binary
или относительный путь
./../cool/binary # notice this begins with a ./ period slash
Вы непосредственно управляете, куда исполняемый файл прибывает из... однако, если по ошибке или некоторым жуликом обрабатывают Ваш огибающий var, PATH обновляется с предварительно ожиданием dir, который содержит (неправильный или злонамеренный) исполняемые файлы с соответствием именам
export PATH=/wrong/dir:/hackers/own/dir:$PATH
и Вы просто используете
myexecutable_name # using naked binary name
Вы могли работать
/wrong/dir/myexecutable_name
когда Вы намеревались работать
/actual/good/dir/myexecutable_name
который является, почему производственный код или что-либо работают, поскольку корень должен явно обстоятельно объяснить, куда двоичный файл прибывает из
Теперь возвращаясь к Вашему исходному вопросу... Ваш код предполагает, что ПУТЬ включает текущий dir '.', который он не должен содержать для идентификаторов напоминания или корня
export PATH=.:$PATH # wrong - bad for root or prod id yet handy for dev folks
вместо этого выполните полный путь использования... проблема - Вы, хотят избежать возможности выполнения неправильного двоичного файла, который, оказывается, находится в Вашем текущем dir, когда Вы намеревались выполнить двоичный файл от стандартного dir, как определено в Вашем ПУТИ
Не убежденный? проведите некоторое качественное время с кодом важной инфраструктуры особенно, который является на пересечении между обязанностями..., где команда B двоичный файл выполняет двоичный файл от команды A, и Вы будете всегда видеть полный путь, используемый... другое вдохновение состоит в том, чтобы увеличить на конфликтах пространства имен