为什么某些可执行文件在启动时,会通过要求用户输入密码(通过下面的 ls -l 信息)自动以 root 身份运行?
-rwxr-xr-x 1 root root 975856 Feb 9 13:02 <filename>
而除文件大小和时间之外的此类完全相同的文件信息的其他可执行文件将不会自动以 root 身份运行,因为不需要用户输入密码
它的不常见文件设置/属性如何?
答案1
(如果我正确理解了这个问题,您想知道为什么只有某些脚本提示用户输入密码,以及这与“ls”命令列出的信息有什么关系。)
该ls
命令提供有关文件属性的信息(针对指定目录中的每个文件),例如读取权限、写入权限和用户/组所有权。
在您的情况下,ls
报告<filename>
由“root”用户(输出中第一次出现“root” ls
)和“root”组(输出中第二次出现“root” ls
)拥有。这意味着用户权限适用于用户“root”,组权限适用于组“root”。
读/写/执行权限由这 10 个字符表示:-rwxr-xr-x
。
- 首先,我们有 Unix 文件类型 (
-
),其中“-”表示常规文件,“d”表示目录,“s”表示符号链接。 - 接下来:
rwx
,这是用户权限。用户“root”(文件的所有者)被授予读、写和执行权限。 - 下一步:
r-x
,这是组权限。 “root”组(文件的组所有者)中的所有用户都被授予读取和执行权限。 - 接下来:(
r-x
再次),这是其他用户的权限。所有其他用户都被授予读取和执行权限。 (请注意,执行权限仅决定您是否可以将该文件视为可执行文件;在该可执行文件内执行的所有命令和系统调用仍然会因权限不足而被拒绝执行。)
看维基百科上的文件系统权限以获得更彻底的解释。
请注意,它ls
不会告诉您有关可执行文件行为的任何信息;它无法知道可执行文件是否会尝试格式化您的磁盘(因此需要 root 权限)或者它是否只是一个“Hello, world!”脚本。您可以有一个由非特权用户拥有的磁盘格式化脚本,但除非由 root 运行,否则该脚本将会失败;您可以有一个不执行任何操作但没有 root 执行权限的脚本,因此 root 将无法运行它。 (请注意,root 可以更改任何权限和所有权,因此它可以覆盖它。)
这是一个简单的 bash 脚本,它检查它是否以 root 身份运行,如果不是,则尝试使用 sudo 来获得 root 权限。如果您复制/粘贴到文本编辑器并保存文件,则该文件应该由非特权用户拥有,但请注意:
- 脚本的行为允许它潜在地执行仅限 root 的命令,但是除非须藤成功;
- 以上与 的输出没有任何关系
ls
。
#!/bin/bash
### test_root.sh
# small script to experiment with detecting root and running as sudo
# print some file attributes
LS_RESULT=$(ls -alh $0)
echo "ls information for ${0}:"
echo -e "${LS_RESULT}\n"
# check effective user id and attempt to rerun script if not root
if [ "$EUID" -ne 0 ]; then
echo "Not running as root!"
echo "Attempt to rerun with sudo? (y/N)"
read -n1 "ANSWER" # read a y/n character
if [ "$ANSWER" == "y" ] || [ "$ANSWER" == "Y" ]; then
PROG_NAME=$(readlink -f ${BASH_SOURCE[0]}) # get proper path to this script
COMMAND="sudo ${PROG_NAME} ${@}"
echo -e "\n$COMMAND\n\n"
bash -c "$COMMAND" # rerun script as sudo
else
echo -e "\nExiting ..."
fi
else
echo "Hello, root!"
fi
答案2
阅读man 2 chmod
后你会发现:
The new file mode is specified in mode, which is a bit mask created by ORing together zero or more of the following:
S_ISUID (04000)
set-user-ID (set process effective user ID on execve(2))
S_ISGID (02000)
set-group-ID (set process effective group ID on execve(2);
mandatory locking, as described in fcntl(2); take a new
file's group from parent directory, as described in
chown(2) and mkdir(2))
...
继续阅读man chmod
“ SETUID AND SETGID BITS
”。
这是旧方法,已被“能力”取代。读man -k capability
。
答案3
您描述的行为与文件权限无关。请求 root 密码的程序必须执行以下操作......
if whoami != root
su root argv(0)