削除できないようにシンボリックリンクをどのようにロックできますか?
これは通常のファイル/ディレクトリを使用して可能ですchattr +i /file/location
が、シンボリックリンクを使用してこれを達成するにはchattr: Operation not supported while reading flags on my-file
。
同様の質問がありますが、「/etc/resolv.conf」に「chattr +i」を設定するには?しかし、ここに適用できるソリューションはありません。
答え1
これは解決策を提供しませんが、chattr
シンボリックリンクを不変にすることができない理由を説明します。
Linuxでは、不変属性は使用されるフラグのセットの一部ですFS_IOC_SETFLAGS
ioctl
。歴史的には、これはext2で最初に実装されており、chattr
まだですe2fsprogs
。検索フラグchattr
、処理中のファイルが通常のファイルかディレクトリかを設定する前に明示的に確認してください。
if (!lstat(name, &buf) &&
!S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
goto notsupp;
}
これらのチェックを削除したり、シンボリックリンクを許可するように変更することは、シンボリックリンクを変更できないようにするための良い最初のステップであると思うかもしれませんが、chattr
その直後に次の障害が発生します。
fd = open (name, OPEN_FLAGS);
if (fd == -1)
return -1;
r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);
ioctl
ファイル記述子で動作します。つまり、フラグを設定する前にターゲットを開く必要があります。のシンボリックリンクを開けませんioctl
。open
O_NOFOLLOW
そしてシンボリックリンクをサポートするO_NOPATH
と、前者はそれ自体が失敗し、ELOOP
後者は一緒に使用できないファイル記述子を返しますioctl
。
答え2
シンボリックリンクはchattrをサポートしていませんが、バインドマウントを使用して削除できないリンクを作成できます。
ディレクトリの場合:
$ mkdir a b
$ echo a>a/ok
$ sudo mount --bind a b
$ cat b/ok
a
$ rmdir b
rmdir: failed to remove 'b': Device or resource busy
ファイルの場合:
$ mkdir c d
$ echo c>c/ok
$ echo d>d/ok
$ sudo mount --bind c/ok d/ok
$ cat d/ok
c
$ rm d/ok
rm: cannot remove 'd/ok': Device or resource busy
答え3
コメントできないので:
chattrは、chmod、fchmod()、またはfchmodat()システムコールのいずれかを使用するか、ioctl(シンボリックリンクについては何も言及しません)を使用する可能性があります。しかし、今は何も見つかりません。ここではUbuntuのマニュアルページを使用してください。これらの一部が変更された可能性があります。
chmodのマニュアルページから:
chmod はシンボリックリンクの権限を変更しません。 chmod システムコールはその権限を変更できません。シンボリックリンクの権限は絶対に使用されないため、これは問題ではありません。ただし、コマンドラインにリストされているすべてのシンボリックリンクに対して、chmodはポインティングファイルの権限を変更します。代わりに、chmodは再帰ディレクトリの探索中に見つかったシンボリックリンクを無視します。
fchmod、chmod、およびfchmodatシステムコールのマニュアルページを見ると、どちらも実装しません。 Chmod-ingはパス参照のみを解放し、fchmodat()システムコールはまだAT_SYMLINK_NOFOLLOWを実装していません。
AT_SYMLINK_NOFOLLOWパス名がシンボリックリンクの場合は、それを逆参照せずに、代わりにリンク自体で作業してください。このフラグは現在実装されていません。