lnは、許可なしに存在しないターゲット/ターゲットへのシンボリックリンクを生成しません。

lnは、許可なしに存在しないターゲット/ターゲットへのシンボリックリンクを生成しません。

まず、私は共有サーバー上にあり、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

この場合、他のシェルを起動しようとすると、次のエラーメッセージが表示されます。

bash
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory

つまり、エラーメッセージは次のlnことを意味できます。宛先ディレクトリもう存在しません。ディレクトリは削除されましたが、開いたファイルとして扱われます。シェルがそのファイルを開いたままにしたため、シェルはまだそのファイルにアクセスできますが、新しいプロセスではアクセスできません。

cd ..エラーが発生する可能性もあります。

cd ..
chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
cd ~/tmp
ls
<< directory is empty >>

関連情報