Linux之用户和权限

自从我大微软终于放下身段,决定给开源社区一个迟来的拥抱,追随多年的拥趸们像是突然得到了女神的垂青,各种茫然失措、痛哭流涕、欢欣鼓舞,纷纷唱了起来:“等了好久终于等到今天,梦了好久终于把梦实现……”唱完之后才想起来好像说的什么开源、跨平台啥的和自己没太大关系,最基本的,Linux、IOS会么?被.NET细心呵护了这许多年,现在跟我说开源跨平台,你是玩我呢?不说了,拖了几个月的项目,老板还等着今天上线呢!

呵呵,开个玩笑,其实微软的开放姿态是受多数方肯定和欢迎的,IT行业各方面也多少有点影响,对于我来说,最大的影响莫过于打算好好研究下Linux,这玩意一直都想系统学习,奈何没有充足的动力,如今没有借口了,希望能尽快入门。

按照本人博客一贯的风格,本文并非系统的讲解,而是侧重于方便以后的复习回顾做笔记。本文绿字为个人见解,需验证。本系列参考书籍是《Linux就是这个范儿》,赵鑫磊和张洁著。

学习Linux第一个要面对的问题是版本选择,尼玛当时我一看就傻眼了,瞬间就有打道回府的冲动。大伙来瞅瞅,下面这还是07年时候的分支图(摘自网络),想想现在Android的景象,啧啧,这图还能装下么。

要从中选一个合适的,对门外汉来说确实不是件容易的事。开源就是这点不好,大家各行其是,说好听点百花齐放,却分流了本就不多的用户群,若如此众多的版本开发可以合力一处,windows还有笑傲江湖的资格么。虽说在服务器端因为开源的原因闯出了一片天地,但仍然无法回避占市场大头的桌面客户端的失利。博主认为凡事都不可走极端,纯开放和纯封闭都不可取,两者相互借鉴,给予自由,但又有机构按规则统一版本控制,才是软件发展的正确方式(maybe有某类开源协议支持博主的观点,除了GPL,博主对其它开源协议不甚清楚)。

所幸对于我们这群码农来说,各发行版都大同小异,一通百通。目前服务端用的比较多的免费版本非CentOS莫属,很多书籍也采用CentOS讲解,如今已到了7.1版本。

作为.NETer,虽然勾搭上了Linux,但是正房还是Windows,不可抛弃。那么如何在同台电脑上另外安装Linux呢,要知道Linux和Windows的文件系统都不一样,网上有此双系统的教程,但是为了安全计,我还是选择了虚拟机的方式。虚拟机的缺点是软件环境是模拟出来的,比如刚说的文件系统,虚拟机里Linux的文件系统都是由windows文件系统经虚拟机转换而来,效率上绝壁比原生安装的低下很多。

虚拟机我选择的是VMware Workstation,最新版11.1,注册码网上搜便是。在VMware界面上选择CentOS镜像文件,然后静静等待安装完毕即可,在此期间会让你输入用户名密码作为安装后的登录用户,然后是语言和输入法选择,完了就进入桌面了,如下:

也没什么特别的感觉,完全没有各类书籍里说的惊艳,maybe CentOS偏向于服务性能,对图形界面不care,maybe Ubuntu就不一样了。不管怎么说,我终于向前迈出了历史性的一步!


用户和用户组

Linux用户中除了root天生就很牛逼,其他用户都是屌丝。一个用户至少属于一个用户组,/etc/passwd文件中每行即表示一个用户,其中第4列即GID表示用户的“初始用户组”,用户所属的所有用户组称为“支持用户组”。还有个概念是“有效用户组”,所谓有效用户组表示用户当前所在的用户组,即用户在同一时刻只能以一个用户组成员的身份参与系统交互,至于为什么这么设计,目前未知。

前者说了,root很牛逼,几乎无所不能,很极端的对立,广大屌丝一般除了自己的一亩三分地,几乎不能干任何“有技术含量的”事(比如添加用户),所以有点什么事都要麻烦root。root为了不累死,决定传授一句咒语给屌丝们,让他们能在一段时间内具备自己(root)的能力,或者说“变身”为root,这个咒语就是sudo。比如/etc/shadow 这个文件是保存密码的,普通用户没有权限查看,一定要看的话可以执行“$ sudo cat /etc/shadow”,这时系统会要求输入当前用户密码,输密码虽然麻烦,但安全性高了,至少各类后台程序不能偷偷地搞小动作了(后来微软也学了这招,windows vista开始,右键就加入了新的菜单项——“以管理员身份运行”)。要给某个用户赋予sudo特权,就需要更改/etc/sudoers 文件中的内容,该文件能设置用户或用户组行使sudo权利的命令范围,甚至可以设置sudo时不用输入密码,不过这自然是不安全的,不推荐。

su命令,用来切换当前用户。所以如果嫌sudo太麻烦,就可以使用su临时切换到root用户,切换用户时须输入目标用户的密码。root用户使用su命令切换到任何用户都不需要输入密码,所以我们要在/etc/sudoers中明确禁止su被sudo特权执行。

和用户组类似,用户也有实际用户和有效用户(即上文说的当前用户)的概念,分别可用who am i 和 whoami 查看。

文件[属性和权限]

Linux环境大小写敏感,文件名也是,在文件名前加上“.”则该文件[夹]将隐藏。和windows不同,文件基本上没有扩展名,因为Linux不根据扩展名判断文件类型,而是根据文件的内容来判断。

文件连接,也是一种文件类型,基于inode,inode包含文件的元信息。我们可以将inode简单理解成一个指针,指向文件所在磁盘中的物理位置,多个文件名可以指向同个inode,这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问,这种情况就被称为"硬链接"(hard link)。除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向 文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。软连接和硬链接最大的不同是:软连接指向的是目标文件的文件名,而硬链接指向的是目标文件的inode,软连接两个文件的inode是不一样的,不会影响目标文件inode的连接数。更多内容可参看Linux的inode的理解

创建连接用ln,如果是复制cp命令,那么产生的是一个内容一样的新文件。

文件权限:r、w、x、s、t。前三者分表表示读、写、执行。由于权限可自由组合,所以以标志位的形式设计是最合理的。用数字表示,r为4,w为2,x为1,那么5就是r-x,rwx就是7。文件按顺序规定了拥有者、所属组和其他无关者的权限权限,如777即表示所有用户都对文件有读写执行权限,600表示只有拥有者有对该文件的权限,且该权限为读写权限即rw-。

我们可以使用chmod命令改变文件权限,如 chmod 700 testtext,这是数字权限法,还可以使用文字表示权限更改,如 chmod u+w testtext,表示给拥有者加上写权限。u、g、o、a分别表示拥有者、所属组、其他无关者和全部,+、-、=分别表示增加、减去、设定。

还有s、t,这两个权限代表什么呢?先说s,将文件的拥有者和用户组权限的执行位设置成s,分别称之为SUID和SGID,对二进制程序有效,SGID还能用在目录上。一个文件本身具有uid和gid的属性,表示拥有者和所属组,在文件被执行时,还会多出两个属性——euid和egid——分别表示执行文件的有效(当前)用户ID和有效(当前)用户组ID,Linux内核主要是根据euid和egid来确定进程对资源的访问权限。下面举个例子就清楚了:

假设文件myfile是属于foo用户的,是可执行的,现在没设SUID位,权限位是rwxr-xr-x,foo用户的uid和gid分别为200和201。另有一用户kevin,他的uid和gid分别为204和202。那么kevin运行myfile程序形成的进程的 euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。然后我们将myfile设为SUID,则euid和egid变成被运行的程序的所有者的uid和gid,即现在kevin用户运行myfile,euid=200,egid=201,则这个进程具有它的属主foo的资源访问权限。http://i.cnblogs.com/EditPosts.aspx?postid=4678311

不知道执行SUID文件过程中,之前提到的系统的有效用户和有效用户组是否也对应于执行文件时的euid和egid, 即上例后半部,kevin运行myfile时,此时的系统有效用户是kevin还是foo呢?这个问题留待日后验证。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。

SGID在二进制程序上的功效和SUID类似,在目录上能产生如下效果:假设该目录的所属组为gA,那么有效用户组为gB的用户进入此目录后,该用户的有效用户组就变成gA了,那么创建新文件,新文件的用户组就是gA。SGID如此,那么是否上述红字描述的问题也是一般答案呢?

更多内容可参看linux:SUID、SGID详解

t,将文件的其他无关者权限执行位设为t,称为SBIT,仅对目录有效。功效:用户在设置了SBIT目录下创建的文件,只有自己和root才有权利删除此文件。


其它

$PATH环境变量,决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接。

cpio命令:顾名思义,即输入输出的copy,现代电脑的标准输入就是键盘,标准输出是屏幕,我们可以通过重定向(|、>、<)输入输出,用它进行文件拷贝、打包解包等,和find等命令一起能发挥很大功效。关于cpio命令的中文man,可参看cpio命令详解

fork:拷贝一个子进程。如果一个进程fork之后,此时连同该进程是3个进程(该进程、fork后的父进程、fork后的子进程)呢,还是2个进程(该进程即fork后的父进程、fork后的子进程)呢?日后再解。

小结

接触到现在,概念倒还罢了,Linux的命令也忒多了,目前简单了解的有:man、cd、cp、kill、mkdir、mv、rm、nohup、cpio、ls、ln、jobs、find、whereis、which、type、tar、chmod、chown、su、sudo、gzip、cat、tail、bg、fg、at、crontab、echo、fork、ps、top……且不说每个命令各自的命令参数,尼玛,只能说用多如牛毛来形容了。

相关资料:

Shell脚本:Linux Shell脚本学习指南(超详细)

 

转载本文请注明出处:http://www.cnblogs.com/newton/p/4678311.html

原文地址:https://www.cnblogs.com/newton/p/4678311.html