web-dev-qa-db-ja.com

特別なLinuxファイル属性を持つファイルを検索することは可能ですか?

次のように特定のファイル属性を持つLinuxOSのファイルを検索することは可能ですか:---S--l---

---S--l---  1  root    root          0 Mar  1004:25/opt/csTuner/iba/wys/tuer_lolk

パーミッションの[〜#〜] s [〜#〜]とは:

S-変更はディスクに同期的に書き込まれます。これは、ファイルのサブセットに適用される「同期」マウントオプションと同等です。

私の目標は、ディスクに同期的に書き込まれているファイルを検索することです。

1
maihabunash

質問の例は、lsattr出力ではなく、_ls -l_出力のように見えます。 _ls -l_出力では、最初のフィールドはmode、つまりタイプ(通常、ディレクトリ、シンボリックリンク...)とアクセス許可です。

その位置のSビットはsetuidを意味しますが、ユーザーの実行権限はありません。ここでは、ユーザー/グループ/その他のいずれにも実行権限がないことを考えると、それはほとんど意味がありません。 lは、setgidビットが設定されているが実行されていないことを意味します。通常のファイルの場合、これは必須ロックが有効になっているファイルを意味します。

ここでは、ファイルが_chmod 6000_ではなく_chmod 600_などの間違った権限で作成された可能性があります。

ここで、参照している「同期」Sビットは、lsattrの出力用です。

Linuxで_chattr +S file_を実行すると、_lsattr file_の出力は次のようになります。

_--S----------e-- file
_

そのようなフラグを持つファイルを見つけるには:

ファイル名に改行文字が含まれていない場合は、次のようにすることができます。

_find . ! -type l -exec lsattr -d {} + | sed -n 's/^[^ ]*S[^ ]* //p'
_

行上のSの位置または_-------_部分の長さは、_e2fsprogs_のバージョン間で同じであるとは限らないことに注意してください。

ファイル名に改行文字が含まれないことを保証できない場合は、代わりに次のようにすることができます。

_(find .//. ! -type l -exec lsattr -d {} +; echo //) |
  sed -ne '/\/\//!{H;d;}' -e 'x; s|^[^ ]*S[^ ]* .//.|./|p'
_

(各ファイル名の先頭は_​​.//_で識別されます)。

2
find -perm

あなたが望むものです-それはあなたが 'find'の8進モードを指定することを可能にします...まあ、find。

'stat'で検索するパーマを見つけることができます。これにより、現在のパーマがわかります。

だから例えば.

find . -perm 4750

私はあなたのビットフラグをそれらの8進モードをあなたに伝えるのに十分に認識していないので、あなたはあなた自身を探す必要があるでしょう。

編集:指摘したように、これらは「通常の」ファイル権限ではなく、chattr属性です。だからあなたは少し違うことをしなければなりません。私は次のようにアプローチします:

#!/usr/bin/Perl

use strict;
use warnings;


open ( my $attrs, "|-", "lsattr -R /path" );

while ( <$attrs> ) {
   my ( $attrs, $filename ) = split; 
   if ( $attrs =~ m/S/ ) { 
        print $filename;
   }
}

close ( $attrs );

おそらく代わりに:

lsattr -R | grep '^[-A-Za-z]*S[-A-Za-z]* '
2
Sobrique