web-dev-qa-db-ja.com

777モードにもかかわらずファイルのアクセス許可が拒否されました

CentOS 6.10 64ビットで権限拒否エラーが発生する

「#」はルートレベルのユーザープロンプトを示します。

# cd /tmp
# chmod 777 file*
# /bin/ls -l file*
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_00.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_01.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_02.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_03.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_04.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_05.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_06.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_07.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_08.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_09.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_10.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_11.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_12.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_13.dat
-rwxrwxrwx 1 Apache apache   824 Sep 17 17:15 file_14.dat
-rwxrwxrwx 1 Apache apache     1 Sep 17 17:15 file_15.dat
# cat file* > file.dat
cat: file_00.dat: Permission denied
cat: file_02.dat: Permission denied
# /bin/ls -l file.dat
-rw-rw-r-- 1 root   root   10713 Sep 17 17:32 file.dat

フルファイルのサイズは10713、つまり824 * 13 + 1です。つまり、ファイル「00」と「02」以外のすべてのファイルが正常にコピーされました。成功したコピーは12361バイト、824 * 15 + 1になります。ただし、これらの2つのファイルに違いはありませんが、マシンがそれらのファイルの読み取りを拒否している点が異なります。

コマンド「chmod 777」は、状況を強調するためだけに冗長です。このコマンドを実行する前は、権限はすべて「-rw-r--r--」の形式でした。これは、権限拒否エラーが発生しないことを意味します。

「。」はありません。パーミッションに関しては、理論的には、Selinuxは関与すべきではありませんが、関与しているとしても、なぜ2つのファイルしか選択しないのですか?

私はこれらのファイルを作成するプロセスを繰り返すことができ、それが読めないように別のファイルのセットを選択します。誰かが説明と修正をしていますか?

更新:

ファイルを作成するプロセスを変更しました。以前は、XLSXファイルをチャンクに分割して巨大なサイズのスプレッドシートをアップロードできるようにするJavaScriptクライアントからデータを受信して​​いました。サーバーは、チャンクをbase64として受信し、各チャンクをバイナリにデコードしてから、一時ファイルに保存して、最終的なXLSXファイルに連結します。

現在は、各一時チャンクをbase64(100%ASCII)として保存しています。すべてのチャンクがアップロードされると、各ファイルが読み取られ、、次にバイナリにデコードされ、最終的なXLSXファイルに追加されます。

正常に動作します。そのままにしておこうと思います。

テストとして、base64チャンクの1つを読み取り、それをバイナリにデコードして保存する簡単な3行プログラムを作成しました。それから私は結果を読んでみました。何だと思う? バイナリファイルへのアクセスが拒否されました。

したがって、明らかに、ファイルを読み取り不可能にするのは、ファイル内のデータパターンです。

この方法を使用すると問題は解決しますが、バイナリデータのパターンの内部で、ファイルに「アクセス許可が拒否されました」というエラーがどのように作成されるかを知りたいoutside

5
UncaAlby

最終更新

私たちのサービスプロバイダーは、Red-Hat Linuxアンチウイルスプログラムを実行していることがわかりました。明らかに、私は知らなかった。

ウイルス対策をオフにすると、すべてのファイルが魔法のように読み取り可能になります。それを再びオンにすると、特定のいくつかのファイルがウイルスのシグネチャと一致します。

アンチウイルスは、実行可能ファイルを探している必要があります。 (問題が表面化したとき、ファイルは元々モード644でした)

別のエラーメッセージがあるはずです。

しかたがない。今後は、ファイルをBase64でエンコードし、問題を解決します。

助けてくれたすべての人に再び感謝します。

2
UncaAlby

ファイル属性が設定されている可能性があります。 lsattrコマンドで一覧表示してみてください。次に、chattr -[acdeijstuADST] filenameを使用してactivr属性を設定解除できます。

詳細は man chattr で確認できます。

1
affan