How to test if a file is executable by its owner ** not necessarily me **
这不是一个重复的问题。
假设我有
完整的道路
到名为target的常规文件
可能由其他一些用户拥有。
并且可以剥离环境(busybox启用很少)
在shell脚本中,当我可能不是它的所有者时,如何测试该文件是否可由其所有者执行?想象一下,我的程序的目的是检查是否所有内容都很好地设置为运行其他东西(因为环境可能已被其他用户破坏)并且它正在查找特定目录以确保每个文件的所有者都有权执行他们的档案。
这是一个专业背景,而不是家庭作业。
我将使用的任何解决方案都需要涵盖我没有设置的所有类型的旧Linux环境(因此它们可能会缺少您通常期望的which或find上的某些选项等)。
但是,这个问题可能对那些没有面临这种限制的人有用,所以我非常感谢需要更完整或现代环境的其他解决方案。
[ -x"$path" ]只告诉我是否可以执行它。
ls -l"$path"并检查第四个字符是否x似乎太脆弱了:-rwxrw-rw- 1 otheruser group 26 Jun 13 10:57 target
ls -F"$path"并检查它是否以*结尾似乎好一点:target*我测试的一个环境确实考虑了实际所有者是谁......但这不是最好的方式......
-
如果fs安装了noexec怎么办? 这将阻止用户执行文件而不管其权限如何。
-
可能重复如何从Bash脚本检查程序是否存在?,如何检查shell脚本中是否存在命令?,检查文件是否可执行,如何检查文件在Bash中是否可执行,如何检查是否 命令可用还是存在?等
-
我已经编辑清楚这不是任何一个副本。 (我认为排除[ -x"$path" ]的原因在技术上足以区分,我认为)我的程序是验证器,它希望确保目录中每个文件的所有者是可由该特定所有者执行的。 我不认为组计数,因为我删除了我拥有的(我的)组和其他x组的东西的用户权限,我无法执行它。 不是作业。 需要强大并处理各种奇怪/旧的Linux环境。
1 2
| permissions=$(stat -c"%a" target)
permissions=$(( ${permissions: -3: 1} % 2 )) |
stat以八进制为您提供文件权限。 然后我们只需要所有者权限的字符(技术上从右边第三个,而不是第一个字符),然后需要检查它是否是奇数(八进制中的可执行文件是1位)。
如果权限为1,则所有者可以执行。 如果是0,则不是。
较旧的环境可能需要算术表达式:
1 2 3 4 5 6
| permissions=$(stat -c"%a" $target)
if [ $((0$permissions & 0100)) -ne 0 ]; then
# executable by owner
else
# not executable by owner
fi |
-
@thatotherguy,修复,谢谢。
-
@thatotherguy,是从右端开始以3个字符开头的val字符串吗?如果是这样,下一个参数不是长度,应该是1而不是-2?或者......当涉及到-2时,我错了什么?
-
@ user1011471,您可以尝试自己测试代码并验证它是否有效。
-
@ user1011471 wiki.bash-hackers.org/syntax/pe#negative_length_value
-
哦。"这是自Bash 4.2-alpha以来的工作"在我后来对OP的编辑中,我提到需要支持一些疯狂的旧环境,在这种情况下1会更好,对吧?
-
@ user1011471,是的。我认为负偏移甚至可能不适用于bash的旧版本(但我可能错了,我找不到支持这种感觉的来源)
-
如果你添加1作为旧机器的替代品,我会接受这个答案。这就是我最终使用的东西。
-
@ user1011471,改了。 1无论哪种方式都是正确的,所以它实际上不需要替代。
-
另一种选择是if (( 0$val & 0100)); then echo"executable by owner"; fi
如果您不想解析某些内容的输出,可以使用find:
1 2 3 4 5
| if find ${path} -prune -perm -u+x | grep -q ''; then
echo"Executable by owner"
else
echo"Not executable by owner"
fi |
-perm选项让你检查它是否可由user(所有者)执行,如果${path}是一个目录,-prune选项阻止降序到目录,所以我们可以自己检查给定的路径。
ls -l"$path"并检查第一组权限(所有者权限)。 如果其中有x,则该文件可由其所有者执行。
-
你如何在shell脚本中表达(检查x的第一组权限)?