在终端中,某些操作系统命令需要 root 权限,有些则不需要。控制这个的机制是什么?每个命令实际上是一个单独的程序,有自己的执行权限,还是 Bash 中有一个表? (我是否正确地认为 Bash 是命令 shell,而终端是传递命令的用户界面?)我指的是操作系统命令,而不是从终端运行应用程序。
答案1
是的,每个应用程序通常都通过实际应用程序上的“权限位”设置自己的权限。如果ls -l
您对尝试运行的各种可执行文件使用该命令,则可以看到这些内容。
$ ls -l /sbin/ | grep autrace
-rwxr-x---. 1 root root 15792 Aug 24 14:40 autrace
03:03:22-slm~ $ autrace
bash: /usr/sbin/autrace: Permission denied
但是有一些命令,它们尝试触摸/访问的“数据”是受到限制的,因此仅查看权限是不够的:
$ ls -l /sbin/ | grep "\bfdisk"
-rwxr-xr-x. 1 root root 230512 Apr 25 05:19 fdisk
$ fdisk -l
$
这里的命令以我的用户 ID 执行,但该用户无权访问有关我的系统上的物理磁盘的信息,因此fdisk
没有显示任何输出。如果我使用以下命令将自己提升为 root,sudo
我可以看到我想要的输出:
$ sudo fdisk -l | head -10
Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 5D1229E8-1234-1234-1234-ABCDEFG128790
Device Start End Size Type
/dev/sda1 2048 411647 200M EFI System
控制这一点的机制
没有集中控制,所有控制都是分散的,并作为权限位与文件一起存储在应用程序/可执行文件(如我上面所示)上,或这些工具将使用的数据文件上,或文件所在的目录上被包含。
命令外壳
关于 Bash 是 shell,而终端是传递命令的用户界面,您的描述不太正确。相反,终端是一个被执行的应用程序,其中有一个正在运行的 shell,通常是 Bash,但它可以是任意数量的 shell。
例如以下是命令的输出ps
,显示了当前 shell 的进程的结构:
$ ps axf | less
...
8549 ? Sl 0:08 /usr/libexec/gnome-terminal-server
8552 ? S 0:00 \_ gnome-pty-helper
10286 pts/13 Ss 0:00 \_ bash
12783 pts/13 Sl+ 5:49 | \_ vinagre
12868 pts/14 Ss 0:00 \_ bash
15742 pts/14 R+ 0:00 \_ ps axf
15743 pts/14 S+ 0:00 \_ less -r
在这里您可以看到我的终端gnome-terminal
运行在顶部,并且下面有子进程。这些子进程是 2 个bash
shell,其中一个正在运行名为 的应用程序vinagre
,另一个正在运行ps
我在此处向您展示的命令。
附加限制
我上面描述的是系统上的用户如何使用可执行文件的基础。但这些只是基础知识。除此之外,还有其他技术,例如 ACL(访问控制列表)和各种可执行文件的访问控制策略。
ACL 非常简单,为所有者、组等传统模型之外的用户提供更精细的控制。
SELinux 和 AppArmor 等工具采用了相同的方法,但在 Linux 内核级别引入了制定规则的能力,以限制应用程序 X 与整个系统交互的方式。例如,如果您正在运行 Samba 服务器,则需要授予此应用程序对其通常操作的正常区域之外的文件系统的访问权限。您必须添加额外的策略才能允许这样做。
SELinux 手册页摘录NSA 安全增强型 Linux (SELinux) 是 Linux 操作系统中灵活的强制访问控制架构的实现。 SELinux 架构为多种强制访问控制策略的实施提供一般支持,包括基于 Type Enforcement®、基于角色的访问控制和多级安全性概念的策略。有关 SELinux 的背景信息和技术文档可以在以下位置找到: http://www.nsa.gov/research/selinux。
命令是什么的一部分?
如果您不确定应用程序是否是系统上的实际文件,或者是否是其他文件,您可以使用该命令type
来确定这一点。
$ type pwd
pwd is a shell builtin
$ type fdisk
fdisk is /usr/sbin/fdisk
因此,在上面的示例中,pwd
是内置于 Bash 中的,而fdisk
是驻留在/usr/sbin/fdisk
.
笔记:对于任何内置的东西,它们都受到调用它们的 Bash shell 的权限的控制!
答案2
基本上,应用程序大部分决定是否需要根访问权限。这通常通过以下两种方式之一完成:(1) 显式检查编码,或 (2) 使用需要 root 访问权限的文件、目录或其他特殊文件,否则会失败。
对此根本没有中央控制。
答案3
有几件事可以阻止用户执行命令:
文件权限
ls -l <file>
您可以使用“rwxr-xrw-”之类的形式检查它们,它定义了所有者、组和其他用户对该文件的读取、写入和执行权限。访问控制列表
如果安装的设备启用了 acl,您可以获取其属性
getfacl
并检查与上述相同的权限或对不同用户的限制。一个例子:[root]# getfacl <file>
# file: <file>
# owner: <owner>
# group: <group>
user::rw-
user:<different_user>:rwx
group::r-
mask::rwx
other::r-
环境变量
PATH 变量定义了 bash 将在其中查找命令的目录列表。您可以使用 检查其内容
echo $PATH
。SELinux
SElinux 是实现这一目标的另一种方法。您可以使用 检查 SElinux 许可
ls -Z <file>
。
这些只是一些例子,希望有所帮助。