如何检查 "s" 权限位是否设置在 Linux shell 上?还是 Perl?
How to check if "s" permission bit is set on Linux shell? or Perl?
我正在编写一些脚本来检查是否为特定文件设置了 "s" 权限位。
例如-我的文件的权限如下-
drwxr-s---
我如何检查 bash 脚本或 perl 脚本是否设置了 s 位?
如果您使用的是 perl,请查看 perldoc:
-u File has setuid bit set.
-g File has setgid bit set.
-k File has sticky bit set.
所以像这样:
if (-u $filename) { ... }
non-perl 选项
使用stat
#!/bin/bash
check_file="/tmp/foo.bar";
touch "$check_file";
chmod g+s "$check_file";
if stat -L -c "%A" "$check_file" | cut -c7 | grep -E '^S$' > /dev/null; then
echo "File $check_file has setgid."
fi
解释:
- 使用
stat
打印文件权限。
- 我们知道 group-execute 权限是第 7 个字符,所以我们用
cut
提取它
- 我们使用
grep
来检查结果是否为 S
(表示 setgid),如果是,我们对具有 setgid 的文件做任何我们想做的事情。
使用find
我发现(哈哈)find 对于根据权限查找内容非常有用。
find . -perm -g=s -exec echo chmod g-s "{}" \;
使用 setgid 查找所有 files/directories 并取消设置。
我正在编写一些脚本来检查是否为特定文件设置了 "s" 权限位。 例如-我的文件的权限如下-
drwxr-s---
我如何检查 bash 脚本或 perl 脚本是否设置了 s 位?
如果您使用的是 perl,请查看 perldoc:
-u File has setuid bit set.
-g File has setgid bit set.
-k File has sticky bit set.
所以像这样:
if (-u $filename) { ... }
non-perl 选项
使用stat
#!/bin/bash
check_file="/tmp/foo.bar";
touch "$check_file";
chmod g+s "$check_file";
if stat -L -c "%A" "$check_file" | cut -c7 | grep -E '^S$' > /dev/null; then
echo "File $check_file has setgid."
fi
解释:
- 使用
stat
打印文件权限。 - 我们知道 group-execute 权限是第 7 个字符,所以我们用
cut
提取它
- 我们使用
grep
来检查结果是否为S
(表示 setgid),如果是,我们对具有 setgid 的文件做任何我们想做的事情。
使用find
我发现(哈哈)find 对于根据权限查找内容非常有用。
find . -perm -g=s -exec echo chmod g-s "{}" \;
使用 setgid 查找所有 files/directories 并取消设置。