elr*_*bis 10 permissions command-line users groups
我想列出用户或组具有写入权限的所有目录。
我在 ServerFault 上发现了这个问题,但它针对的是 Windows Server,所以我很乐观,Linux 社区中有更好的东西。同时,我意识到这个问题存在递归扭曲,如果没有长时间运行的脚本,它可能无法实现。
我知道以下有用的命令:
cut -d : -f 1 /etc/group cut -d : -f 1 /etc/passwd getent passwd user-name| cut -d: -f 6ls -la但是,当我不知道用户的目的是什么时,最好拉出他们拥有写权限的所有目录的列表,然后从那里开始环顾四周。如果不出意外,它是一个超级有用的审计..
如果这有助于理解我的目的,那么在我们的系统管理员担任新职位后,我继承了(或者至少是照看婴儿?)几个系统。所以我一直在试图了解这两个系统的演变,例如安装了什么软件,在哪里(..呃),各种配置文件所在的位置,以及现在,已经创建了哪些不同的组和用户——包括他们被允许写入的目录。通常我可以在 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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
如果您不是该用户,那么弄清楚该用户可以做什么是很困难的。您可以测试各种内容(所有者、同一组等),但 ACL 可能适用,挂载中可能没有权限,谁知道呢。这个很难(硬。
如果你能变成那个用户,你就test -w <path>可以看看他们能不能写。这不像只查看 inode 那样快,但可以使用sudo.
sudo -u oli test -w <path> && echo "HOORAY"
Run Code Online (Sandbox Code Playgroud)
然后我们可以把它放到find. 我们不是-exec一遍又一遍地更改为 oli 用户(请参阅过去的修订版),而是将所有内容通过管道传输到以 oli 身份运行的 xargs 实例中。这要快得多。
sudo find / -type d -print0 | sudo -u oli xargs -0 -I{} sh -c 'test -w "$0" && echo "$0"' {}
Run Code Online (Sandbox Code Playgroud)
一个稍微优化(但在视觉上更不稳定)的版本涉及通过将路径流输送到少量 bash 子外壳中来最小化 xargs 执行的子外壳化量。这对于大型搜索来说无疑更快。
sudo find / -type d -print0 | sudo -u oli xargs -0 sh -c 'for p; do [ -w "$p" ] && echo "$p"; done' -
Run Code Online (Sandbox Code Playgroud)
在聊天中,我们对用户和组进行了以下说明:
sudo find / -type d -user rinzwind -perm /u=w
sudo find / -type d -group rinzwind -perm /g=w
sudo find / -type d -perm /o=w
Run Code Online (Sandbox Code Playgroud)
或者将三者合二为一:
sudo find -type d \( \( -user rinzwind -perm /u=w \) -o \( -group rinzwind -perm /g=w \) -o -perm /o=w \)
Run Code Online (Sandbox Code Playgroud)
没有 / 它搜索当前目录。
在我系统上的 67Gb 数据上花了不到 2 秒的时间;)