![未经许可,ln 不会创建指向不存在的目标/目标的符号链接](https://linux22.com/image/223580/%E6%9C%AA%E7%BB%8F%E8%AE%B8%E5%8F%AF%EF%BC%8Cln%20%E4%B8%8D%E4%BC%9A%E5%88%9B%E5%BB%BA%E6%8C%87%E5%90%91%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E7%9B%AE%E6%A0%87%2F%E7%9B%AE%E6%A0%87%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5.png)
首先请注意,我在共享服务器上并且没有 root 访问权限,因此任何涉及 su 或 sudo 的操作都是不可能的。
AFAIK ln 和 Linux 甚至不应该费心检查符号链接的目标是否存在或者用户是否有权访问它。但由于某种原因,这种情况发生了:
[email protected] [~/tmp/test]# ls -la
total 8
drwxr-xr-x 2 user user 4096 Aug 17 14:52 ./
drwxr-xr-x 13 user user 4096 Aug 17 14:52 ../
[email protected] [~/tmp/test]# ln -s target a
ln: failed to create symbolic link 'a': No such file or directory
[email protected] [~/tmp/test]# ls -la
total 8
drwxr-xr-x 2 user user 4096 Aug 17 14:52 ./
drwxr-xr-x 13 user user 4096 Aug 17 14:52 ../
[email protected] [~/tmp/test]# touch target
[email protected] [~/tmp/test]# ls -la
total 8
drwxr-xr-x 2 user user 4096 Aug 17 14:53 ./
drwxr-xr-x 13 user user 4096 Aug 17 14:52 ../
-rw-r--r-- 1 user user 0 Aug 17 14:53 target
[email protected] [~/tmp/test]# ln -s target a
[email protected] [~/tmp/test]# ls -la
total 8
drwxr-xr-x 2 user user 4096 Aug 17 14:53 ./
drwxr-xr-x 13 user user 4096 Aug 17 14:52 ../
lrwxrwxrwx 1 user user 6 Aug 17 14:53 a -> target
-rw-r--r-- 1 user user 0 Aug 17 14:53 target
[email protected] [~/tmp/test]#
正如您所看到的,ln 将拒绝创建指向不存在目标的符号链接。
此外,它会拒绝创建指向我没有读取权限的目标、位于我没有读取权限的目录中的目标,甚至是我有权限的文件的符号链接。到任何父目录一直到根目录。
我也尝试过使用 Python 的 os.symlink() 函数,它遇到了同样的问题。
我真的很困惑这里。
答案1
您是否可能使用另一个会话来删除您所在的目录?
我可以通过以下方式重现错误消息:
mkdir -p ~/tmp/test
cd ~/tmp/test
<< in another window: rmdir ~/tmp/test >>
ln -s target a
ln: failed to create symbolic link 'a': No such file or directory
在这种情况下,即使尝试启动另一个 shell 也会导致错误消息:
bash
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
换句话说,错误消息ln
可能意味着目标目录不复存在。该目录被视为已删除但仍打开的文件:您的 shell 已将其打开,因此 shell 仍可以访问它,但任何新进程都不能访问它。
甚至cd ..
会导致错误:
cd ..
chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
cd ~/tmp
ls
<< directory is empty >>