unix权限

    技术2024-06-15  83

    从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组的麻烦

    更改文件的组所有者是与该组的所有成员共享文件的便捷方法。 例如,如果您, jane和joe组成了science UNIX组,并且您想与两个用户共享敏感的nuclear.csv数据文件,则只需将该文件的组所有者更改为science。

    但是,如果sam和bertha也需要访问该文件又不在科学组中怎么办? 您当然可以将两个用户都添加到科学中,但这将使他们能够访问科学组拥有的所有文件。

    这是UNIX组实现的一个不幸限制:文件可以只有一个组拥有者,并且实施复杂的共享方案通常会导致组爆炸。 (您可以为joe,jane,sam和bertha创建一个新的组,例如jjsb 。但是,当donald也需要访问时会发生什么?)

    如果需要复杂的访问控制方案,请考虑使用许多UNIX实现提供的访问控制列表(ACL)。 ACL扩展了标准UNIX所有权模型,以授予(或排除)每个用户或每个组的特定权限。 ACL就像在门口放着蹦蹦床一样:您可以让您的好友以及某些名人和其他亲手采摘的客人进入,但可以将狗仔队和其他即兴表演者拒之门外。

    如您所见,我拥有主目录中的所有目录和文件。 作为所有者,我可以删除,重命名和移动我的任何文件和目录,也可以编辑我的任何文件。 您对文件拥有相同的权限( 文件是指文件和目录的总称,除非有特殊的例外情况)。

    此外,您可以选择与他人共享文件。 确实,由于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 +T设置粘滞位。

    设置了粘性位并且将权限设置为所有人都可以读取,写入和执行 ,每个人都可以将文件放入我的保管箱,但是我是唯一可以删除目录中的文件或删除目录本身的用户。

    如果运行ls -ld /tmp ,则可能是整个系统范围的临时目录(被广泛用作应用程序暂存空间)很粘。

    您可以使用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

    相关资源:微信小程序源码-合集6.rar
    Processed: 0.013, SQL: 9