Linuxでは、特定のユーザーが書き込み可能な(または実際には書き込みできない)ファイルとディレクトリをすべて見つけるにはどうすればよいですか?
編集:明確にするために、システム全体ではなく、特定のサブディレクトリの下を意味しました。そして、はい、それは、そのユーザーが書けるようにするユーザー、グループ、および世界の書き込み可能性のすべての順列と組み合わせを意味します。これらのファイルのリストを取得するために1つまたはいくつかのライナーを実行することを望んでいました。
Findutilsバージョン4.3.0以降がインストールされている場合は、 'find'コマンドを使用します。
現在のユーザーが書き込み可能な現在のディレクトリ下のすべてのファイル:
find . -writable
現在のユーザーが書き込みできない現在のディレクトリ下のすべてのファイル:
find . ! -writable
マニュアルページによると:
多くのシステムはクライアントのカーネルにaccess(2)を実装しているため、このテストでは、access(2)システムコールを使用します。したがって、UIDマッピング(またはルートスカッシング)を実行するNFSサーバーに騙される可能性があります。サーバーに保持されているUIDマッピング情報。
Perlスクリプト(writable.pl
) このような:
#!/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
を適宜入力します。
あなたが投げ入れた場合のエディの答えは:
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
それが本当にあなたが聞きたい質問なのですか?
「Xアカウントが書き込み可能なすべてのファイルを確認したい」とは、u + wで所有するすべてのファイル、所属するグループが所有するすべてのファイル、g + wのセット、および書き込み可能なすべてのファイル(o + w)。
書き込み不可はさらに困難になります。すべてのファイルのリストを作成し、書き込み可能なファイルを除外する方がよいでしょう。
このコマンドはすべての書き込み可能なディレクトリを見つける必要があります。必要に応じて権限を変更できます。
find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;
これが最善の方法かどうかはわかりませんが、あなたが尋ねたとおりにする必要があります:
for file in *
do
if [ -w $file ] ; then
echo $file
fi
done
キーはもちろん-w
スイッチ、これも無効にできます
編集:これについてさらに考えると、このスクリプトは現在のユーザーが書き込み可能なものを出力しますが、特定のユーザーには明らかに機能しません。