从50年前的电子时代到1977年苹果计算机问世之间,计算硬件十分稀缺,而且购置和操作成本非常昂贵。 当今(相对)原始系统中可能发生的循环是珍贵的商品,只勉强地分配给最棘手的问题。 争夺项目是为了节省计算机时间 ,最早的信息技术(IT)经理致力于使系统每天24小时,每周7天保持忙碌状态。 毕竟,闲置的tick虫是浪费金钱。
理想情况下,那些丢失的滴答声将按需分配,并自动分配给任何等待计算的任务。 实际上,这就是分时背后的想法(最早由Robert Berner于1957年提出) 。 正如在Multics,RSTS / E和更高版本的UNIX®及其许多现代变体中实现的那样,分时共享或多任务处理将计算机的资源(CPU,输入和输出以及内存)分配到等待的作业中,从而产生了一种错觉作业具有机器专用功能。 将几个哑终端连接到多任务大型机,每个终端似乎是一台个人计算机。
如今,您很可能拥有自己的UNIX计算机,并与其他人共享功能更强大的多处理器系统。 但是,在两种情况下(笔记本电脑和公司机房中的UNIX庞然大物),同时访问仍然是至关重要的。 UNIX提供了强大的工具和基础结构,因此您可以保护和共享信息。
本文着眼于用户权限,尤其是研究如何操纵文件权限来限制或与他人共享目录和文件。 如果您想流利地讲UNIX,那么了解权限至关重要。
id,ego和UID
首先,让我们探讨一下你是谁。 在命令提示符下,输入whoami
:
$ whoami
strike
我的计算机回答strike
,这是我的用户名(与我登录时使用的名称相同)。 您的whoami
应该返回您的登录名。
事实证明,您的用户名实际上是您的用户ID(UID)的化名 。 要查看您的UID,请输入id -u
:
$ id -u
501
在这里,我的UID是501。
通常,尽可能使用用户名代替UID仅仅是因为它们易于阅读并且易于记忆。 例如,如果运行ps uxf
命令以查看正在运行的进程的列表,则ps
将用户名显示为进程的所有者。
$ ps uxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
strike 32346 0.0 0.1 6496 1832 ? S 19:39 0:00 sshd: strike@pts/0
strike 32347 0.0 0.1 2592 1476 pts/0 Ss 19:39 0:00 \_ -bash
strike 32358 0.0 0.0 2476 820 pts/0 R+ 19:39 0:00 \_ ps uxf
输出显示了三个正在运行的进程: ssh登录名,它生成了一个bash
shell,它启动了ps
命令本身。 同样,如果在主目录中运行ls -alFG
以查看文件的所有者,则将显示用户名而不是UID。
通常,只有您可以中断任务。 (当然,超级用户root可以控制和操作所有任务。)例如,另一个共享同一系统的用户joe无法终止我正在运行的shell,即上面列表中的进程32347:
$ whoami
joe
$ kill -INT 32347
-bash: kill: (32347) - Operation not permitted
在这里, 32347
是我的shell的进程ID,joe可以通过运行ps auxf
。 但是,由于我拥有该进程,因此joe无法终止它。 相反,我当然可以终止我自己的任何任务,如清单1所示。
清单1.杀死自己的进程
$ ps uxf
...
strike 32347 0.0 0.1 2592 1488 pts/0 Ss 19:39 0:00 \_ -bash
strike 32733 39.5 0.0 1480 356 pts/0 R 19:50 0:01 \_ yes
$ kill -INT 32733
$ ps uxf
...
strike 32347 0.0 0.1 2592 1488 pts/0 Ss 19:39 0:00 \_ -bash
运行kill -INT 32733
,进程32733( yes
命令)终止。
尽管这是一个相对简单的概念,但强大的所有权和按用户配置是使UNIX比Microsoft®Windows®安全得多的两个功能。
会员有其特权
像您启动的作业一样,您还拥有创建的目录和文件。 例如,在主目录和$HOME
上运行ls -alFG
命令以查看您拥有的内容,如清单2所示。
清单2.列出您在主目录中拥有的内容
$ ls -alFG $HOME
...
-rw------- 1 strike 6175 Aug 25 07:03 .bash_history
-rw------- 1 strike 567 Apr 20 2005 .bash_profile
-rw------- 1 strike 1834 Apr 20 2005 .bashrc
drwx------ 2 strike 4096 Mar 8 10:54 .ssh/
-rw------- 1 strike 9516 Aug 22 16:42 .viminfo
-rw-r--r-- 1 strike 1529617 Jul 19 07:00 Archive.zip
drwxrwx--- 3 strike 4096 Aug 24 04:04 IBM/
drwxr-xrwx 3 strike 4096 Jun 14 06:06 backups/
...
如您所见,我拥有主目录中的所有目录和文件。 作为所有者,我可以删除,重命名和移动我的任何文件和目录,也可以编辑我的任何文件。 您对文件拥有相同的权限( 文件是指文件和目录的总称,除非有特殊的例外情况)。
此外,您可以选择与他人共享文件。 确实,由于UNIX被设计为多用户系统,因此共享文件是操作系统的另一个主要原则。
除了特定的用户所有者外,每个文件和目录还具有一个组所有者。 UNIX组只是用户的集合,您可以是一个或多个组的成员。 使用id
查找您的会员资格:
$ id
uid=501(strike) gid=501(strike) groups=501(strike),
81(appserveradm), 79(appserverusr), 80(admin)
在我的系统上,我的主要组是组ID(GID)501,或名为strike的组。 我也属于其他三个组:
- appserveradm
- appserveruser
- 管理员
通常,默认情况下,您创建的文件的组所有者是您的主要组,但随后您可以将组所有者更改为您所属的任何组。 在主目录上运行ls -laF
,以显示有关文件的更多信息,如清单3所示。
清单3.了解有关文件的更多信息
-rw------- 1 strike strike 6118 Aug 27 21:59 .bash_history
-rw-r--r-- 1 strike strike 567 Apr 20 2005 .bash_profile
-rw-r--r-- 1 strike strike 1834 Apr 20 2005 .bashrc
drwx------ 2 strike strike 4096 Mar 8 10:54 .ssh/
-rw------- 1 strike strike 9516 Aug 22 16:42 .viminfo
-rw-r--r-- 1 strike strike 1529617 Jul 19 07:00 Archive.zip
drwxr-xr-x 3 strike strike 4096 Aug 24 04:04 IBM/
drwxrwxr-x 3 strike admin 4096 Jun 14 06:06 backups/
注意: 清单3显示了ls -l
的典型输出。 清单2看起来有所不同,因为故意隐藏了组所有者以简化前面的讨论。 您可以使用-G
隐藏组所有者。
名为backups的目录具有组所有者admin,该管理员将某些特权扩展到该组的所有成员。 同时,我其余文件的组所有者是罢工。 通常,用户是他或她的同名组的唯一成员,这实际上限制了仅对该用户的访问。
精美的细节
如果回头看一下上面ls
的输出,您可能会注意到每行开头有10个字符的序列。 每个字符都是关闭或打开的设置或位,代表三个选区之一的特定权利:您,一个组和其他组。 图1显示了每个位的用法。
图1. UNIX文件的权限位
在图1中:
- 初始位指示文件是否为目录。 (通常,起始位指示文件是否特殊。如果文件特殊,则目录的起始字符为d ,符号链接的起始字符为l 。)该设置是不变的。
- 接下来的三位(蓝色显示)分别代表您有权读取,写入和执行文件。 例如,您可以禁用写入位,以防止文件被删除。 (是的,您需要具有写权限才能删除文件。)
- 接下来的三位(绿色)表示组的读取,写入和执行文件的权利。
- 最后三位(橙色)代表每个其他用户(即,所有用户,您自己和组成员除外)的权利。
使用上面找到的ls -laF
输出作为示例:
- .bash_history,.bash_profile,.bashrc和.viminfo文件仅由我可读和可写。 我可以查看,编辑和删除这些文件。
- .ssh目录只有我可以访问。 第一位表示它是一个特殊文件,而d表示目录。 我可以显示目录的内容,因为它设置了用户可读取的位。 我可以从目录中添加和删除文件,因为它的用户写入位已设置。 您可能想知道为什么目录也是用户可执行的。 除非设置此位,否则无法遍历(输入和编录)目录。 (顺便说一句,如本系列文章的第3部分所述,您的.ssh目录必须是私有的,否则您的公共密钥访问将无法进行。)
- 我可以读写Archive.zip文件,其他人可以读取该文件。 (当然, 罢工小组也可以读取该文件,但是如果我是该小组的唯一成员,那么权限就没有意义了。)
- 我可以在IBM,另一个目录中对文件进行编录,读取和写入,其他人可以对它的内容进行编目。
- 最后, admin组的成员以及我可以对备份中的文件进行分类,读取和写入,其他所有人都可以进行分类和读取。
您可以使用chmod
( 更改模式 )命令来修改权限(目录位除外)。 您可以使用chgrp
( 更改组 )命令来操纵文件的组分配。 (超级用户root也可以通过使用chown
或change owner命令来更改文件所有权。)
这是chmod
示例应用程序:
-
chmod u+x script.sh
:如果要编写Shell脚本并要执行该脚本,请启用其执行位。 这里,短语u+x
表示用户所有者(u
)启用(+
)执行位(x
) 。chmod
的一般形式是chmod ,none(表示用户),u
,g
(对于组)或o
(对于其他),一个或多个,a+
或-
以及r
,w
和一个或多个,x
。 -
chmod go+rx IBM
:此命令为组和其他组启用读取和执行特权。 -
chmod a+rx script.sh
:除了u
,g
和o
,您还可以对所有用户,用户,组和其他用户使用修饰符a
。 因此,此命令启用对所有三个选区的读取和执行。 -
chgrp admin backups
:此命令将组所有者更改为admin。
如果使用+
添加权限,它将添加指定的权限,但其他权限保持不变。 同样,如果您使用-
( 减号 )撤消权限,则它会禁用某些权限,但会保持现状。 如果要一次设置所有权限,请使用数字文件模式。 (您也可以使用chmod =
运算符。有关详细信息,请参见手册页。)
注意: 数字文件模式是0到7之间的八进制数字,或者是三位数字,读,写和执行中的每一位都为一位。 因为有三个组别为每个文件中,完全指定的文件模式是三位数字,例如400
, 644
,或777
。 这里有些例子:
- 要使目录私有,您可以为自己启用权限,但撤消对某个组和其他组的权限:
$ mkdir example $ ls -l drwxr-xr-x 2 strike strike 68 Aug 28 11:27 example $ chmod 700 example $ ls -l drwx------ 2 strike strike 68 Aug 28 11:27 example
模式700
转换为启用用户的读,写和执行(前导7
),但禁用所有其他权限(后两个零) 。 - 如果要让计算机上的其他所有人读取您的文件之一,请为所有三个选区启用读取权限:
$ ls -l .aliases -rw------- 1 mstreich mstreich 79 Jul 26 17:08 .aliases $ chmod 644 .alias $ ls -l -rw-r--r-- 1 mstreich mstreich 79 Jul 26 17:08 .aliases
644
是我 (6
)的设置,读取和写入权限以及组(4
)和其他(4
)读取权限的简写。 当然,如果文件.aliases位于您的主目录中,则$ HOME的权限必须允许分类和读取。
表1中的图表显示了用户所有者,组所有者和其他用户的数值和相关结果。 只需在每个部分中添加值即可找到要设置的正确值。
表1.数值和相关结果
WHO | 值 | 结果 |
---|---|---|
用户 | 0400 | 允许所有者读取。 |
0200 | 允许所有者写信。 | |
0100 | 对于文件,允许所有者执行; 对于目录,允许所有者在目录中搜索。 | |
组 | 0040 | 允许小组成员阅读。 |
0020 | 允许小组成员写信。 | |
0010 | 对于文件,允许所有者执行; 对于目录,请允许组成员在目录中搜索。 | |
其他 | 0004 | 允许他人阅读。 |
0002 | 允许他人写。 | |
0001 | 对于文件,允许其他人执行; 对于目录,允许其他人在目录中搜索。 |
例如,要为其他用户设置读取和写入权限,请添加0004
和0002
以产生0006
。 对用户和组执行类似的操作,并将所有三个总和相加即可得出完全限定的数字模式。
权限至关重要
在UNIX系统上,一次又一次地设置和管理权限。 您通常需要对特定文件和目录具有适当的权限才能运行守护程序。 只有设置了正确的权限,目录(例如/ tmp)才能工作; 当然,要与他人共享文件或保护文件,您必须能够设置,更改和读取权限。
本系列的下一篇文章将继续介绍文件,并探讨实用程序和技术来管理多台计算机上成百上千个文件。
翻译自: https://www.ibm.com/developerworks/aix/library/au-speakingunix4/index.html