Linuxでは、特定のユーザーが書き込み可能(または実際には書き込み不可)であるすべてのファイルとディレクトリを見つけるにはどうすればよいですか?
編集:明確にするために、私はシステム全体ではなく、特定のサブディレクトリの下にあることを意味しました。そして、はい、それはそのユーザーが書くことを可能にするユーザー、グループ、そして世界の書き込み可能性のすべての順列と組み合わせを意味します。これらのファイルのリストを取得するために、1つまたはいくつかのライナーを実行することを望んでいました。
Linuxでは、特定のユーザーが書き込み可能(または実際には書き込み不可)であるすべてのファイルとディレクトリを見つけるにはどうすればよいですか?
編集:明確にするために、私はシステム全体ではなく、特定のサブディレクトリの下にあることを意味しました。そして、はい、それはそのユーザーが書くことを可能にするユーザー、グループ、そして世界の書き込み可能性のすべての順列と組み合わせを意味します。これらのファイルのリストを取得するために、1つまたはいくつかのライナーを実行することを望んでいました。
回答:
findutilsバージョン4.3.0以降がインストールされている場合は、 'find'コマンドを使用します。
現在のユーザーが書き込み可能な現在のディレクトリ下のすべてのファイル:
find . -writable
現在のユーザーが書き込めない現在のディレクトリ下のすべてのファイル:
find . ! -writable
マニュアルページによると:
このテストはaccess(2)システムコールを利用するため、多くのシステムがクライアントのカーネルにaccess(2)を実装しているため、UIDマッピング(またはルートスカッシング)を実行するNFSサーバーに騙される可能性があります。サーバーに保持されているUIDマッピング情報。
2>&1 | grep -v "Permission denied"
しますfind . -writable 2>&1 | grep -v "Permission denied"
次のwritable.pl
ようなPerlスクリプト()を作成できます。
#!/usr/bin/perl
use strict;
sub recurse {
my $path = shift;
my @files = glob "$path/{*,.*}";
for my $file (@files) {
if (-d $file) {
if ($file !~ /\/\.$/ && $file !~ /\/\.\.$/) {
recurse($file);
}
} else {
print "$file\n" if -w $file;
}
}
}
print "Writable files for " . getlogin() . "\n";
recurse($ARGV[0]);
次のように、このスクリプトをルートとして使用します。
su USERNAME -c "./writable.pl DIRECTORY"
充填USERNAME
し、DIRECTORY
適宜。
それが本当にあなたが聞きたい質問なのですか?
「Xアカウントが書き込み可能なすべてのファイルを確認したい」とは、u + wで所有しているすべてのファイル、所属するグループが所有しているすべてのファイル、g + wのセット、書き込み可能なすべてのファイル(o + w)。
書き込み不可はさらに困難になります。すべてのファイルのリストを作成し、書き込み可能なファイルを除外したほうがよいでしょう。
あなたが投げ入れた場合のエディの答えは:
my $path = quotemeta shift;
次に、名前にスペースが含まれているディレクトリも走査します。
この例では、-permフラグにgnu find構文を使用します。
基本的に-ACLのような奇抜な拡張機能を破棄する場合、所有者、グループ、および「その他の」書き込みアクセスの3つの選択肢があります。ループの仕事のように聞こえます。
これを最適化する余地はたくさんありますが、私はそれを他の人に任せます...また、ファイルシステムの検索と交差、およびその種のナンセンスの詳細をすべて思い出すことはできません。また、グループの出力が私のテストLinuxシステムのものと同じであることを確認してください
$ groups snoopy
snoopy : snoopy doghouse linus admin wwI woodstock
$
これは、ユーザーが書き込み可能なファイルを見つける方法の大まかな例です。これは任意のユーザーとして実行する場合ですが、uid0以外のユーザーとして実行すると、スクリプトを実行しているユーザーが読み取りと実行の両方の権限を持つディレクトリにあるものだけが見つかります。
#!/bin/sh
user=snoopy
directory=/
# first files owned by the user and writable
find "$directory" -follow -user "$user" -perm /u+w 2> /dev/null
# now for files that are group writable with the user in that group
for groups in $(groups snoopy 2> /dev/null | cut -f2 -d:)
do
find "$directory" -follow -group "$user" -perm /g+w 2> /dev/null
done
# now for everything else
find "$directory" -follow -perm /o+w 2> /dev/null
これが最善の方法かどうかはわかりませんが、あなたが尋ねたとおりにすべきです:
for file in *
do
if [ -w $file ] ; then
echo $file
fi
done
キーはもちろん-w
スイッチ内にあり、これも無効にすることができます
編集:これについてもっと考えると、このスクリプトは現在のユーザーが書き込み可能なものを出力しますが、特定のユーザーには明らかに機能しません。