背景 HTMLがシンボリックリンクを介してファイルにアクセスできない方法を見つけようとしています。 Apacheがsimlinkを介して指定されたファイル数を計算/アクセスする方法を理解するために、次の簡単な実験を行いましたが、なぜ動作しないのか理解できません。
ユーザーjzhuとして、私はanaconda-ks.cfgファイルを含むルートディレクトリのotherというディレクトリを指すホームディレクトリにシンボリックリンクを持っています。ただし、statコマンドを実行すると、次の結果が表示されます。
[jzhu@localhost ~]$ stat /home/jzhu/other/anaconda-ks.cfg
stat: cannot stat `/home/jzhu/other/anaconda-ks.cfg': Permission denied
以下は、/home/jzhu/otherシンボリックリンクへのstatコマンドです。設定方法の詳細を理解できます。
[jzhu@localhost ~]$ stat /home/jzhu/other
File: `/home/jzhu/other' -> `/root/other/'
Size: 12 Blocks: 0 IO Block: 4096 symbolic link
Device: fd00h/64768d Inode: 43313 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:52:20.602126433 +0000
Modify: 2013-11-03 08:52:20.187918394 +0000
Change: 2013-11-03 08:52:20.187918394 +0000
lstatのマニュアルページを参照すると、次の引用があります。
この関数はファイルに関する情報を返します。ファイル自体には権限は必要ありませんが、stat()、lstat()の場合、ファイルパス内のすべてのディレクトリに対して実行(検索)権限が必要です。
私が理解したところ、statコマンドには/ root自体に対する実行権限は必要ありません。これは、lstatとは異なり、このコマンドが実行されるルートディレクトリは実行中の現在のディレクトリであるためです。これは、「/」のフルパスを使用しないことを意味します。 root/other/"、しかし"/home/jzhu/other/"パスが使用されます。
lstat("/home/jzhu/other/anaconda-ks.cfg", 0x7fff14d5a7c0) = -1 EACCES (Permission denied)
したがって、このファイルの数を数えるには、/home /home/jzhu および /home/jzhu/other に対する実行権限だけが必要です。
jzhuとして/homeと/home/jzhuの統計を実行し、実行権限があることを確認しました。次のように
[jzhu@localhost ~]$ stat /home/
File: `/home/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 2278 Links: 4
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:52:13.797724760 +0000
Modify: 2013-11-04 00:03:45.377150769 +0000
Change: 2013-11-04 00:03:45.377150769 +0000
[jzhu@localhost ~]$ stat /home/jzhu
File: `/home/jzhu'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 43317 Links: 3
Access: (0700/drwx------) Uid: ( 500/ jzhu) Gid: ( 500/ jzhu)
Access: 2013-11-04 00:00:30.809916040 +0000
Modify: 2013-11-03 23:49:54.781060426 +0000
Change: 2013-11-03 23:49:54.781060426 +0000
しかし、/home/jzhu/otherをjzhuとして計算することはできません。
[jzhu@localhost ~]$ stat /home/jzhu/other/
stat: cannot stat `/home/jzhu/other/': Permission denied
また、もう一度変更し、ディレクトリからstatを実行しました。なぜディレクトリをjzhuに設定できないのか混乱しています。以下に示すように、他にはそのディレクトリに対する読み取りおよび実行権限があります。
[root@localhost jzhu]# stat /home/jzhu/other/
File: `/home/jzhu/other/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 32674 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:50:36.935318703 +0000
Modify: 2013-11-03 08:50:35.772737444 +0000
Change: 2013-11-03 08:50:35.772737444 +0000
[root@localhost jzhu]# stat /home/jzhu/other/anaconda-ks.cfg
File: `/home/jzhu/other/anaconda-ks.cfg'
Size: 985 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 43297 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:50:35.772737444 +0000
Modify: 2013-11-03 08:50:35.781741701 +0000
Change: 2013-11-03 08:54:50.814196796 +0000
だから私が尋ねたい質問は次の2つです。
- そのディレクトリの他のエントリに対する読み取りおよび実行権限があるにもかかわらず、/home/jzhu/other/をstatできないのはなぜですか?
- anaconda-ks.cfgファイルを計算できないのはなぜですか?
答え1
あなたの答えはあなたが提供した最初の出力にあります。
$ stat /home/jzhu/other
File: `/home/jzhu/other' -> `/root/other/'
これはこれがシンボリック/home/jzhu/other
リンクであることを示します/root/other
。
/home/jzhu/other/
したがって、基本的に体内のすべてのアイテムにアクセスするにはアクセスが必要です/root/other
。つまり、ユーザーには、および/root
に対する実行権限が必要です/root/other
。
次に、このコマンドを進めましょう。
$ stat /home/jzhu/other/
stat: cannot stat `/home/jzhu/other/': Permission denied
上記の操作が成功している間にこれが失敗する理由は、/
パスを使用するコマンドで、パスの最後のコンポーネント(たとえばother
)がシンボリックリンクであり、パスが末尾で終わる場合、/
そのパスに対するすべての操作です。システムコールはシンボリックリンクを逆参照し、シンボリックリンク自体ではなくシンボリックリンクが指すターゲットを操作しようとします。
解決策:
これには2つの考えられる解決策があります。
1.権限の変更/root/other
:
前述のとおりに実行/root
機能を追加します/root/other
。デフォルトまたは拡張ファイルシステムプロパティを使用してこれを実行できます。
ユーザーをグループ()
jzhu
に追加し、グループの実行をパス()に追加できます。これは、そのグループに制限されているすべてのアイテムにアクセスできるようにするため、理想的なソリューションではありません。root
usermod -a -G root jzhu
chmod g+x /root; chmod g+x /root/other
root
ファイルシステムACLを使用します。
setfacl -mu:jzhu:x /root setfacl -R -mu:jzhu:x /root/others setfacl -d -R -mu:jzhu:x /root/その他
/root/other
これにより、特定のユーザーはそのエントリとその中のすべてのエントリに対する実行アクセス権を取得できます。
これらのリソースは共有され、ルートのホームディレクトリにあってはいけないため、まだ理想的ではありません。
両方のソリューションが実行(x
)ビットのみを与えることに注意してください。ユーザーがそのディレクトリ内のエントリにアクセスするには、ディレクトリに実行ビットが必要です。ただし、r
()ディレクトリを一覧表示するには()ビットも読み取る必要がありますls
。これは、読み取りビットがない場合は、/root/other
ファイルがどこにあるかを正確に知る必要があることを意味します。読み取りを許可するには、x
最後の2つのコマンドを(たとえば)setfacl
に変更します。rx
-m u:jzhu:rx
2. リソースを外部に転送します/root/other
。
これが好ましい解決策です。からシンボリックリンクを削除し/home/jzhu/other
、その場所にディレクトリを作成したり、システムの他の場所の共有場所に配置したりできます(何かはわかりませんが、良い場所をお勧めできません)。
これが好ましい解決策である理由は、これらのリソースがユーザー間で共有されている場合は特定のユーザーに属しておらず、そのユーザーのホームディレクトリにはならないからです。