特定のユーザーが書き込み可能なすべてのファイルとディレクトリを見つけるにはどうすればよいですか?


10

Linuxでは、特定のユーザーが書き込み可能(または実際には書き込み不可)であるすべてのファイルとディレクトリを見つけるにはどうすればよいですか?

編集:明確にするために、私はシステム全体ではなく、特定のサブディレクトリの下にあることを意味しました。そして、はい、それはそのユーザーが書くことを可能にするユーザー、グループ、そして世界の書き込み可能性のすべての順列と組み合わせを意味します。これらのファイルのリストを取得するために、1つまたはいくつかのライナーを実行することを望んでいました。


さて、答えてくれてありがとう。私はすでにグーグル経由で「見つける」ソリューションを見つけましたが、それを特定のユーザーに一般的に適用する方法があるかどうか疑問に思っていました。ユーザーとしてsuし、findコマンドを実行する以外に方法はないようです-他の誰かがチャイムを鳴らさない限り?明日、オフィディアンの回答を受け入れます。
ピストス

回答:


18

findutilsバージョン4.3.0以降がインストールされている場合は、 'find'コマンドを使用します。

現在のユーザーが書き込み可能な現在のディレクトリ下のすべてのファイル:

find . -writable

現在のユーザーが書き込めない現在のディレクトリ下のすべてのファイル:

find . ! -writable

マニュアルページによると:

このテストはaccess(2)システムコールを利用するため、多くのシステムがクライアントのカーネルにaccess(2)を実装しているため、UIDマッピング(またはルートスカッシング)を実行するNFSサーバーに騙される可能性があります。サーバーに保持されているUIDマッピング情報。


4
さらに編集するために言及したいと思いました:実際には、ログインシェル(/ sbin / nologin)を持っていないユーザーでこれを行わなければなりませんでした。そのために、次のようにsudoを使用しました:sudo -u nobody find。!-writable
Pistos

これは質問に答えないので、受け入れられた答えであってはなりません。問題は、「現在のユーザー」ではなく、「特定のユーザー」に関するものでした。
jlh 2017

そして、アクセス許可を非表示にするには、エラーを追加2>&1 | grep -v "Permission denied"しますfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

次の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適宜。


優秀な。ありがとうございました。$ ARGV [0]は、CentOS 6.2のbashシェルでは空と見なされます。なぜだかわかりません。ファイルから読み取るようにスクリプトを変更しました。
2013

1

それが本当にあなたが聞きたい質問なのですか?

「Xアカウントが書き込み可能なすべてのファイルを確認したい」とは、u + wで所有しているすべてのファイル、所属するグループが所有しているすべてのファイル、g + wのセット、書き込み可能なすべてのファイル(o + w)。

書き込み不可はさらに困難になります。すべてのファイルのリストを作成し、書き込み可能なファイルを除外したほうがよいでしょう。


3
もちろん、システムでACLが有効になっていると、さらに複雑になります。
Zoredache

2
chattr + iファイルをカウントしない
Matt Simmons、

1

あなたが投げ入れた場合のエディの答えは:

my $path = quotemeta shift;

次に、名前にスペースが含まれているディレクトリも走査します。


1

この例では、-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

1

このコマンドはすべての書き込み可能なディレクトリを見つける必要があります。必要に応じて権限を変更できます。

find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;

0

これが最善の方法かどうかはわかりませんが、あなたが尋ねたとおりにすべきです:

for file in *
do 
    if [ -w $file ] ; then 
        echo $file
    fi
done

キーはもちろん-wスイッチ内にあり、これも無効にすることができます

編集:これについてもっと考えると、このスクリプトは現在のユーザーが書き込み可能なものを出力しますが、特定のユーザーには明らかに機能しません。


もちろん、このスクリプトはそのユーザーとして実行する必要があります。
Eddie

ええ、考えました...
Slartibartfast

これをperlでどのように書きますか?
ealeon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.