我想列出用户或组具有写权限的所有目录。
我在ServerFault上发现了这个问题,但它针对的是Windows Server,因此我很乐观地认为Linux社区对我们有更好的帮助。同时,我意识到这个问题有一个递归的转折,如果没有长时间运行的脚本,这可能使它变得不可能。
我知道以下有用的命令:
cut -d : -f 1 /etc/group
cut -d : -f 1 /etc/passwd
getent passwd user-name| cut -d: -f 6
ls -la
但是,当我不知道用户的用途是什么时,最好列出他们具有写权限的所有目录的列表,然后从那里开始查看。如果没有别的,那是一个超级有用的审核。
如果这有助于理解我的目的,那么在SysAdmin上任后,我继承了(或者至少是保姆?)几个系统。因此,我一直在尝试了解这两个系统的演变,例如安装了什么软件,安装在哪里(.ugh),各种配置文件在哪里以及现在创建了哪些不同的组和用户-包括他们被允许写入的目录。通常我可以在askubuntu上找到这样有用的终端命令,但是找不到我认为应该继续问的命令。
确切的系统是Ubuntu 10.04.2,但我们也支持Ubuntu 12.04.5,因此与版本无关的最佳解决方案将是最佳选择。在此先感谢您的帮助。
[更新:两个快速解答的初步结果]
值得注意的是,我以root用户身份登录,并且/
是我的工作目录。而且,他们花了相当多的时间来运行。
@Rinzwind的组合命令在大约5.5分钟内得到了以下输出。
root@tatooine:/# sudo find -type d \( \( -user ftpgisdata -perm /u=w \) -o \( -group ftpgisdata -perm /g=w \) -o -perm /o=w \)
./tmp
./tmp/.ICE-unix
./tmp/.X11-unix
find: `./proc/6594/task/6594/fd/5': No such file or directory
find: `./proc/6594/task/6594/fdinfo/5': No such file or directory
find: `./proc/6594/fd/5': No such file or directory
find: `./proc/6594/fdinfo/5': No such file or directory
./var/tmp
./var/lib/php5
./var/crash
./var/lock
./home/ftpgisdata
./home/ftpgisdata/.ssh
./home/ftpgisdata/.cache
./home/sitename-i-changed.com/wp-content/profile-pics
./dev/shm
@Oli的修订命令也很相似,大约在5.5分钟内。
root@tatooine:/# sudo find / -type d -print0 | sudo -u ftpgisdata xargs -0 sh -c 'for p; do [ -w "$p" ] && echo "$p"; done' -
/tmp
/tmp/.ICE-unix
/tmp/.X11-unix
find: `/proc/15541': No such file or directory
find: `/proc/15542': No such file or directory
find: `/proc/15543': No such file or directory
find: `/proc/15567': No such file or directory
find: `/proc/15568/task/15568/fd/5': No such file or directory
find: `/proc/15568/task/15568/fdinfo/5': No such file or directory
find: `/proc/15568/fd/5': No such file or directory
find: `/proc/15568/fdinfo/5': No such file or directory
/var/tmp
/var/lib/php5
/var/crash
/var/lock
/home/ftpgisdata
/home/ftpgisdata/.ssh
/home/ftpgisdata/.cache
/home/sitename-i-changed.com/wp-content/profile-pics
/dev/shm
@PeterCordes的答案在大约5.5分钟内也返回了相似的结果。
root@tatooine:~# username_to_check=ftpgisdata base_dir=/ # for example
root@tatooine:~# sudo -u "$username_to_check" find "$base_dir" -type d -writable 2>/dev/null ## GNU find, not POSIX
/tmp
/tmp/.ICE-unix
/tmp/.X11-unix
/proc/7159/task/7159/fd
/proc/7159/fd
/proc/7159/map_files
/var/tmp
/var/lib/php5
/var/crash
/var/lock
/home/ftpgisdata
/home/ftpgisdata/.ssh
/home/ftpgisdata/.cache
/home/sitename-i-changed.com/wp-content/profile-pics
/dev/shm
如果您不是该用户,那么很难弄清楚该用户可以做什么。您可以测试各种东西(是所有者,同一组等),但是ACL可能适用,安装中可能没有权限,谁知道。这个很难(硬。
如果您可以成为该用户,则可以test -w <path>
查看他们是否可以写。这不像查看inode那样快,但是可以使用sudo
。
sudo -u oli test -w <path> && echo "HOORAY"
然后,我们可以将其卷曲到的后端find
。我们不只是-exec
一遍又一遍地更改为oli用户(请参阅以前的修订版),而是将所有内容通过管道传递到以oli运行的xargs实例中。这要快得多。
sudo find / -type d -print0 | sudo -u oli xargs -0 -I{} sh -c 'test -w "$0" && echo "$0"' {}
这种方法的某种程度优化(但视觉上不稳定)的版本涉及通过将路径流管道输送到少量bash子shell中来最小化xargs执行的子shell数量。对于大型搜索而言,这无疑是更快的。
sudo find / -type d -print0 | sudo -u oli xargs -0 sh -c 'for p; do [ -w "$p" ] && echo "$p"; done' -
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句