ファイルへのシンボリックリンクを計算できません。

ファイルへのシンボリックリンクを計算できません。

背景 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つです。

  1. そのディレクトリの他のエントリに対する読み取りおよび実行権限があるにもかかわらず、/home/jzhu/other/をstatできないのはなぜですか?
  2. 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に追加し、グループの実行をパス()に追加できます。これは、そのグループに制限されているすべてのアイテムにアクセスできるようにするため、理想的なソリューションではありません。rootusermod -a -G root jzhuchmod 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、その場所にディレクトリを作成したり、システムの他の場所の共有場所に配置したりできます(何かはわかりませんが、良い場所をお勧めできません)。

これが好ましい解決策である理由は、これらのリソースがユーザー間で共有されている場合は特定のユーザーに属しておらず、そのユーザーのホームディレクトリにはならないからです。

関連情報