CentOS上で開くことのできないファイルができる条件
CentOS、JBossEAP環境のJavaアプリケーションを作っています。
このアプリケーションにはファイルを出力する機能があります。
Aspose.Cellsという製品を使って、PDFやExcelを生成します。
おおむね、以下のような流れの処理です。
File.createTempFile()
を使って一時ファイルのパスを作る- 一時ファイルの
FileOutputStream
を作る (new FileOutputStream()
) - Aspose.Cellsにこの
FileOutputStream
や流し込むデータなどを渡し、帳票ファイルの中身を書き込んでもらう FileOutputStream
をclose
- 一時ファイルの
FileInputStream
を作る (new FileInputStream()
) - 一時ファイルから永続化のためDBにファイルをコピーする
この処理において、なぜか「パスワード付きPDF」や「パスワード付きExcel」を作った場合のみ、5でFileNotFoundException
(メッセージ:許可されていない操作です)が発生します。
パスワード付きか否かは、Aspose.Cellsへ渡すオプションであり、少なくともこちらで書いているコードは、このオプション設定以外は全く同じです。
更に調査を進めたところ、問題の一時ファイルについては、CentOS上からroot権限でもってcp
コマンドやstrings
コマンドでアクセスしようとした場合にも、「許可されていない操作です」というエラーが発生することが分かりました。
move
やrm
はできます。
move
したファイルをcp
しようとしても、「許可されていない操作です」になります。
分かっているのはここまでです。
もちろん最終的にはこれを解決する必要があるのですが、まず知りたいのは、このファイルがどのような状態のものなのか、です。
ファイル自体の権限を確認したところ、rw-r--r--
です。
少なくとも読み込みはできる権限だと思うのですが、なぜあのようなエラーが起きるのでしょうか?
同じディレクトリ内にある他のファイル(パスワード無しのPDFなど)は問題が起きないので、ディレクトリではなくファイル自体の問題ではないかと推測していますが。
なお、この一時ファイルの生成に使っているディレクトリは、/tmp
です。
/tmp
ディレクトリの権限設定は、rwxrwxrwt
です。
Linuxのファイルアクセス権限周りに疎いので、まずキーワードだけでも、この状態のファイルを表す説明を探しています。
====================================================
追加で調査した内容がありますので追記します。
問題のエラーが起きるファイルですが、Aspose.Cells以外の手段で作成したパスワード付きPDFでも発生します。
更に、そのPDFファイルをバイナリエディタで開き、ファイル先頭の"%PDF-"の部分のみを削除したところ、エラーが起きなくなりました。