Sua resposta está no primeiro resultado que você forneceu:
$ stat /home/jzhu/other
File: '/home/jzhu/other' -> '/root/other/'
Isso mostra que /home/jzhu/other
é um link simbólico para /root/other
.
Então, basicamente, para acessar qualquer coisa em /home/jzhu/other/
você precisará acessar /root/other
. Isso significa que seu usuário deve ter permissões de execução em /root
e /root/other
.
Em seguida, vamos para este comando:
$ stat /home/jzhu/other/
stat: cannot stat '/home/jzhu/other/': Permission denied
A razão pela qual isso falha e a que está acima funciona é por causa do /
. Em qualquer comando que trabalhe com um caminho, se o componente final desse caminho (por exemplo: other
) for um symlink, e o caminho terminar com um /
, então qualquer chamada de sistema para operar nesse caminho tentará desreferencia o link simbólico e opere o que o link simbólico aponta para o próprio link simbólico.
Soluções:
Existem duas soluções possíveis para isso.
1. Alterar permissões em /root/other
:
Como mencionado, adicione o recurso de execução a /root
e /root/other
. Você pode fazer isso com atributos básicos ou estendidos do sistema de arquivos.
-
Você pode adicionar o usuário
jzhu
ao gruporoot
(usermod -a -G root jzhu
) e adicionar a execução do grupo ao caminho (chmod g+x /root; chmod g+x /root/other
).
Esta não é uma solução ideal, pois concede o seu acesso a qualquer coisa restrita ao gruporoot
. -
Use as ACLs do sistema de arquivos.
setfacl -m u:jzhu:x /root setfacl -R -m u:jzhu:x /root/other setfacl -d -R -m u:jzhu:x /root/other
Isso faz com que seu usuário específico obtenha acesso de execução a
/root/other
e qualquer coisa dentro dele.
Ainda não é ideal como se esses recursos fossem compartilhados, eles não deveriam estar no diretório pessoal do root.
Note que em ambas as soluções nós apenas concedemos o bit execute ( x
). O bit de execução é necessário em um diretório para um usuário acessar qualquer coisa dentro desse diretório. No entanto, você também precisa do bit de leitura ( r
) para poder listar ( ls
) o diretório. O que significa que sem o bit de leitura, você terá que saber exatamente onde /root/other
os arquivos estão. Se você quiser permitir a leitura, basta alterar o x
nos últimos 2 setfacl
de comandos para rx
(por exemplo, -m u:jzhu:rx
).
2. Mova os recursos para fora de /root/other
.
Esta é a solução preferida. Você pode se livrar do symlink em /home/jzhu/other
e criar um diretório em seu lugar, ou colocá-los em um local compartilhado em algum outro lugar do sistema (sem saber o que é, eu não posso recomendar uma boa localização embora).
A razão pela qual essa é a solução preferida é que, se esses recursos forem compartilhados entre os usuários, eles não pertencerão a um usuário específico e não deverão estar no diretório inicial desse usuário.