最近玩linux,遇到一些问题,百度到了几篇好文章,现在分享下. linux 从ls命令开始Linux学习的第一步就是掌握常用命令,Linux命令众多,以笔者使用的Red Hat Enterprise Linux 5.4来说,有大概两千多个命令,假设每个命令有二十个选项,如此多的命令和选项全部敲一遍,简直是在浪费生命浪费键盘浪费手指头,更加没有必要买一本大部头的什么命令大全之类的东西狂看,真正在管理应用中使用到的命令大概也就只有一二百个,所以要把握学习的原则,掌握最常使用的命令和最常使用的选项即可。在入门悟道之后,碰到未知的命令或选项,只要自己掌握获得帮助的方法,即可一通百通,如同已有九阳神功护体再学习乾坤大挪移或葵花宝典就小case了。 学习命令的窍门之一是掌握方法,把每个命令的英文全称和每个选项的英文单词找到,籍此记忆强于死记硬背,方可事半功倍;学习命令的窍门之二是不断的练习和实验,记住,练习是掌握命令的最好方法,毛主席教导我们说“实践是验证真理的唯一标准”;学习命令的窍门之三是学习和练习每个命令或选项时不要形而上学,要多想一想什么时候会用到如何去用,才能让你的知识系统化和有目的性。 Linux中使用频率最高的命令唯ls莫属,而ls使用最多的选项自然是-l 。本讲即以ls -l命令为例做一示例讲解,全做抛砖引玉。 ls意为“list directory contents”,列出目录内容之意,可理解为ls即为list的缩写;-l意为“use a long listing format”,长格式显示,通俗点说就是显示文件的详细信息,可理解为l即为long的缩写。通过man、info等帮助命令可获得此信息,英文不好的兄弟还可籍此学习(每天背上二三十个英文单词,不出三个月所有Linux英文帮助文档相信应该都差不多可以看懂),通过这种方法记忆会容易得多。 在Linux中使用ls -l命令查看文件的详细信息:
“-rw-r--r--”第一个字符表示文件类型,常见的文件类型包括:-表示二进制文件,d表示目录,l表示软链接文件,使用ls查看会发现有颜色标记不同的文件类型,如目录是蓝色、二进制文件是白色、软链接是青色……默认ls查看目录内容是没有颜色标记的,之所以会显示这样的信息,因为在Linux中默认有一个别名定义:
甚至颜色还可以更改,比如你喜欢黄色想把目录改成黄色,只需编辑配置文件/etc/DIR_COLORS即可,把这个文件复制改名并保存用户宿主目录中(cp /etc/DIR_COLORS ~/.dir_colors),就可以产生一个用户独立的配置,具体颜色如何更改只要看此文件的注释说明即可。笔者并不推荐用颜色的方式识别文件类型,一来大多UNIX默认无此设置;二来很多远程登录管理工具默认不支持颜色标记。 尤其要说明的是软链接文件,在Linux中,有两种链接文件,一种是软链接,类似Windows的桌面快捷方式;一种是硬链接,相当于复制+同步更新。
可以观察到软链接文件用l标记,权限皆为“lrwxrwxrwx”,会有->指向源文件,它很小,同Windows快捷方式一样,只是一个符号链接。而硬连接所有属性与原文件相同,且与原文件可以同步更新,最牛X的是原文件即便被干掉了,硬连接依然有效,而软链接当然就死翘翘了。知其然还要知其所以然,为什么硬链接可以这么牛XX ,在此要先讲一个Linux法则,这个法则说的通俗一点就是Linux内核这家伙不认识字母,所以它在管理文件时文件要用一个数字标记,就是i节点;同样,用户要有一个UID 、用户组要有一个GID 、进程要有一个PID …… ls -i可以查看到文件的i节点:
679394 install.log 679394 install.log.hard 679477 install.log.soft 在Linux中每个文件必须有一个i节点,反之,一个i节点是不是必须对应一个文件,一般来说是的,但是硬链接就是个特例,大家会看到原文件和硬链接对映一个i节点,所以它们会同步更新,因为内核不管文件名是什么它只识别i节点,这就是硬链接和原文件可以同步更新的原因。 其他九个字符,每三个字符对应一种用户类型,简单来说,Linux中基本的权限管理,是每个文件把用户分成了三类: 第一类是所有者(u),也就是文件的创建者或拥有者 一般来说文件的创建者就是所有者,但有时会变更文件所有者,比如笔者原本在写一个防火墙脚本,因出差,工作要转交给另一个同事,索性把文件所有者改为他,他即可拥有对文件的全部操作权限,此时可以理解为他是文件的拥有者也就是所有者。文件的所有者只能有一个。 第二类是所属组(g),可以定义一组具有相同权限的用户对文件的操作权限 文件所属组默认就是创建文件的所有者所在的缺省组,一个用户可以属于多个组,但是只有一个缺省组,就像不管你是多么大个的花心大萝卜,你只能有一个媳妇,这就是缺省的,缺省的只能有一个,而且在Linux中规定,没媳妇的萝卜是不允许存在的!每个用户必须有个缺省组,添加用户时如果没有指定所属组系统会自动为你分配。理论上来说,一个管理做的很好的系统,应该每个用户都隶属于至少一个组,不可能添加一个用户到系统是什么都不让他做的或者他不属于任何公司部门的,这是管理员要规划好的事情。 第三类是其他人(o),如果不是所有者也不是所属组中的成员,那么就属于其他人 Linux中的用户分类比较简单,权限也简单的分为r可读、w可写、x可执行三种,ls-l的第三个部分“root root”分别对应着文件的所有者和所属组,所以此文件的权限为:所有者root对文件有读写权限,而所属组root用户组和其他人只有读权限。 深入理解rwx做一个小实验,用root用户登录系统,然后执行:
问题:普通用户zhangsan是否可以删除管理员root创建的newfile文件? 答案是:可以。很多朋友觉得不可以,因为newfile文件是root创建且其他用户没有写权限,这其实是搞错了一个概念:认为删除一个文件的前提条件是对文件有写权限。要注意的是,rwx对于文件和目录的意义是截然不同的,这往往是新手容易忽视的地方,我们通过表格比较一下。 代表字符 1.r 2.w 3.x 1.对于文件来说 可读是指可以使用cat、more等命令查看文件内容; 可写是指可以使用vi等编辑器修改文件内容; 可执行指的是这个文件可能是命令或者Shell脚本等,可以执行。 2.对于目录来说 可读是指能使用ls命令显示目录下的内容; 可写指的是能够在此目录下使用mkdir、touch、rm等命令创建或删除文件; 可执行指的是能够使用cd进入目录。 所以,在Linux中,一个文件能否被删除,是取决于命令执行者对文件所在目录是否有写权限,而与文件本身权限无关,文件本身权限只是限定文件内容查看或修改权限及是否可执行。 用户授权授权用户zhangsan和lisi对/backup目录具有读写权限,是Linux中最基本的用户与权限管理,一般的做法是:把zhangsan和lisi用户加入到一个用户组中,然后改变/backup目录的所属组为此用户组,再将所属组权限设置为rw即可。
drwxrwxr-x 2 root admgroup 4096 May 20 08:19 /backup 以上是授权用户对目录的访问权限,若授权用户对文件的控制权限,则要更复杂一点,除了对文件本身授权外,还要授权用户对文件所在目录具有可读可执行权限。如笔者使用的Red Hat Linux系统在安装后会在/root下生成安装日志文件,设置用户zhangsan和lisi对/root/install.log文件有读写权限,还要考虑用户对文件所在目录/root要具有可读和可执行权限,否则依然无法获得文件的操作权限。 ls -l的第二部分“1”表示硬连接数,默认文件本身起始硬链接数就是1 ,如果新建了一个硬链接文件,会更新为2 ,此项意义不大,不做过多讨论。 ls -l的第五部分“27974”表示文件大小,在笔者使用的系统中是以字节为单位,但是很多Linux或UNIX系统单位以数据块为单位,一个数据块为512字节。 ls -l的第六部分“Oct 27 2009”表示文件的创建时间或最后更改时间(如果文件在创建后被更改过的话)。 最后一部分“install.log”自然就是文件名了,在Linux中与Windows不同,第一,文件不必一定有后缀名;第二,文件名可以使用除“/”以外的任意字符;第三,以“.”开头的文件在Linux中表示隐藏文件。 深入理解 setUID在Linux系统中每个普通用户都可以更改自己的密码,这是合理的设置。问题是:用户的信息保存在文件/etc/passwd中,用户的密码保存在文件/etc/shadow中,也就是说用户更改自己密码时是修改了/etc/shadow文件中的加密密码,但是,LOOK——
/etc/passwd文件每个用户都有读权限但是只有root有写权限,/etc/shadow文件只有超级用户root有读写权限,也就是说普通用户对这两个文件都没有写权限无法写入新密码,为什么普通用户可以更改密码呢? 其实,用户能更改密码真正的秘密不在于文件的权限,而在于更改密码的命令passwd 。 可以试验用root身份修改passwd命令权限去掉SetUID : 接下来我们用两个SetUID的按理来进一步诠释下它的概念—— SetUID授权示例为便于深入理解SetUID ,笔者以touch命令为例做一演示。
文件的创建者默认就是所有者,所以文件newfile01的所有者为samlee 。
再用普通用户samlee创建文件newfile02,看到如下结果:
通过这个例子,我们可以再诠释下SetUID的定义,当一个可执行文件(命令touch)设置SetUID权限后,当普通用户samlee执行touch创建新文件时,实际上是以touch命令所有者root的身份在执行此操作,既然是以root身份执行,当然新建文件的所有者为root ,这就是SetUID的作用。 再看一下与SetUID类似的SetGID权限,看一个例子,给touch命令再授予SetGID:
此时,再使用touch创建新文件newfile03,会看到如下现象:
新建文件的所属组为touch命令的所属组,而不是执行touch命令的普通用户samlee的所属组,这就是SetGID的作用,与SetUID类似,用户在执行具有SetGID的命令时会调用命令所属组的身份。 危险的SetUID对于SetUID的使用,可以做一个的比喻:一个绝密机关,要让一些人进来做一些事情,但是不能让他们看见机关内部的情况,于是授权一些特殊的“车辆”(没有窗户,车门紧闭,看不到外面,只有一个小洞允许乘坐的人伸出手臂做事),带着所乘坐的人开到要去的地方,允许它办完事情马上带他出来。这样是不是很安全?不一定。如果“车辆”没有经过精挑细选,可能有很多“门窗”,那可就危险了,这种类似的场景相信大家在一些警匪电影中已经见过多次了。 普通用户使用vi编辑/etc/shadow文件会提示“Permission Denied”,这是合理的设置,但是如果赋予vi以SetUID权限:
此时,普通用户使用vi即可以编辑/etc/shadow文件,因为具备root身份,可以进行任意读写操作(比如可以把任何一个用户密码位清空,则用户登录不需要输入密码)。但是使用more、cat等命令仍然无法查看文件/etc/shadow的内容,只有被授予了SetUID的vi可以查看和修改。同样,vi如果具有了SetUID权限,普通用户可以vi编辑/etc/passwd文件把自己的UID改为0,则他的权限就和root一样;可以vi编辑/etc/inittab文件把缺省运行级别改成6 ,则Linux会开机后不停的重启 再来看一个令人不安的情况,用普通用户尝试关闭Apache服务:
可以看到,普通用户不可以关闭root启动的进程,但是如果做下面一个动作:
现在当普通用户执行kill时,因为kill被授予了SetUID权限,在执行的一瞬间具有了root权限,只要用户不爽想关闭任何服务都可以! 所以,SetUID权限不能随便设置,同时要防止黑客的恶意修改,怎样避免SetUID的不安全影响,有几点建议: 可以对系统中应该具有SetUID权限的文件作一列表,定时检查有没有非列表中的命令被设置了SetUID权限。
命令find选项“-perm”为指定文件权限,SetUID权限位对应数字标识为4 ,SetGID权限位对应数字标识为2 ,后面写为“000”标识对所有者所属组其他人三类用户的权限不限制;“-o”表示or,就是文件具有SetUID或者具有SetGID都在搜索之列,生成的搜索结果存放在文件/script/setuid.list中。 在需要对系统做检查时,执行以下shell程序。也可以放在计划任务中定时检查。
/bin/rm /tmp/setuid.check 另外,如果在一些数据存放的分区想禁用SetUID功能,还可以做如下设置,编辑配置文件/etc/fstab ,找到要设置的分区(如/home)所对应的设置行:
在设置“defaults”后,添加“nosuid”选项,并重新挂载/home分区:
设置后,分区/home上任何可执行文件即使被设置了SetUID权限也无法执行(读者可自行拷贝一个SetUID命令至/home目录下执行试验),在一些存放数据、用来备份等功能的分区上做此设置,可以保护系统安全。 其他的一些linux权限权限之粘着位Linux中有一个存放临时文件的目录/tmp(类似于Windows中的temp目录),每个用户产生的临时文件都存放在此目录下,也就是说每个用户对/tmp目录都应该有写权限(否则无法拷贝生成文件),这样造成一个问题,比如,高洛峰在/tmp目录下创建了一个文件,张沫看着不爽就可以删掉,这如何控制?
瞧见那个rwx权限最后的“t”了没,那个神奇的“t”就是粘着位t(有的资料中文也称为粘滞位),是Linux特殊权限中的第三个(另外两个是SetUID和SetGID),定义为:权限为777的目录设置粘着位t以后,具有写权限每个用户都可以在目录下创建文件,不同的是每个用户只能删除自己是所有者的文件,也就是说只能删除自己创建的文件。
此时普通用户尝试删除其他用户的文件时,会给出提示“Operation not permitted”(中文翻译:你丫没事吧,瞎得瑟啥,哥的文件你删不了)。 文件系统权限每个操作系统都要有一种组织管理数据的方式,我们可以理解为就是文件系统,比如Windows的NTFS、FAT ,Linux的EXT ,而在Linux加载分区时可以针对文件系统进行权限设定。 1.只读分区 默认加载分区是可读写rw的,但是如果特殊应用希望分区加载后是只读的,可以做一下设置:
如果你不嫌麻烦也可以重启系统,设置同样会生效。
会提示/soft分区是只读的,即便牛X到是root也不可以创建文件,这是凌驾于rwx权限之上的文件系统权限,相当的牛A与牛C之间。像本例是笔者公司的软件共享目录,一般半个月才更新一次软件,平时不想任何人增加或删除(包括不希望root用户误删除),所以设置为ro ,更新软件时,可以临时更改会rw来设置: 2.安全分区 数据存储的分区,如用做备份的分区,我们可以增加下安全设置选项: 权限之chattrchatrr只有超人root用户可以使用,用来修改文件的权限属性,建立凌驾于rwx基础权限之上的授权。 1.无法删除和更改的文件
这时,README文件所在目录所有用户都有读写权限,但是任何用户都无法删除README文件(包括root),尝试删除会提示:
同样也不可以改变文件的内容,可以查看到README文件被增加了一个不可更改的属性:
此时,README变成了一个非常牛XX的文件,即便你是SuperUser也无法删除和修改它,想对它干嘛都不成。
2.备份目录应用
设置后,可在本机测试:
chattr命令不宜对目录/、/dev、/tmp、/var等设置,严重者甚至容易导致系统无法启动,比如根目录如果设置了i属性,谨慎设置,看过此文试验后造成系统问题者,笔者概不负责…… 权限之ACLLinux中默认的权限管理比较菜,难以实现复杂的权限控制,如针对一个文件设置几个用户或用户组具有不同权限,这就需要依靠ACL(Access Control List)访问控制列表实现,可以针对任意指定的用户/用户组分配权限。
然后重新加载分区即可生效: mount -o remount /backup 如果想临时生效可不修改/etc/fstab文件,直接执行命令“mount -o remount,acl /backup”即可。 案例:设定复杂权限控制目录
会发现文件权限位后增加了一个加号,这说明/backup/log设置了ACL ,同时可以查看其详细的权限设置:
这样即可实现Linux中文件/目录的复杂权限控制,要注意的是ACL优先于基本权限设置,也就是说如果默认所属组为rx权限,但是ACL若指定了所属组中某个成员为rwx权限,则此成员拥有rwx权限。 权限之管理员授权管理员做为特权用户,很容易误操作造成不必要的损失,再者都是root管理也怪累的,管理员也是人,也需要留点时间去约约会看看电影装装傻发发呆啥的不是……所以健康的管理方法是Linux服务架构好后,可授权普通用户协助完成日常管理,现在最流行的工具是Sudo ,几乎所有Linux都已缺省安装。
指定组名用百分号标记,如%admgroup ,多个授权命令之间用逗号分隔。
提示输入密码为zhaoliu的密码,验证其是否为管理员通过sudo授权的用户,执行命令: 案例:授权用户管理Apache 参考: |
|