我正在尝试找到任何用户主目录及其可由任何人写入的文件。
我写了这个:
find /home -type d -perm -200 | grep . ||
echo no world-writable directories here
这仅检测目录,但我还想添加文件。
答案1
getent passwd |
cut -d: -f1,6 |
while IFS=: read user home; do
if [[ -d $home ]] && (( (0$(stat -c %a $home) & 2) == 2 )); then
echo $user $home
fi
done
对世界可写的测试也可以这样写:
[[ $(stat -c %A $home) == *?w? ]]
解释:
getent passwd
- 以 /etc/passwd 格式获取系统上所有用户的信息cut ...
– 仅选择用户 ID 和主目录[[ -d $home ]]
- 确保 home-dir 是一个目录(( (0$(stat -c %a $home) & 2) == 2 ))
:
stat -c %a $home
以八进制形式返回文件权限(例如755
:)。在前面加上一个零,以便 bash 知道它是一个八进制数。然后执行按位与操作以获取“全球可写”位。如果该值为零,则目录不是全球可写的。如果该值为 2(二进制 10),则目录是全球可写的。- 因此,如果它是一个目录,并且是全世界可写的,则输出用户 ID 和目录。
- 另一种形式
[[ $(stat -c %A $home) == *?w? ]]
是查看字符串形式的文件权限(例如drwxr-xr-x
:),然后检查倒数第二个字符是否为“w”
答案2
我不确定你想做什么。如果你想查找/home
具有权限的所有文件和目录200
,你可以这样做
find /home -perm -200
但是,这不是所有人都可写的文件和文件夹列表,200
这意味着该文件可由其所有者写入。如果您希望所有文件和文件夹都可以由所有人写入,请改为执行以下操作:
find /home -perm -a=w
您的grep .
命令什么也不做。.
表示“匹配任意字符”,因此它始终为真。如果您要查找名称以 开头的文件或文件夹.
,则可以执行 need grep "^\."
。