Путь к символической ссылке можно следовать вручную, но `cd` возвращает Отказано в разрешении

1

Я пытаюсь получить доступ к каталогу /usr/software/test/agnostic. Есть несколько символических ссылок, участвующих в этом пути. Как вы можете видеть из приведенной ниже записи, я не могу перейти непосредственно к пути, но я могу проверять каждый шаг пути и переходить к каталогам с символическими ссылками, пока не достигну места назначения. Почему это? (и как мне это исправить?)

Ubuntu 12.10, bash

> ls /usr/software/test/agnostic
ls: cannot access /usr/software/test/agnostic: Permission denied

> cd /usr/software/test

> cd agnostic
bash: cd: agnostic: Permission denied

> pwd -P
/x/eng/localtest/arch/x86_64-redhat-rhel5

> ls -al | grep agnostic
lrwxrwxrwx  1 root  root    15 Oct 23  2007 agnostic -> noarch/agnostic

> ls -al | grep noarch
...
lrwxrwxrwx  1 root  root    23 Oct 23  2007 noarch -> /x/eng/localtest/noarch

> cd noarch

> cd agnostic
bash: cd: agnostic: Permission denied

> ls -al | grep agnostic
lrwxrwxrwx   1   5808 dip         4 Oct  5  2010 agnostic -> main

> cd main

> ls
(correct output of `ls`)

> pwd
/usr/software/test/noarch/main

> pwd -P
/x/eng/localtest/noarch/main
Ricket
источник
Почему бы тебе просто не сказать ls –l agnostic? (Используйте, ls –ld fooесли « foo» может быть каталогом.)
Скотт

Ответы:

2

Как задокументировано здесь :

Если у вас есть символическая ссылка в общем доступном для записи каталоге, в которой установлен бит закрепления, так что только владелец файла может удалить его (например, / tmp), только владелец символической ссылки может разыменовать его. Все остальные получат EACCES для любой операции, которая пытается это сделать, включая такие вещи, как попытка stat () символической ссылки. Если это происходит с вами, ваше ядро ​​Ubuntu будет регистрировать сообщения вроде:

non-matching-uid symlink following attempted in sticky world-writable directory by cat (fsuid 915 != 2315)
yama_inode_follow_link: 16 callbacks suppressed

Исправление должно повернуться kernel.yama.protected_sticky_symlinksк 0 (выключен).

Чтобы сделать это временно (чтобы проверить, исправит ли это вашу проблему):

sudo -i
echo 0 > /proc/sys/kernel/yama/protected_sticky_symlinks

Чтобы сделать изменение постоянным (начиная со следующей перезагрузки), добавьте строку в файл sysctl.conf:

echo "kernel.yama.protected_sticky_symlinks = 0" | sudo tee -a /etc/sysctl.conf
Ricket
источник
«Все остальные займутся EACCESлюбой операцией…, включая такие, как попытка stat()использовать символическую ссылку». Если это то, что происходит, почему вы смогли получить ls –lинформацию в любой момент?
Скотт
ls -lиспользуется lstat()для получения информации о ссылке и readlink()для получения содержимого ссылки. Я полагаю, это не дает прозрачного разыменования.
15