How do I find all files and directories writable by a specific user?
Solution 1:
Use the 'find' command if you have findutils version 4.3.0 or greater installed:
For all files under the current directory that are writable by the current user:
find . -writable
For all files under the current directory that are not writable by the current user:
find . ! -writable
According to the man page:
This test makes use of the access(2) system call, and so can be fooled by NFS servers which do UID mapping (or root-squashing), since many systems implement access(2) in the client’s kernel and so cannot make use of the UID mapping information held on the server.
Solution 2:
You can create a Perl script (writable.pl
) like this:
#!/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]);
and then use this script, as root, as follows:
su USERNAME -c "./writable.pl DIRECTORY"
filling in USERNAME
and DIRECTORY
as appropriate.
Solution 3:
This command should find all writable directories, you can change the permissions as you see fit:
find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;