Linux最优秀的地方之一就在于他的多用户多任务环境。而为了让各个使用者具有较保密的文件数据,因此文件的权限管理就变的很重要了。 Linux一般将文件可存取的身份分为三个类别,分别是 owner/ group /others,且三种身份各有 read/ write/ execute 等权限。若管理不当,你的Linux主机将会变的很难受。另外,如果首次接触Linux的话,那么, 在Linux下面这么多的目录/文件,到底每个目录/文件代表什么意义呢?下面我们就来一一介绍。

1. 使用者与群组

  • Owner,主人
  • Group,家庭成员
  • Others,客人
  • Root,唯一的真神

  在Linux系统当中,默认的情况下,所有的系统上的帐号与一般身份使用者,还有那个root的相关信息, 都是记录在/etc/passwd这个文件内的。至于个人的密码则是记录在/etc/shadow这个文件下。 此外,Linux所有的群组名称都记录在/etc/group内。

2.Linux 文件权限

  当你的屏幕出现了“Permission deny”的时候,不要担心,“肯定是权限设置错误”。

2.1 Linux文件属性 

ls -al

 

  ls是“list”的意思,重点在显示文件的文件名与相关属性。而选项“-al”则表示列出所有的文件详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为“ . ”的文件)。

linux 用户授权 java运行权限 linux用户授权目录_linux 用户授权 java运行权限

linux 用户授权 java运行权限 linux用户授权目录_数据_02

 

1. 第一栏代表这个文件的类型与权限(permission)

 

   共有十个字符:

linux 用户授权 java运行权限 linux用户授权目录_文件名_03

 

第一个字符代表这个文件是“目录、文件或链接文件等等”:

  • 当为[ d ]则是目录,例如上表文件名为“.config”的那一行;
  • 当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行;
  • 若是[ l ]则表示为链接文件(link file);
  • 若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备);
  • 若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)。

接下来的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

  • 第一组为“文件拥有者可具备的权限”,以“initial-setup-ks.cfg”那个文件为例, 该文件的拥有者可以读写,但不可执行;
  • 第二组为“加入此群组之帐号的权限”;
  • 第三组为“非本人且没有加入本群组之其他帐号的权限”。

2. 第二栏表示有多少文件名链接到此节点(i-node):

  每个文件都会将他的权限与属性记录到文件系统的 i-node 中,不过,我们使用的目录树却是使用文件名来记录, 因此每个文件名就会链接到一个 i-node。这个属性记录的,就是有多少不同的文件名链接到相同的一个 i-node。

3. 第三栏表示这个文件(或目录)的“拥有者帐号”

4. 第四栏表示这个文件的所属群组

5. 第五栏为这个文件的容量大小,默认单位为Bytes

6. 第六栏为这个文件的创建日期或者是最近的修改日期

  这一栏的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年。

  如果想要显示完整的时间格式,可以利用ls的选项。

ls -l --full-time

 

7. 第七栏为这个文件的文件名

  比较特殊的是:如果文件名之前多一个“ · ”,则代表这个文件为“隐藏文件”。

2.2 修改文件属性与权限

  • chgrp :改变文件所属群组
  • chown :改变文件拥有者
  • chmod :改变文件的权限, SUID, SGID, SBIT等等的特性

  ch就是change

1. 改变所属群组, chgrp

  要被改变的群组名称必须要在/etc/group文件内存在才行,否则就会显示错误、

chgrp [-R] grpname dirname/firename..    
//-R : 进行递归(recursive)变更,亦即连同子目录下的所有文件、目录都更新成为这个群组之意。常常用在变更某一目录内所有的文件

linux 用户授权 java运行权限 linux用户授权目录_linux 用户授权 java运行权限_04

 

2. 改变文件拥有者, chown

 

   使用者必须是已经存在系统中的帐号,也就是在/etc/passwd 这个文件中有记录的使用者名称才能改变。

chown [-R] 帐号名称 文件或目录
chown [-R] 帐号名称:文件或目录

linux 用户授权 java运行权限 linux用户授权目录_数据_05

  知道如何改变文件的群组与拥有者了,那么什么时候要使用chown或chgrp呢?或许你会觉得奇怪吧? 是的,确实有时候需要变更文件的拥有者的,最常见的例子就是在复制文件给你之外的其他人时, 我们使用最简单的cp指令来说明好了:


cp 源文件 目的文件


   假设你今天要将.bashrc这个文件拷贝成为.bashrc_test文件名,且是要给bin这个人,你可以这样做:

linux 用户授权 java运行权限 linux用户授权目录_linux 用户授权 java运行权限_06

  由于复制行为(cp)会复制执行者的属性与权限,所以!怎么办?.bashrc_test还是属于root所拥有, 如此一来,即使你将文件拿给bin这个使用者了,那他仍然无法修改的(看属性/权限就知道了吧), 所以你就必须要将这个文件的拥有者与群组修改一下。

3. 改变权限, chmod

  • 数字类型改变文件权限

  使用数字来代表各个权限,各权限的分数对照表如下:
  r:4
  w:2
  x:1

  每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:
  owner = rwx = 4+2+1 = 7
  group = rwx = 4+2+1 = 7
  others= --- = 0+0+0 = 0
  所以等一下我们设置权限的变更时,该文件的权限数字就是770。

chmod [-R] xyz 文件或目录
/*
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同子目录下的所有文件都变更
*/

 

linux 用户授权 java运行权限 linux用户授权目录_根目录_07

 

  • 符号类型改变文件权限

  还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是(1)user (2)group (3)others三种身份。那么我们就可以借由 u,  g,  o 来代表三种身份的权限。此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成 r,  w,  x。也就是可以使用下面的方式来看:

 

linux 用户授权 java运行权限 linux用户授权目录_文件名_08

 

linux 用户授权 java运行权限 linux用户授权目录_根目录_09

 

 2.3 目录与文件之权限意义

1. 权限对文件的重要性

  文件是实际含有数据的地方,包括一般文本文件、数据库内容、二进制可可执行文件(binary program)等等。 因此,权限对于文件来说,他的意义是这样的:

  • r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
  • w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
  • x (eXecute):该文件具有可以被系统执行的权限。

  在Windows下面一个文件是否具有执行的能力是借由“ 扩展名 ”来判断的, 例如:.exe, .bat, .com 等等,但是在Linux下面,我们的文件是否能被执行,则是借由是否具有“x”这个权限来决定的!跟文件名是没有绝对的关系的!

2. 权限对目录的重要性

  文件是存放实际数据的所在,那么目录主要是储存啥玩意啊?目录主要的内容在记录文件名清单,文件名与目录有强烈的关连。 所以如果是针对目录时,那个 r, w, x 对目录是什么意义呢?

  • r (read contents in directory):

  表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来。

  • w (modify contents of directory):

  这个可写入的权限对目录来说,表示你具有改动该目录结构清单的权限,也就是下面这些权限:

    创建新的文件与目录;
    删除已经存在的文件与目录(不论该文件的权限为何!)
    将已存在的文件或目录进行更名;
    移动该目录内的文件、目录位置。

  • x (access directory):

  咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登陆Linux时, 你所在的主文件夹就是你当下的工作目录。而变换目录的指令是“cd”(change directory)。

linux 用户授权 java运行权限 linux用户授权目录_linux 用户授权 java运行权限_10

 

   能不能进入某一个目录,只与该目录的x权限有关。

使用者操作功能与权限举例

假设两个文件名,分别是下面这样:

/dir1/file1
/dir2
假设你现在在系统使用 dmtsai 这个帐号,那么这个帐号针对 /dir1, /dir1/file1, /dir2 这三个文件名来说,分别需要“哪些最小的权限”才能达成各项任务?

linux 用户授权 java运行权限 linux用户授权目录_数据_11

  你可能会问,上面的表格当中,很多时候 /dir1 都不必有 r 耶!为啥?我们知道 /dir1 是个目录,也是个抽屉!那个抽屉的 r 代表“这个抽屉里面有灯光”, 所以你能看到的抽屉内的所有数据夹名称 (非内容)。但你已经知道里面的数据夹放在哪个地方,那,有没有灯光有差嘛?你还是可以摸黑拿到该数据夹的!对吧! 因此,上面很多动作中,你只要具有 x 即可!r 是非必备的!只是,没有 r 的话,使用 [tab] 时,他就无法自动帮你补齐文件名了。

2.4 Linux文件种类与扩展名

1. 文件种类:

  • 常规文件(regular file ):

  就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:

   (1)  纯文本文件(ASCII):这是Linux系统中最多的一种文件类型, 称为纯文本文件是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设置的文件都属于这一种文件类型。 

      (2)二进制档(binary):系统其实仅认识且可以执行二进制文件(binary file),Linux当中的可执行文件(scripts, 文字体批处理文件不算)就是这种格式。

   (3)数据格式文件(data): 有些程序在运行的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的Linux在使用者登陆时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够通过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件。

  • 目录(directory):

  第一个属性为 [ d ],例如 [drwxrwxrwx]。

  • 链接文件(link):

  就是类似Windows系统下面的快捷方式,第一个属性为 [ l ](英文L的小写),例如 [lrwxrwxrwx] ;

  • 设备与设备文件(device):

  与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种:

  (1)区块(block)设备文件 :就是一些储存数据, 以提供系统随机存取的周边设备,举例来说,硬盘与软盘等就是,你可以随机的在硬盘的不同区块读写,这种设备就是区块设备。可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]。

  (2)字符(character)设备文件:亦即是一些串行端口设备, 例如键盘、鼠标等等。这些设备的特色就是“一次性读取”的,不能够截断输出。 举例来说,你不可能让鼠标“跳到”另一个画面,而是“连续性滑动”到另一个地方。第一个属性为 [ c ]。

  • 数据接口文件(sockets):

  通常被用在网络上的数据交换 。我们可以启动一个程序来监听用户端的要求, 而用户端就可以通过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/run或/tmp这些个目录中看到这种文件类型了。

  • 数据输送文件(FIFO, pipe):

  FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO是first-in-first-out的缩写。第一个属性为[p] 。

2. Linux文件扩展名

  基本上,Linux的文件是没有所谓的“扩展名”的。一个Linux文件能不能被执行,与他的第一栏的十个属性有关, 与文件名根本一点关系也没有。这个观念跟Windows的情况不相同。

  不过,可以被执行跟可以执行成功是不一样的~举例来说,在root主文件夹下的 initial-setup-ks.cfg 是一个纯文本文件,如果经由修改权限成为 -rwxrwxrwx 后,这个文件能够真的执行成功吗? 当然不行~因为他的内容根本就没有可以执行的数据。所以说,这个x代表这个文件具有可执行的能力, 但是能不能执行成功,当然就得要看该文件的内容。

  虽然如此,不过我们仍然希望可以借由扩展名来了解该文件是什么东西,所以, 通常我们还是会以适当的扩展名来表示该文件是什么种类的。下面有数种常用的扩展名:

*.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名就编成 .sh ;

*Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名;

*.html, *.php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件啰! .html 的文件可使用网页浏览器来直接打开,至于 .php 的文件, 则可以通过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果。

  基本上,Linux系统上的文件名真的只是让你了解该文件可能的用途而已。

3. Linux文件名长度限制

  在Linux下面,使用传统的Ext2/Ext3/Ext4文件系统以及近来被 CentOS 7 当作默认文件系统的 xfs 而言,针对文件的文件名长度限制为:

  单一文件或目录的最大容许文件名为 255Bytes,以一个 ASCII 英文占用一个 Bytes 来说,则大约可达 255 个字符长度。若是以每个中文字占用 2Bytes 来说, 最大文件名就是大约在 128 个中文。

4. Linux文件名称的限制

  由于Linux在命令行下的一些指令操作关系,一般来说,你在设置Linux下面的文件名称时, 最好可以避免一些特殊字符比较好!例如下面这些:

*   ?   >    <   ;    &    !    [ ]    |     \    '   "    ` ( )  { }


  因为这些符号在命令行下,是有特殊意义的。另外,文件名称的开头为小数点“.”时, 代表这个文件为“隐藏文件”喔!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以最好也避免将文件文件名的开头以 - 或 + 来命名。

3. Linux目录配置

   因为利用Linux来开发产品或distributions的社区,公司与个人实在太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰。 所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准的出炉。

  FHS的重点在于规范每个特定的目录下应该要放置什么样的数据。

  FHS依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态,用表格来说有点像下面这样:

 

linux 用户授权 java运行权限 linux用户授权目录_文件名_12

 

 ps:这个档指的就是文件的意思,弯弯和咱们大陆的翻译有点区别,emmm。还有序列埠指的是串行端口。

  • 可分享的:可以分享给其他系统挂载使用的目录,所以包括可执行文件与使用者的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;
  • 不可分享的:自己机器上面运行的设备文件或者是与程序有关的socket文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
  • 不变的:有些数据是不会经常变动的,跟随着distribution而不变动。 例如函数库、文件说明文档、系统管理员所管理的主机服务配置文件等等;
  • 可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻群组等。

事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:

  • / (root, 根目录):与开机系统有关;
  • /usr (unix software resource):与软件安装/执行有关;
  • /var (variable):与系统运行过程有关。

 1. 根目录 (/) 的意义与内容:

  根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函数库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。

  因此FHS标准建议:根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。

  鉴于上述的说明,因此FHS定义出根目录(/)下面应该要有下面这些子目录的存在才好,即使没有实体目录,FHS也希望至少有链接文件存在才好:

 

linux 用户授权 java运行权限 linux用户授权目录_文件名_13

 

  

linux 用户授权 java运行权限 linux用户授权目录_文件名_14

 

2.  /usr 的意义与内容:

  依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何通过网络进行分区的挂载(,那么/usr确实可以分享给区域网络内的其他主机来使用。

  我开始会误会/usr为user的缩写,其实usr是Unix Software Resource的缩写, 也就是“Unix操作系统软件资源”所放置的目录。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的子目录,而不要自行创建该软件自己独立的目录。

  因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr下面,因此这个目录有点类似Windows 系统的“C:\Windows\ (当中的一部份) + C:\Program files\”这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr的子目录建议有下面这些:

 

linux 用户授权 java运行权限 linux用户授权目录_linux 用户授权 java运行权限_15

 

 3. /var 的意义与内容

   如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。 因为/var目录主要针对常态性变动的文件,包括高速缓存(cache)、登录文件(log file)以及某些软件运行所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等等。常见的子目录有:

 

linux 用户授权 java运行权限 linux用户授权目录_linux 用户授权 java运行权限_16

 

   每家可能不一样,请以实物为主,不过大致一样。

 4. 目录树(directory tree)

  在Linux下面,所有的文件与目录都是由根目录开始的,那是所有目录与文件的源头~ 然后再一个一个的分支下来,有点像是树枝状啊~因此,我们也称这种目录配置方式为:“目录树(directory tree)” 这个目录树有什么特性呢?他主要的特性有:

  • 目录树的启始点为根目录 (/, root);
  • 每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。
  • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。

 

linux 用户授权 java运行权限 linux用户授权目录_根目录_17

 

 5. 绝对路径与相对路径

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc;
  • 相对路径:相对于目前路径的文件名写法
  •  . :代表当前的目录,也可以使用 ./ 来表示;
  •  .. :代表上一层目录,也可以 ../ 来代表。

 

  人生不如意的时候,是上帝给的长假,这个时候应该好好享受假期。
  突然有一天假期结束,时来运转,人生才是真正开始了。