3.1 文件/目录的权限

3.1.1 文件的权限

每个文件都有其所有者(u:user)、所属组(g:group)和其他人(o:other)对它的操作权限,a:all则同时代表这3者。权限包括读(r:read)、写(w:write)、执行(x:execute)。在不同类型的文件上读、写、执行权限的体现有所不同,所以目录权限和普通文件权限要区分开来。

在普通文件上:

r:可读,可以使用类似cat等命令查看文件内容;读是文件的最基本权限,没有读权限,普通文件的一切操作行为都被限制。

w:可写,可以编辑此文件;

x:可执行,表示文件可由特定的解释器解释并运行。可以理解为windows中的可执行程序或批处理脚本,双击就能运行起来的文件。

在目录上:

r:可以对目录执行ls以列出目录内的所有文件;读是文件的最基本权限,没有读权限,目录的一切操作行为都被限制。

w:可以在此目录创建或删除文件/子目录;

x:可进入此目录,可使用ls -l查看文件的详细信息。可以理解为windows中双击就进入目录的动作。

如果目录没有x权限,其他人将无法查看目录内文件属性(只能查看到文件类型和文件名,至于为什么,见后文),所以一般目录都要有x权限。而如果只有执行却没有读权限,则权限拒绝。

一般来说,普通文件的默认权限是644(没有执行权限),目录的默认权限是755(必须有执行权限,否则进不去),链接文件的权限是777。当然,默认文件的权限设置方法是可以通过umask值来改变的。

3.1.2 权限的表示方式

权限的模式有两种体现:数字体现方式和字符体现方式。

权限的数字表示:"-"代表没有权限,用0表示。

r-----4

w-----2

x-----1

例如:rwx rw- r--对应的数字权限是764,732代表的权限数值表示为rwx -wx -w-。

3.1.3 chmod修改权限

能够修改权限的人只有文件所有者和超级管理员。

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... num_mode FILE...
chmod [OPTION]... --reference=RFILE FILE... 选项说明:
--reference=RFILE:引用某文件的权限作为权限值
-R:递归修改,只对当前已存在的文件有效

(1). 使用数值方式修改权限

shell> chmod  /tmp/a.txt

(2). 使用字符方式修改权限

由于权限属性附在文件所有者、所属组和其它上,它们三者都有独立的权限位,所有者使用字母"u"表示,所属组使用"g"来表示,其他使用"o"来表示,而字母"a"同时表示它们三者。所以使用字符方式修改权限时,需要指定操作谁的权限。

chmod [ugoa][+ - =] [权限字符] 文件/目录名

"+"是加上权限,"-"是减去权限,"="是直接设置权限

[root@xuexi tmp]# chmod u-x,g-x,o-x test        # 将ugo都去掉x权限,等价于chmod -x test
[root@xuexi tmp]# chmod a+x test # 为ugo都加上x权限,等价于chmod +x test

3.1.4 chgrp

更改文件和目录的所属组,要求组已经存在。

注意,对于链接文件而言,修改组的作用对象是链接的源文件,而非链接文件本身。

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE.. 选项说明:
-R:递归修改
--reference=dest_file file_list:引用某文件的group作为文件列表的组,即将file文件列表的组改为dest_file的组

3.1.5 chown

chown可以修改文件所有者和所属组。

注意,对于链接文件而言,默认直接修改源文件,而非修改链接文件本身。

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... [OWNER][.[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE... 选项说明:
--from=CURRENT_OWNER:CURRENT_GROUP:只修改当前所有者或所属组为此处指定的值的文件
--reference=RFILE:引用某文件的所有者和所属组的值作为新的所有者和所属组
-R:递归修改。注意,当指定-R时,且同时指定下面某一个选项时对链接文件有不同的行为
-H:如果chown的文件参数是一个链接到目录的链接文件,则穿过此链接文件修改其源目录的所有者和所属组
-L:目录中遇到的所有链接文件都穿越过去,修改它们的源文件的所有者和所属组
-P:不进行任何穿越,只修改链接文件本身的所有者和所属组。(这是默认值)
这3项若同时指定多项时,则最后一项生效

chown指定所有者和所属组的方式有两种,使用冒号和点。

shell> chown root.root test
shell> chown root:root test
shell> chown root test # 只修改所有者
shell> chown :root test # 自修改组
shell> chown .root test

3.2 实现权限的本质

涉及文件系统的知识点,若不理解,可以先看看文件系统的内容。此处是以ext4文件系统为例的,在其他文件系统上结果可能会有些不一样(centos 7上使用xfs文件系统时结果可能就不一样),但本质是一样的。

不同的权限表示对文件具有不同能力,如读写执行(rwx)权限,但是它是怎么实现的呢?描述文件权限的数据放在哪里呢?

首先,权限的元数据放在inode中,严格地说是放在inode table中,因为每个块组的所有inode组成一个inode table。在inode table中使用一列来存放数字型的权限,比如某文件的权限为644。每次用户要对文件进行操作时系统都会先查看权限,确认该用户是否有对应的权限来执行操作。当然,inode table一般都已经加载到内存中,所以每次查询权限的资源消耗是非常小的。

无论是读、写还是执行权限,所体现出来的能力究其本质都是因为它作用在对应文件的data block上。

3.2.1 读权限(r)

对普通文件具有读权限表示的是具有读取该文件内容的能力,对目录具有读权限表示具有浏览该目录中文件或子目录的能力。其本质都是具有读取其data block的能力。

对于普通文件而言,能够读取文件的data block,而普通文件的data block存储的直接就是数据本身, 所以对普通文件具有读权限表示能够读取文件内容。

对于目录文件而言,能够读取目录的data block,而目录文件的data block存储的内容包括但不限于:目录中文件的inode号(并非直接存储,而是存储指向inode table中该inode号的指针)以及这些文件的文件类型、文件名。所以能够读取目录的data block表示仅能获取到这些信息。

目录的data block内容示例如下:

例如:

shell> mkdir -p /mydata/data/testdir/subdir     # 创建testdir测试目录和其子目录subdir
shell> touch /mydata/data/testdir/a.log # 再在testdir下创建一个普通文件
shell> chmod /mydata/data/testdir # 将testdir设置为对其他人只有读权限

然后切换到普通用户查看testdir目录的内容。

shell> su - wangwu

shell> ll -ai /mydata/data/testdir/
ls: cannot access /mydata/data/testdir/..: Permission denied
ls: cannot access /mydata/data/testdir/a.log: Permission denied
ls: cannot access /mydata/data/testdir/subdir: Permission denied
ls: cannot access /mydata/data/testdir/.: Permission denied
total
? d????????? ? ? ? ? ? .
? d????????? ? ? ? ? ? ..
? -????????? ? ? ? ? ? a.log
? d????????? ? ? ? ? ? subdir

从结果中看出,testdir下的文件名和文件类型是能够读取的,但是其他属性都不能读取到。而且也读取不到inode号,因为它并没有直接存储inode号,而是存储了指向Inode号的指针,要定位到指针的指向需要执行权限。

3.2.2 执行权限(x)

执行权限表示的是能够执行。如何执行?执行这个词不是很好解释,可以简单的类比Windows中的双击行为。例如对目录双击就能进入到目录,对批处理文件双击就能运行(有专门的解释器解释),对可执行程序双击就能运行等。

当然,读权限是文件的最基本权限,执行权限能正常运行必须得配有读权限。

对目录有执行权限,表示可以通过目录的data block中指向文件inode号的指针定位到inode table中该文件的inode信息,所以可以显示出这些文件的全部属性信息。

3.2.3 写权限(w)

写权限很简单,就是能够将数据写入分配到的data block。

对目录文件具有写权限,表示能够创建和删除文件。目录的写操作实质是能够在目录的data block中创建或删除关于待操作文件的记录。它要求对目录具有执行权限,因为无论是创建还是删除其内文件,都需要将其data block中inode号和inode table中的inode信息关联或删除。

对普通文件具有写权限,实质是能够改写该文件的data block。

还是要说明的是,对文件有写权限不代表能够删除该文件,因为删除文件是要在目录的data block中删除该文件的记录,也就是说删除权限是在目录中定义的。

所以,对目录文件和普通文件而言,读、写、执行权限它们的依赖关系如下图所示。

3.3 umask说明

umask值用于设置用户在创建文件时的默认权限。对于root用户(实际上是UID小于200的user),系统默认的umask值是022;对于普通用户和系统用户,系统默认的umask值是002。

默认它们的设置是写在/etc/profile和/etc/bashrc两个环境配置文件中。

shell> grep -C  -R 'umask 002'  /etc | grep 'umask 022'
/etc/bashrc- umask
/etc/csh.cshrc- umask
/etc/profile- umask

相关设置项如下:

if [ $UID -gt  ] && [ "`id -gn`" = "`id -un`" ]; then
umask
else
umask
fi

执行umask命令可以查看当前用户的umask值。

[root@xuexi tmp]# umask
[longshuai@xuexi tmp]$ umask

执行umask num可以临时修改umask值为num,但这是临时的,要永久有效,需要写入到环境配置文件中,至于写入到/etc/profile、/etc/bashrc、~/.bashrc还是~/.bash_profile中,看你自己的需求了。不过一般来说,不会去永久修改umask值,只会在特殊条件下临时修改下umask值。

umask是如何决定创建文件的默认权限的呢?

如果创建的是目录,则使用777-umask值,如root的umask=022,则root创建目录时该目录的默认权限为777-022=755,而普通用户创建目录时,权限为777-002=775.

如果创建的是普通文件,在Linux中,深入贯彻了一点:文件默认不应该有执行权限,否则是危险的。所以在计算时,可能会和想象中的结果不一样。如果umask的三位都为偶数,则直接使用666去减掉umask值,因为6减去一个偶数还是偶数,任何位都不可能会有执行权限。如root创建普通文件时默认权限为666-022=644,而普通用户创建普通文件时默认权限为666-002=664。

如果umask值某一位为奇数,则666减去umask值后再在奇数位上加1。如umask=021时,创建文件时默认权限为666-021=645,在奇数位上加1,则为646。

[longshuai@xuexi tmp]$ umask
[longshuai@xuexi tmp]$ touch b.txt
[longshuai@xuexi tmp]$ ls -l b.txt
-rw-r--rw- longshuai longshuai Jun : b.txt

总之计算出后默认都是没有执行权限的。

3.4 文件的扩展ACL权限

在计算机相关领域,所有的ACL(access control list)都表示访问控制列表。

文件的owner/group/others的权限就是一种ACL,它们是基本的ACL。很多时候,只通过这3个权限位是无法完全合理设置权限问题的,例如如何仅设置某单个用户具有什么权限。这时候需要使用扩展ACL。

扩展ACL是一种特殊权限,它是文件系统上功能,用于解决所有者、所属组和其他这三个权限位无法合理设置单个用户权限的问题。所以,扩展ACL可以针对单一使用者,单一档案或目录里的默认权限进行r,w,x的权限规范。

需要明确的是,扩展ACL是文件系统上的功能,且工作在内核,默认在ext4/xfs上都已开启。

在下文中,都直接以ACL来表示代替扩展ACL的称呼。

3.4.1 查看文件系统是否开启ACL功能

对于ext家族的文件系统来说,要查看是否开启acl功能,使用dumpe2fs导出文件系统属性即可。

shell> dumpe2fs -h /dev/sda2 | grep -i acl
dumpe2fs 1.41. (-May-)
Default mount options: user_xattr acl

对于xfs文件系统,则没有直接的命令可以输出它的相关信息,需要使用dmesg来查看。其实无需关注它,因为默认xfs会开启acl功能。

shell> dmesg | grep -i acl
[ 1.465903] systemd[]: systemd running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[ 2.517705] SGI XFS with ACLs, security attributes, no debug enabled

开启ACL功能后,不代表就使用ACL功能。是否使用该功能,不同文件系统控制方法不一样,对于ext家族来说,通过mount挂载选项来控制,而对于xfs文件系统,mount命令根本不支持acl参数(xfs文件系统如何关闭或启用的方法本人也不知道)。

3.4.2 设置和查看ACL

设置使用setfacl命令。

setfacl [options] u:[用户列表]:[rwx] 目录/文件名    # 对用户设置使用u
setfacl [options] g:[组列表]:[rwx] 目录/文件名 # 对组设置使用g 选项说明:
-m:设定ACL权限(modify)
-x:删除指定的ACL权限,可以指定用户、组和文件来删除(remove)
-M:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-m,所以-M指定的是modify file
-X:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-x,所以-X指定的是remove file
-n:不重置mask
-b:删除所有的ACL权限
-d:设定默认ACL权限,只对目录有效,设置后子目录(文件)继承默认ACL,只对未来文件 有效
-k:删除默认ACL权限
-R:递归设定ACL权限,只对目录有效,只对已有文件有效

查看使用getfacl命令

getfacl filename

案例:假设现有目录/data/videos专门存放视频,其中有一个a.avi的介绍性视频。该目录的权限是750。现在有一个新用户加入,但要求该用户对该目录只有查看的权限,且只能看其中一部视频a.avi,另外还要求该用户在此目录下没有创建和删除文件的权限。

1.准备相关环境。

shell> mkdir -p /data/videos
shell> chmod /data/videos
shell> touch /data/videos/{a,b}.avi
shell> echo "xxx" >/data/videos/a.avi
shell> echo "xxx" >/data/videos/b.avi
shell> chown -R root.root /data/videos

2.首先设置用户longshuai对/data/videos目录有读和执行权限。

shell> setfacl -m u:longshuai:rx /data/videos

3.现在longshuai对/data/videos目录下的所有文件都有读权限,因为默认文件的权限为644。要设置longshuai只对a.avi有读权限,先设置所有文件的权限都为不可读。

shell> chmod  /data/videos/*

4.然后再单独设置a.avi的读权限。

shell> setfacl -m u:longshuai:r /data/videos/a.avi

到此就设置完成了。查看/data/videos/和/data/videos/a.avi上的ACL信息。

shell> getfacl /data/videos/
getfacl: Removing leading '/' from absolute path names
# file: data/videos/
# owner: root
# group: root
user::rwx
user:longshuai:r-x # 用户longshuai在此文件上的权限是r-x
group::r-x
mask::r-x
other::---
shell> getfacl /data/videos/a.avi
getfacl: Removing leading '/' from absolute path names
# file: data/videos/a.avi
# owner: root
# group: root
user::rw-
user:longshuai:r-- # 用户longshuai在此文件上的权限是r--
group::r--
mask::r--
other::---

3.4.3 ACL:mask

设置mask后会将mask权限与已有的acl权限进行与计算,计算后的结果会成为新的ACL权限。

设定mask的方式为:

setfacl -m m:[rwx] 目录/文件名

注意:默认每次设置文件的acl都会重置mask为此次给定的用户的值。既然如此,要如何控制文件上的acl呢?如果一个文件上要设置多个用户的acl,重置mask后就会对已有用户的acl重新计算,而使得acl权限得不到有效的控制。使用setfacl的"-n"选项,它表示此次设置不会重置mask值。

例如:

当前的acl权限:

shell> getfacl /data/videos
getfacl: Removing leading '/' from absolute path names
# file: data/videos
# owner: root
# group: root
user::rwx
user:longshuai:rwx
group::r-x
mask::rwx
other::---

设置mask值为rx。

shell> setfacl -m m:rx /data/videos

shell> getfacl /data/videos
getfacl: Removing leading '/' from absolute path names
# file: data/videos
# owner: root
# group: root
user::rwx
user:longshuai:rwx #effective:r-x
group::r-x
mask::r-x
other::---

设置mask后,它提示有效权限是r-x。这是rwx和r-x做与运算之后的结果。

再设置longshuai的acl为rwx,然后查看mask,会发现mask也被重置为rwx。

shell> setfacl -m u:longshuai:rwx /data/videos

shell> getfacl  /data/videos
getfacl: Removing leading '/' from absolute path names
# file: data/videos
# owner: root
# group: root
user::rwx
user:longshuai:rwx
group::r-x
mask::rwx
other::---

所以,在设置文件的acl时,要使用-n选项来禁止重置mask。

shell> setfacl -m m:rx /data/videos

shell> setfacl -n -m u:longshuai:rwx /data/videos

shell> getfacl  /data/videos
getfacl: Removing leading '/' from absolute path names
# file: data/videos
# owner: root
# group: root
user::rwx
user:longshuai:rwx #effective:r-x
group::r-x
mask::r-x
other::---

3.4.4 设置递归和默认ACL权限

递归ACL权限只对目录里已有文件有效,默认权限只对未来目录里的文件有效。

设置递归ACL权限:

setfacl -m u:username:[rwx] -R 目录名

设置默认ACL权限:

setfacl -m d:u:username:[rwx] 目录名

3.4.5 删除ACL权限

setfacl -x u:用户名 文件名       # 删除指定用户ACL
setfacl -x g:组名 文件名 # 删除指定组名ACL
setfacl -b 文件名 # 指定文件删除ACL,会删除所有ACL

3.5 文件隐藏属性

chattr:change file attributes

lsattr:list file attributes

chattr [+ - =] [ai] 文件或目录名

常用的参数是a(append,追加)和i(immutable,不可更改),其他参数略。

设置了a参数时,文件中将只能增加内容,不能删除数据,且不能打开文件进行任何编辑,哪怕是追加内容也不可以,所以像sed等需要打开文件的再写入数据的工具也无法操作成功。文件也不能被删除。只有root才能设置。

设置了i参数时,文件将被锁定,不能向其中增删改内容,也不能删除修改文件等各种动作。只有root才能设置。可以将其理解为设置了i后,文件将是永恒不变的了,谁都不能动它。

例如,对/etc/shadow文件设置i属性,任何用户包括root将不能修改密码,而且也不能创建用户。

shell> chattr +i /etc/shadow

此时如果新建一个用户。

shell> useradd newlongsuai
shell> useradd: cannot open /etc/shadow # 提示文件不能打开,被锁定了

lsattr查看文件设置的隐藏属性。

shell> lsattr /etc/shadow
----i--------e- /etc/shadow # i属性说明被锁定了,e是另一种文件属性,忽略它

删除隐藏属性:

shell> chattr -i /etc/shadow
shell> lsattr /etc/shadow
-------------e- /etc/shadow

再来一例:

shell> chattr +a test1.txt        # 对test1.txt设置a隐藏属性
shell> echo >>test1.txt # 追加内容是允许的行为
shell> cat /dev/null >test1.txt # 但是清空文件内容是不允许的
-bash: test1.txt: Operation not permitted

3.6 suid/sgid/sbit

3.6.1 suid

suid只针对可执行文件,即二进制文件。它的作用是对某个命令(可执行文件)授予所有者的权限,命令执行完成权限就消失。一般是提权为root权限。

例如/etc/shadow文件所有人都没有权限(root除外),其他用户连看都不允许。

shell> ls -l /etc/shadow
----------. root root Apr : /etc/shadow

但是他们却能修改自己的密码,说明他们一定有一定的权限。这个权限就是suid控制的。

shell> ls -l /usr/bin/passwd
-rwsr-xr-x. root root Feb /usr/bin/passwd

其中的"s"权限就是suid,它出现在所有者位置上(是root),其他用户执行passwd命令时,会暂时拥有所有者位的rwx权限,也就是root的权限,所以能向/etc/shadow写入数据。

suid必须和x配合,如果没有x配合,则该suid是空suid,仍然没有执行命令的权限,所有者都没有了x权限,suid依赖于它所以更不可能有x权限。空的suid权限使用大写的"S"表示。

数字4代表suid,如4755。

3.6.2 sgid

针对二进制文件和目录。

  • 针对二进制文件时,权限升级为命令的所属组权限。
  • 针对目录时,目录中所建立的文件或子目录的组将继承默认父目录组,其本质还是提升为目录所属组的权限。此时目录应该要有rx权限,普通用户才能进入目录,如果普通用户有w权限,新建的文件和目录则以父目录组为默认组。

以2代表sgid,如2755,和suid组合如6755。

3.6.3 sbit

只对目录有效。对目录设置sbit,将使得目录里的文件只有所有者能删除,即使其他用户在此目录上有rwx权限,即使是root用户。

以1代表sbit。

2017-08-17补充:suid/sgid/sbit的标志位都作用在x位,当原来的x位有x权限时,这些权限位则为s/s/t,如果没有x权限,则变为S/S/T。例如,/tmp目录的权限有个t位,使得该目录里的文件只有其所有者本身能删除。

第3章 Linux上文件的权限管理的更多相关文章

  1. Linux的文件访问权限及修改权限命令chmod

    http://www.linuxso.com/command/chmod.html Linux的文件访问权限及修改权限命令chmod Mxx000 Mxx000 人赞同了该文章 Linux的文件访问权 ...

  2. Samtools在Linux上非root权限的安装

    第一次在Linux上不用root权限安装软件,查看了很多博客,并实践安装成功.大致总结了一下samtools的安装过程,仅供大家参考,如有不对的地方,欢迎指正~ samtools安装过程中依赖于lzm ...

  3. linux上文件的上传和下载

    现整理一篇linux上文件的上传和下载 第一种方式就是在windos上安装工具 如: 工具如何使用我就不赘述了,easy 第二种方式就是使用liux的命令(首先是文件上传) 上传文件(首先创建文件夹如 ...

  4. Linux命令——文件和目录管理

    Linux命令--文件和目录管理 基本命令 命令ls 作用:显示目录下的文件和文件夹 说明:默认显示当前目录,可跟路径参数 参数:-a,显示隐藏目录 参数:-l,显示文件权限 参数:-d,显示文件最后 ...

  5. (五)Linux之文件与目录管理以及文本处理

    Linux之文件与目录管理 目录 Linux之文件与目录管理 前言 绝对路径与相对路径说明: 一.目录常用命令 常用处理目录的命令: 切换目录 cd 显示当前路径 pwd 查看目录下文件 ls 创建目 ...

  6. Linux课程---10、权限管理(权限有哪几种)

    Linux课程---10.权限管理(权限有哪几种) 一.总结 一句话总结: r 读 w 写 x 执行 1.drwxr-x---  2 root root  4096 Jan 20 19:39 mnt ...

  7. 第6章 linux的文件权限与目录配置

    6.1用户与用户组 用户,自己的抽屉 用户组,自己的家 其他人(others),外人 root,天神 /etc/passwd 所有的系统上的账号与一般身份用户,root的相关信息 /etc/shado ...

  8. 第六章Linux的文件权限与目录配置

    一.Linux用户分类 1.Linux用户分为:(文件|目录)所有者(OWN),(同组内的)用户组,其他人; 2.一个天神:root;,几乎能完成任何事.... 二.目录权限的意义 目录的权限和文件的 ...

  9. 关于linux下文件的权限问题

    今天在linux更新服务中的启动文件时,直接把更新的启动文件拷贝过来执行,报错:can't be execute 后来想了下列出了文件的详细信息中发现拷贝过去的执行文件是-r--r--r--(表示只有 ...

随机推荐

  1. JavaScript基础视频教程总结(131-140章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. Python开发——9.面向对象编程

    一.面向对象设计(Object oriented design) 面向对象设计是将一类具体事物的数据和动作整合到一起的过程,不会要求面向对象语言编程,但如果想要构造具备对象性质和特点的数据类型,需要更 ...

  3. python_flask 基础巩固 (URL_FOR 详解)

    URL_FOR 详解 url_for 通过 视图函数能够返回对应的url,url_for 有两个参数,endpoint(视图 函数)和关键字参数 url_for('my_list',page=2),多 ...

  4. How to setup Visual Studio without pain

    Visual Studio (VS) can be very hard to install. If you are lucky, one whole day may be enough to ins ...

  5. 下划线“_”在oracle中不是单纯的表示下划线的意思,而是表示匹配单一任何字符!

    [解决办法]1.使用 escape() 函数escape关键字经常用于使某些特殊字符,如通配符:'%','_'转义为它们原来的字符的意义,被定义的转义字符通常使用'\',但是也可以使用其他的符号.例如 ...

  6. mysql-exporter

    [1] https://blog.frognew.com/2017/08/use-prometheus-monitoring-mysql.html [2] http://www.ywnds.com/? ...

  7. python网络编程 双人多人聊天

    在学习网路编程时,我们首先要考虑的是其中的逻辑,我们借助打电话的形式来了解网络编程的过程, 我们打电话时属于呼叫方,接电话的属于被呼叫方,那么被呼叫方一直保持在待机状态,等待主呼叫方 呼叫,只有在被呼 ...

  8. 1.1.5 PROB Friday the Thirteenth

    Friday the Thirteenth Is Friday the 13th really an unusual event? That is, does the 13th of the mont ...

  9. JS 实现版本号比较功能

    js实现一个客户端版本号的统计,目前该功能可以实现版本号中数字版本的统计,例如2.2.3 <2.2.3.1, 1.2.3<2.0.0,原理就是从高版本号到次版本号依次比较 if (!Arr ...

  10. HTTP 协议中 GET 和 POST 方法详解

    GET请求报文分析 1.请求行 请求方法 GET(描述该请求采用了什么请求方法),HTTP 1.0 和 1.1 协议中共包含10种请求方法.不过 HTTP 1.1 中只有8种方法. URI 请求WEB ...