Node.js でfsを利用したファイル作成時の権限について、ハマってしまったので備忘のためにまとめました.
1.問題
fs.writeFileやfs.mkdirを実行した際の権限がうまく設定出来ませんでした.
例えば以下の処理ではwriteFileをmode指定なしで実行しています.
1 2 3 4 5 |
fs<span class="sh_symbol">.</span><span class="sh_function">writeFile</span><span class="sh_symbol">(</span><span class="sh_string">'message.txt'</span><span class="sh_symbol">,</span> <span class="sh_string">'Hello Node'</span><span class="sh_symbol">,</span> <span class="sh_keyword">function</span> <span class="sh_symbol">(</span>err<span class="sh_symbol">)</span> <span class="sh_cbracket">{ // defaultの0666になるはず</span> <span class="sh_keyword">if</span> <span class="sh_symbol">(</span>err<span class="sh_symbol">)</span> <span class="sh_keyword">throw</span> err<span class="sh_symbol">;</span> console<span class="sh_symbol">.</span><span class="sh_function">log</span><span class="sh_symbol">(</span><span class="sh_string">'It</span><span class="sh_specialchar">\'</span><span class="sh_string">s saved!'</span><span class="sh_symbol">);</span> <span class="sh_cbracket">}</span><span class="sh_symbol">); </span> |
公式ドキュメントのAPI説明を見ると次のような記載があり、0666が設定されるはずです.
mode
Number default =438
(aka0666
in Octal)
しかしながら、0644のファイルしか作成することが出来ませんでした.
明示的にmodeに設定しても(optionsに{ mode: 0666} を渡す)、効果はありませんでした.
2.原因
Linuxのumask設定が原因でした.
umask は、新しくファイルを作成する際に、許可*しない*ビットを示すものです。
touch等を利用してファイルを作成すると、デフォルトでは644 (rw-r–r–)の権限で作成されるのはこの仕組みのおかげです.
これが原因でファイルのpermissionがmode指定のものとは異なってしまっていました.
3.解決策
最初にumaskを0で初期化する=マスクが掛からない状態にすることで解決できます.
以下のコードをファイル処理する前に実行してあげることで、mode指定通りの権限付与ができました.
1 2 3 4 5 |
(function initMask() { console.log('default mask is ' + process.umask().toString(8)); process.umask(0);// init mask with zero. console.log('initialized mask is ' + process.umask().toString(8)); })(); |