linux第七天
权限的补充,Linux常用文本处理cat ,more与less,head,tail,cut,paste。文本分析工具wc,sort,uniq
#linux第七天
关于权限的补充

我们创建文件,是通过“遮掩的办法来创建的”,文件默认权限计算,见下图

上面说的最终结果+1,指的是:如果431是计算后的结果, 那么应该最终是442.
推导过程是上图的最后3句话:
110110110 这是文件最高权限666
010101111 这是umask257,根据umask中0不关心,1从最大权限(666)中要去掉对应权限
100010000 这就是最总结果,根据上面的公式判断后,再进行与运算
当然推导过程是比较费时间的,因此可以直接用上图最开始的公式
关于s权限

比如说我们用口令修改我们的密码,但是/etc/shadow的other是啥权限都没有的。
我们再来看命令:ll /which passwd/,会发现这个命令的所有者有rws权限
使用数字添加s权限,4755,前面加个4,这就是suid

sgid继承的是组权限,比如chmod 2755 /bin/cat,sgid是用的2,对应模式法x
只能使用模式法去除我们的suid,sgid目录的权限:chmod u-s,g-s /app

sticky粘滞位:目录加了粘滞位,目录下只能删除自己的文件:chmod o+t /app,数字法chmod 1777/app

以上都是只约束普通用户的。
以下命令可以对任何人起作用

可以用于锁定比如passwd这样的文件。
**我们之前说过,我们每次看cat一个文件,都会修改读时间(A时间),我们可以用以下命令锁定不用更改:chattr +A f1**,当然你强制刷新还是会更新的:touch f1
ACL
对于传统文件,也就只有u,g,o三种权限,不能说特定某个特定权限这样。这时候就引入了ACL

Centos7下的所有文件系统(指的是传统文件系统xfs,ext等等),6上的话,只有一开始的分区才有,后来的分区是不会有的,这种情况以后再说
setfacl -m u:test:w f1,给test用户设置f1的写权限,注意这时候的f1文件的权限最后变成了+符号:-rw-rw-r--+
千万注意,修改了acl显示的所属组权限并不是真正的所属组权限,而是mask权限,可以通过getfacl f1查看,这里显示的是排除你设置的所有人(这所有人包括拥有者,other,你设置的用户),修改组的权限:setfacl -m group::r f1
如果acl设置了一个用户啥权限都没有,但是他所属的组有权限,这样他还是没有权限。acl中用户的优先级会比组高
setfcal -x u:mage f1,删除mage权限
如果一个用户加入了两个组,一个有权限一个没权限,他会属于有权限的,这会看多个组的累加权限
ACL中的mask权限,指的是除了所有者user以及other,其他人都受影响,影响他们的最大权限,意思就是除了那两种人,其他人的权限都只能比它小或者等于它,举个例子,如果我们针对wang这个用户限定了只有rw权限,但是我们的mask权限只有r,那么王也只能有r
当用户访问一个文件,他最终得到的权限就是根据getfacl f1所列出的顺序。
>> f1;setfacl -R -m u:kju147:rwx f1/,递归的f1下的目录设置权限
根据文件给需要的文件赋值权限:比如kju147.acl文件中的内容是u:kju147:rwx,要赋值的文件是f1,可以用命令select -Rm -M kju147.acl f1
清空所有权限:setfacl -b f1,全部清空包含默认的
如果想要新建的文件也有权限:setfacl -R -m d:apache:rw /app/html 加个d,默认的意思
如果使用set参数,那么只会有你set的权限,其他的都不会保留


文本处理工具(一)
cat 的一些参数
cat -n f1显示行号,注意空行也会显示,等价于nl f1cat -b f1也是加行号,看视空行不加cat -E f1,显示换行信息,$cat -A f2显示所有,但是报货换行等信息cat -s f2,将多个连续的空行压缩成一个- 把cat倒着写tac,
tac f2,倒着显示(从最后一行开始显示),行的反向显示 echo abcd |rev,输出dcba,这是列的反向显示
more与less
- more是按空格去翻页,且没有任何提示,less更强大一些,但是翻到底不会自动退出,还可以支持上下翻页。more如果想上下翻,b是往回翻。
head
- head默认是接受键盘输入,如果你想只接受(或者说只显示)几行
hand -n 3 - 显示命令的前几行,
cat -n f1|head -n 3 - 显示前几个:
cat f2|head -c2,但是你这如果是汉字那就不一样了,c3就只显示一个汉字,显示非3的倍数应该有些会乱码 - 取一些特定长度的字符,比如取30个字节的口令:
#openssl rand -base64 30|head -c30,也有另一种办法:cat /dev/random |tr -dc '[:alnum:]'|head -c30
tail
- 尾巴,默认看的是后10行,指定行数
#tail -n 3 f1 - -f 选项,跟随,一般用来跟踪文件的变化(日志之类的),
tail -f /app/f1,这时候是不会退出来的。如果这时增加一个新行,那么就会被我们看到。我们需要把它变成后台:在最后加个&tail -f /app/f1 &出现新状况就自动弹出来 - 只显示新东西,很简单,
tail -f /app/f1 -n0 & - 你如果直接用
tail -f /app/f1,如果把这个文件删了还是会继续在那等待,这时候我们可以这样:f改成F就行
cut
- 默认是tab分割
- f第几列,-d是以什么分割,可以配合tr等命令更加方便
ss -nt|tr -s " " |cut -d" " -f5,df|grep /dev/sd |tr -s ' '|cut -d" " -f5|cut -d% -f1。-f也支持连续范围:cut -d: -f1-3,7 /etc/passwd,表示从第一到第三列,以及第七列 - 如果有时候它的列特别齐的话可以用-c参数根据字符切割:
df |cut -c44-46
paste
paste /app/f1 /app/f2。f1的第一行会与f2的第一行合并…….;默认用tab分割。也可以人为指定分割符:paste -d":" /app/f1 /app/f2。注意你分割符多个也会被认为是一个,它是单分割符-s参数,第一个文件所有行会合并在第一行,第二个文件所有行会合并在第二行:
paste -s /app/f1 /app/f2-s还可以转向

文本分析的工具
wc
- wc默认是键盘输入,显示顺序依次为:行,单词数量,字节
- -l统计行,-w统计单词,-c统计字节,-m是统计字符数~!
- -L统计最长的行的长度:
cat /etc/passwd |wc -L

sort

sort -t: -k3 /etc/passwd,以:分割,根据第三列排序,默认是字符排序,如果需要按照数字排序需要-n参数:sort -n -t: -k3 /etc/passwd.需要倒序:sort -nr -t: -k3 /etc/passwd
如果我们需要这样,只显示账号以及id,并且根据id倒叙:cut -d: -f1,3 /etc/passwd |sort -nr -t: -k2
uniq

这条命令可以把相邻的重复行删除,默认是接受键盘输入的
uniq -c f1,可以显示有多少行被合并
uniq -u f1,只显示不重复的
**echo $[RANDOM%10+1]**,10范围的随机数
diff

diff有一个-u参数,可以显示更加详细信息,利用这个参数,我们可以实现把他们不一样的地方重定向到一个文件中。diff f3 f4 -u> f3_f4.diff。这时候我们删除f4,我们可以利用f3还原f4。使用
patch -b f3 f3_f4.diff来还原。此时的f3就变成了f4,生成的f3.orig就是原始的f3