Finding World-Writable Directories in Your $PATH

Problem

You want to make sure that there are no world-writable directories in root's $PATH. To see why, read Adding the Current Directory to the $PATH.

Solution

Use this simple script to check your $PATH. Use it in conjunction with su -or sudo to check paths for other users:

#!/usr/bin/env bash
# cookbook filename: chkpath.1
# Check your $PATH for world-writable or missing directories

exit_code=0

for dir in ${PATH//:/ }; do
    [ -L "$dir" ] && printf "%b" "symlink, "
    if [ ! -d "$dir" ]; then
        printf "%b" "missing\t\t"
          (( exit_code++ ))
    elif [ "$(ls -lLd $dir | grep '^d.......w. ')" ]; then
          printf "%b" "world writable\t"
          (( exit_code++ ))
    else
          printf "%b" "ok\t\t"
    fi
    printf "%b" "$dir\n"
done
exit $exit_code

For example:

# ./chkpath
ok              /usr/local/sbin
ok              /usr/local/bin
ok              /sbinok /bin
ok              /usr/sbin
ok              /usr/bin
ok              /usr/X11R6/bin
ok              /root/bin
missing         /does_not_exist
world writable  /tmp
symlink, world writable /tmp/bin
symlink, ok /root/sbin

Discussion

We convert the $PATH to a space-delimited list using the technique from Finding a File Using a List of Possible Locations, test for symbolic links (-L), and make sure the directory actually exists (-d). Then we get a long directory listing (-l), dereferencing symbolic links (-L), and listing the directory name only (-d), not the directory’s contents. Then we finally get to grep for world-writable directories.

As you can see, we spaced out the ok directories, while directories with a problem may get a ...

Get bash Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.