権限のないユーザーとしてファイルを作成し、権限モードをに変更すると、400
ユーザーはそのファイルを読み取り専用として正しく表示します。
$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro
みんな大丈夫です。
ただし、ルートが表示されます。
# [ -w somefile ] && echo rw || echo ro
rw
間違いがありましたか?もちろん、ルートは読み取り専用ファイルに書き込むことができますが、このような習慣を持ってはいけません。ベストプラクティスでは、書き込み許可ビットをテストできる必要があることを示す傾向があり、そうでない場合は理由があるため設定されます。 。
私の考えでは、両方を理解したいと思います。なぜこのようなことが起きており、どのように私は1つ得ることができますか?間違った書き込みビットが設定されていないファイルをテストするときに戻りコードはありますか?
答え1
何か誤解されたと思います-w
。ファイルに「書き込み権限」があることを確認するのではなく、ファイルに書き込むことができることを確認します。移動するユーザー。
より具体的には、またはこれに似ているとしますaccess(2)
。
たとえば、スクリプトがある場合、スクリプトをif [ -w /etc/shadow ]
実行するとstrace
、次のような行が表示されることがあります。
faccessat(AT_FDCWD, "/etc/shadow", W_OK)
root
ファイルを書き込むことができるので、0が返されます。
たとえば、一般ユーザーの場合:
faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)
rootユーザーとして
faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0
これはマイコンピュータにライセンスがあるにもかかわらず発生します/etc/shadow
。000
---------- 1 root root 4599 Jan 29 20:08 /etc/shadow
今あなたがしたいことを得ました。興味深いそれほど簡単ではありません。
単純な権限を確認したい場合は、ls
出力を確認したり、電話stat
などを行うことができます。ただし、ACLがこれらの権限をオーバーライドできることに注意してください。ファイルに権限 400 があっても書き込みがブロックされるわけではありません。
答え2
test -w
別名[ -w
ファイルモードを確認しません。書き込み可能であることを確認してください。ルートの場合は実際にそうです。
$ help test | grep '\-w'
-w FILE True if the file is writable by you.
私がテストした方法は、stat(1)
(「%a
8進アクセス」)の出力に対してビットごとの比較を実行することでした。
(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro
の出力が8進数として解釈されるように、サブシェルにはプレフィックスが$(...)
必要です。0
stat
(( ... ))
答え3
rootユーザーは何をしたいかをすることができ、「一般」ファイル権限に制限はありません。足ターゲットの練習を防ぐために、eXecute権限なしで通常のファイルを直接実行しないでください。