是什么决定了哪些 Linux 命令需要 root 访问权限?我理解为什么需要apt-get
特权是可取的root
;但是这些命令与其他命令有何区别呢?这仅仅是可执行文件的所有权和执行权限的问题吗?
答案1
这主要是工具或程序的问题做。请记住,非超级用户只能触摸其拥有或有权访问的文件,任何需要能够访问的工具一切将需要超级用户访问权限才能完成它所做的事情。可能需要超级用户访问权限的事物的快速示例包括但不限于:
- 在低于 1024 的端口上打开侦听 TCP 套接字
- 更改系统配置(例如 中的任何内容
/etc
) - 添加新的全局可访问库 (
/lib
和/usr/lib
) 或二进制文件 (/bin
,/usr/bin
) - 触摸不属于正在触摸的用户所有的任何文件,这些文件没有足够的许可模式
- 更改其他用户的文件所有权
- 提升流程优先级(例如
renice
) - 启动或停止大多数服务
- 内核配置(例如调整swappiness)
- 调整文件系统配额
- 写入“完整”磁盘(大多数文件系统为 root 用户保留一些空间)
- 像其他用户一样执行操作
答案2
在 Linux 中,root 的权限一度被划分为“功能”,因此您可以通过查看该文档来获取 root 特殊权限的完整列表:man 7 capabilities
。
为了回答您的问题,当命令需要这些权限之一时,它需要以 root 身份运行,并且其非脚本可执行文件在其文件元数据中没有设置相关功能(例如,如果 python 脚本需要该功能,则该功能需要位于 shebang 行中指定的 python 解释器中)。
请注意,某些需要 root 访问权限的命令不需要类似的东西,sudo
因为它们在可执行文件中设置了 SUID 位。当由具有执行访问权限的任何人执行时,该位会导致可执行文件以所有者(通常是 root)身份运行。一个例子就是sudo
它本身,因为更改用户是它需要执行的特权操作。
编辑:我从您的问题中注意到,您可能认为您可以在运行命令之前确定它是否需要 root 访问权限。事实并非如此。程序有时可能需要 root 权限,有时则不需要,这可能是程序根据运行时提供的数据做出的决定。举例来说,调用vim
,就像这样不带参数,然后通过一系列按键和粘贴,告诉它将一些内容写入它无权写入的文件中,或者执行另一个本身需要 root 权限的命令。执行之前,命令中的任何内容都无法表明它最终需要 root 访问权限。这只有在它尝试做需要 root 访问权限的事情时才能确定。
无论如何,下面是来自 root 权限的参考手册页的极少数示例:
- 对进程 UID 进行任意操作(setuid(2)、setreuid(2)、setresuid(2)、setfsuid(2));
- 绕过文件读、写和执行权限检查。 (DAC 是“自主访问控制”的缩写。)
- 绕过发送信号的权限检查(请参阅kill(2))。这包括使用 ioctl(2) KDSIGACCEPT 操作。
- 执行各种与网络相关的操作:
- 接口配置;
- IP 防火墙、伪装和计费管理;
- 修改路由表;
- 将套接字绑定到 Internet 域特权端口(端口号小于 1024)。
- 加载和卸载内核模块(参见 init_module(2) 和 delete_module(2));
- 设置系统时钟(settimeofday(2), stime(2), adjtimex(2));设置实时(硬件)时钟。
- 执行一系列系统管理操作,包括:quotactl(2)、mount(2)、umount(2)、swapon(2)、swapoff(2)、sethostname(2) 和 setdomainname(2);
- 使用reboot(2)和kexec_load(2)。
- 使用 chroot(2)。
- 提高进程的nice值(nice(2)、setpriority(2))并更改任意进程的nice值;
答案3
我认为是按照用户的身份来验证权限,而不是按照顺序来划分权限。文件和用户都是有特权的,命令不应该被分割。