linux权限综合训练,linux综合练习(涉及管道,正则,重定向、用户及组管理、权限管理等相关知识点)...

一、概述

本博文是对前边总结的知识点的一个综合利用,涉及的知识点比较广泛,涉及的大概有"bash特性之管道","bash特性之重定向","grep命令与正则表达式的利用","linux下用户与组管理","linux下权限管理"等。下面给出上边提到知识点之前的博客链接:

结合学习过的知识点,这题可以用who、cut、sort、uniq等命令结合管道来实现:

who|cut -d' ' -f1|sort|uniq

运行中间过程与结果为:

[root@vir-rs2 ~]# who|cut -d' ' -f1|sort|uniq

docker

ifool

root

yanhui

[root@vir-rs2 ~]#

注解:

who命令可以打印正在登陆的用户的相关信息(用户名,终端等);

cut 的-d选项用来指定分隔符(本例指定为空格),-f1是取用空格风格后的第一列;

sort 可以对结果做一个排序,把同名的可以文本连续的组合一起;

uniq对结果做去重处理(只有连续的才会当作重复的)。

其他实现(选看):

who|awk '{print $1|"sort|uniq"}'

用到了awk,sort,uniq

who|grep --color=auto -Ewo '^[[:alnum:]]+'|sort|uniq

who|grep --color=auto -Eo '^[[:alnum:]]+\>'|sort|uniq

上面这两个,用到了grep正则语法,sort,uniq

grep 的-o可以只打印匹配到的内容,利用正则特性,用户名由字母数字以及下划线组成,然后[:alnum:]这个

就可以派上用场,如果不是匹配精确单词(-w),可以在结尾加上一个词尾锚定(\>)。

2、取出最后登录到当前系统的用户的相关信息?

这里要注意一点,就是"取出最后登录到当前系统的用户的相关信息",首先,他正登录着,其次,他登陆的时间

是最新的,最近的。可以利用who的-u选项,开启详细登录信息(附加了额外的时间),然后利用sort根据时间列

排序,然后用tail等文本工具取出,利用cut截取第一列的用户名,然后传递给id:

id $(who -u|sort -k3,3 -k4,4 -k5,5|tail -1|cut -d' ' -f1)

运行结果:

[happy@vir-rs2 ~]$ id $(who -u|sort -k3,3 -k4,4|tail -1|cut -d' ' -f1)

uid=5003(ifool) gid=5003(ifool) groups=5003(ifool)

[happy@vir-rs2 ~]$ who -u|sort -k3,3 -k4,4

docker tty4 2018-10-12 09:23 01:43 1288

yanhui tty2 2018-10-12 09:23 01:43 1284

ifool pts/1 2018-10-12 09:37 00:42 23127 (aca86e01.ipt.aol.com)

happy pts/0 2018-10-12 09:38 . 23175 (aca86e01.ipt.aol.com)

happy pts/2 2018-10-12 09:39 01:27 23205 (aca86e01.ipt.aol.com)

_myfish1 pts/4 2018-10-12 09:41 01:25 23255 (aca86e01.ipt.aol.com)

root pts/5 2018-10-12 09:41 01:25 23281 (aca86e01.ipt.aol.com)

ifool pts/3 2018-10-12 10:22 00:44 23456 (aca86e01.ipt.aol.com)

[happy@vir-rs2 ~]$ who -u|sort -k3,3 -k4,4 -k5,5|tail -1

ifool pts/3 2018-10-12 10:22 00:44 23456 (aca86e01.ipt.aol.com)

[happy@vir-rs2 ~]$ who -u|sort -k3,3 -k4,4 -k5,5|tail -1|cut -d' ' -f1

ifool

注解:

$()是一个命令的引用,bash的特性之一;

who -u表示列出用户登录信息;

-k3,3 -k4,4 表示对第3列优先排序,其次根据第4列排序第3列表示登录日期(年-月-日),第4列表示登录的时间

的时分(24小时制度的时间-分钟);

tail -1表示取最后一行;

cut指定分隔符为空格,然后取第一列的用户名;

id查看用户名相关的信息;

3、取出当前系统上被用户当作其默认shell的最多的那个shell?

cut -d':' -f7 /etc/passwd|sort|uniq -c|sort -k1,1 -nr|head -1|grep --color=auto -oE '[/[:alpha:]]+$'

运行结果:

[happy@vir-rs2 ~]$ cut -d':' -f7 /etc/passwd|sort|uniq -c|sort -k1,1 -nr|head -1|grep --color=auto -oE '[/[:alpha:]]+$'

/sbin/nologin

注解:

/etc/passwd假设以冒号分隔,最后一列(第7列)表示用户的登录shell信息;

uniq -c 可以去重后,把每个独立文本的个数(相同行)统计重复行数量后显示在指定文本前方;

sort -k1,1 -nr 表示默认以空白字符作为分隔符,然后对第一列的数字大小做逆序排序(数字从大到小);

head -1表示最第一行,我们之前排序过,第一行正是最后一个字段(用户登录shell)最多次的行;

grep -o只打印匹配到的文本内容,-E表示只用扩展正则语法解析pattern,pattern中[:alpha:]表示匹配任意字母,

利用大括号,把符号"/"包括在内,后边+元字符表示匹配大括号中的字符1次或多次,$表示锚定行尾;

其他答案:

awk -F':' '{print $NF}' /etc/passwd|sort|uniq -c|sort -k1,1 -nr|head -1|grep --color=auto -oE '[/[:alpha:]]+$'

利用的是awk取最后一列,以冒号分隔;

4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全改为大写后保存至/tmp/maxusers.txt文件中?

sort -t':' -k3,3 -nr /etc/passwd|head|tr '[:lower:]' '[:upper:]' >/tmp/maxusers.txt

运行结果:

[happy@vir-rs2 ~]$ sort -t':' -k3,3 -nr /etc/passwd|head|tr '[:lower:]' '[:upper:]' >/tmp/maxusers.txt

[happy@vir-rs2 ~]$ cat /tmp/maxusers.txt

_MYFISH1:X:5005:5005::/HOME/_MYFISH1:/BIN/BASH

HAPPY:X:5004:5004::/HOME/HAPPY:/BIN/BASH

IFOOL:X:5003:5003::/HOME/IFOOL:/BIN/BASH

DOCKER:X:5002:5002::/HOME/DOCKER:/BIN/BASH

YANHUI:X:5001:5001::/HOME/YANHUI:/BIN/BASH

TESTUSER:X:5000:5000::/HOME/TESTUSER:/BIN/BASH

SASLAUTH:X:499:76:SASLAUTHD USER:/VAR/EMPTY/SASLAUTH:/SBIN/NOLOGIN

NGINX:X:498:499:NGINX WEB SERVER:/VAR/LIB/NGINX:/SBIN/NOLOGIN

REDIS:X:497:498:REDIS DATABASE SERVER:/VAR/LIB/REDIS:/SBIN/NOLOGIN

NOBODY:X:99:99:NOBODY:/:/SBIN/NOLOGIN

注解:

以冒号分隔,然后对第三列进行数字大小进行排序,并从大到小排序(sort -t':' -k3,3 -nr);

head取出前10行;

利用tr可以对文本流进行处理;

[:lower:]:表示匹配任意单个小写字母,大部分情况下相当于 [a-z];

[:upper:]:表示匹配任意单个大写字母,大部分情况下相当于[A-Z];

小贴士:虽然[:lower:],[:upper:] 是匹配单个字符,上面两个,通常正则匹配是贪婪模型,有多少匹配多少,

所以所有小写字母都被转换成大写字母了,匹配任意单个字符并不是匹配一次就结束了,即使没有

限定匹配次数,默认就会贪婪匹配,grep的标准正则与扩展正则无法使用非贪婪模型(懒惰模型),只有perl

正则才能在特定场景使用特定符号来显式说明可以启用非贪婪模型;

5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分

ifconfig eno16777736|grep 'inet \b'|grep -oE 'inet ([0-9]{1,3}\.){3}[0-9]{1,3}'|cut -d' ' -f2

输出结果:

[root@ACA86E1A ~]# ifconfig eno16777736|grep 'inet \b'|grep -oE 'inet ([0-9]{1,3}\.){3}[0-9]{1,3}'|cut -d' ' -f2

172.168.110.26

之前收集一些取ip的方法:(CentOS 6.x系列)

1、ifconfig eth0|awk -F'[ :]+' '/inet addr/{print $4}'

2、ifconfig eth0|awk -F'[ :]' '/inet addr/{print $13}'

3、ifconfig eth0|grep "inet addr"|cut -d":" -f2|cut -d" " -f1

4、ifconfig eth0|grep 'inet addr'|sed 's/^.*dr://g'|sed 's/ Bca.*$//g'

5、 ifconfig eth0|grep "inet addr:"|awk -F":" '{print $2}'|awk '{print $1}'

6、 ifconfig eth0 |sed -nr 's/.*addr:(.*)Bcast.*/\1/p'

7、ifconfig | sed -n '2p' | awk -F ":" '{print $2}' | awk '{print $1}'

8、ifconfig |head -2|grep "inet addr"|awk -F[:" "] '{print $13}'

{ ifconfig eth0|awk -F[:' '] '/inet addr/{print $13}' }

9、ifconfig eth0|grep "inet addr"|cut -c21-33

10、ifconfig eth0|awk '/inet/{split ($2,x,":");print x[2]}'|sed 2d

11、ifconfig eth0|sed -ne 's/^.*addr:\([0-9.]*\).*$/\1/p'|sed 2d

12、ifconfig eth0|sed -n '/inet addr/s/^[^:]*:\([0-9.]\{7,15\}\) .*/\1/p'

13、ifconfig eth0|awk -F'[ :]+' 'NR==2 {print $4}'

14、 ifconfig eth0 |sed -rn 's/^.*dr:(.*)B.*$/\1/gp' 和 ifconfig eth0 |sed -rn 's#^.*dr:(.*)B.*$#\1#gp'

15、ifconfig eth0 |grep 'addr:[0-9]............[0-9]' -o|sed -e '2p' -e 's/addr://g'

16、ifconfig eth0 |grep -E 'addr:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -o |sed 's/addr://g'

17、ifconfig eth0 |awk '/addr:[[:digit:]]/''{print $2}' |sed 's/addr://g'

18、ifconfig eth0 |grep '[0-9].[0-9].[0-9].[0-9].[0-9].[0-9].[0-9].[0-9]' |awk -F: '{print $2}'|awk '{print $1}'

19、ifconfig eth0 |grep -E 'addr:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -o |awk -F: '{print $2}'

20、ifconfig eth0 |awk -F: '/[[:digit:]]/''{print $2}'|awk '{print $1}'|sed -n '2p'

21、ip addr show eth0|grep -w inet|grep -Po '[^ ]+(?=/\d)'

CentOS 7.x系列:

1、ifconfig eno16777736|awk '/inet /{print $2}'

2、ifconfig eno16777736|grep "inet\b"|awk '{print $2}'

3、ifconfig eno16777736|grep 'inet\b'|sed -e 's/^.*inet //g' -e 's/ netmask.*//g'

4、ifconfig eno16777736|sed -nr 's/.*inet (.*) netmask.*$/\1/p'

5、ip addr show eno16777736|grep -w inet|grep -Po '[^ ]+(?=/\d)'

6、ip addr list eno16777736|grep -oP '(?<=inet ).*(?=/)'

7、ifconfig eno16777736|grep 'inet \b'|grep -oE 'inet ([0-9]{1,3}\.){3}[0-9]{1,3}'|cut -d' ' -f2

等等

6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中?

ls /etc/*.conf|tr '[a-z]' '[A-Z]' >/tmp/etc.conf

输出结果:

[happy@vir-rs2 ~]$ ls /etc/*.conf|tr '[a-z]' '[A-Z]' >/tmp/etc.conf

[happy@vir-rs2 ~]$ cat /tmp/etc.conf

/ETC/ASOUND.CONF

/ETC/DRACUT.CONF

/ETC/GAI.CONF

/ETC/GEOIP.CONF

/ETC/GRUB.CONF

/ETC/HOST.CONF

/ETC/INIT.CONF

/ETC/KDUMP.CONF

/ETC/KRB5.CONF

/ETC/LD.SO.CONF

/ETC/LIBAUDIT.CONF

/ETC/LIBUSER.CONF

/ETC/LOGROTATE.CONF

/ETC/MKE2FS.CONF

/ETC/NSSWITCH.CONF

/ETC/REDIS.CONF

/ETC/REDIS-SENTINEL.CONF

/ETC/RESOLV.CONF

/ETC/RSYSLOG.CONF

/ETC/SESTATUS.CONF

/ETC/SUDO.CONF

/ETC/SUDO-LDAP.CONF

/ETC/SYSCTL.CO

此题思路和上一题中部分思路差不多,不做说明了。

7、显示/var目录下一级子目录或文件的总个数?

ls -l /var/|grep -v '^total'|wc -l

输出结果:

[ifool@vir-rs2 ~]$ ls -l /var/|grep -v '^total'

-rw-r--r-- 1 root root 0 Oct 12 12:23 123 456.txt

drwxr-xr-x. 8 root root 4096 Aug 31 01:16 cache

drwxr-xr-x. 2 root root 4096 Mar 22 2017 crash

drwxr-xr-x 2 root root 4096 Nov 22 2013 cvs

drwxr-xr-x. 3 root root 4096 Aug 16 00:25 db

drwxr-xr-x. 3 root root 4096 Aug 16 00:25 empty

drwxr-xr-x. 2 root root 4096 Sep 23 2011 games

drwxr-xr-x. 18 root root 4096 Oct 12 03:51 lib

drwxr-xr-x. 2 root root 4096 Sep 23 2011 local

drwxrwxr-x. 3 root lock 4096 Oct 12 03:51 lock

drwxr-xr-x. 7 root root 4096 Oct 8 12:32 log

lrwxrwxrwx. 1 root root 10 Aug 16 00:23 mail -> spool/mail

drwxr-xr-x. 2 root root 4096 Sep 23 2011 nis

drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt

drwxr-xr-x. 2 root root 4096 Sep 23 2011 preserve

drwxr-xr-x. 11 root root 4096 Oct 8 15:01 run

drwxr-xr-x. 9 root root 4096 Aug 31 01:14 spool

drwxrwxrwt. 5 root root 4096 Oct 8 15:01 tmp

drwxr-xr-x 7 root root 4096 Oct 8 13:59 www

drwxr-xr-x. 2 root root 4096 Sep 23 2011 yp

[ifool@vir-rs2 ~]$ ls -l /var/|grep -v '^total'|wc -l

20

注解:

我特地创建了一个包含空格的文件,然后利用grep -v可以把ls -l长格式输出统计的第一行的统计信息这一行

给去掉,其余的都是符合的行;

8、取出/etc/group文件中第三个字段数值最小的10个组的名字?

sort -t':' -k3,3 -n /etc/group|head|cut -d':' -f1

输出结果:

[ifool@vir-rs2 ~]$ sort -t':' -k3,3 -n /etc/group|head|cut -d':' -f1

root

bin

daemon

sys

adm

tty

disk

lp

mem

kmem

9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中?

cat /etc/fstab /etc/issue > /tmp/etc.test

输出结果:

[ifool@vir-rs2 ~]$ cat /etc/fstab /etc/issue > /tmp/etc.test

[ifool@vir-rs2 ~]$ cat /tmp/etc.test

#

# /etc/fstab

# Created by anaconda on Thu Aug 16 00:23:09 2018

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=610d4939-d78f-462b-92d6-8ad25ac6ad8e / ext4 defaults 1 1

UUID=f1bab624-107a-400e-a004-3fd800248b3c /boot ext4 defaults 1 2

UUID=711a6f1d-f75e-4fdc-be59-1f69a0fb1f55 swap swap defaults 0 0

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

CentOS release 6.9 (Final)

Kernel \r on an \m

注解:

cat 命令可以合并多个文件的内容并显示;

2.2、用户和组管理相关练习

1、创建组distro,其GID为2016?

groupadd -g 2016 distro

运行结果:

[root@ACA86E1A ~]# groupadd -g 2016 distro

[root@ACA86E1A ~]# grep --color=auto 'distro' /etc/group

distro:x:2016:

[root@ACA86E1A ~]#

注解:

groupadd 的-g选项可以指定创建组的组ID(GID);

2、创建用户mandriva,其ID号为1005;基本组为distro?

useradd -u 1005 -g distro mandriva

运行结果:

[root@ACA86E1A ~]# grep 'distro' /etc/group

distro:x:2016:

[root@ACA86E1A ~]# useradd -u 1005 -g distro mandriva

[root@ACA86E1A ~]# grep 'mandriva' /etc/passwd

mandriva:x:1005:2016::/home/mandriva:/bin/bash

3、创建用户mageia,其ID号为1100,家目录为/home/linux?

useradd -u 1100 -d /home/linux mageia

运行结果:

[root@ACA86E1A ~]# useradd -u 1100 -d /home/linux mageia

[root@ACA86E1A ~]# grep 'mageia' /etc/passwd

mageia:x:1100:1100::/home/linux:/bin/bash

[root@ACA86E1A ~]# id mageia

uid=1100(mageia) gid=1100(mageia) groups=1100(mageia)

[root@ACA86E1A ~]# ls -la /home/linux/

total 12

drwx------. 2 mageia mageia 59 Oct 12 08:35 .

drwxr-xr-x. 4 root root 33 Oct 12 08:35 ..

-rw-r--r--. 1 mageia mageia 18 Mar 5 2015 .bash_logout

-rw-r--r--. 1 mageia mageia 193 Mar 5 2015 .bash_profile

-rw-r--r--. 1 mageia mageia 231 Mar 5 2015 .bashrc

注解:

useradd -d 后边指定一个不存在的目录,这个不存在的目录是指一级不存在,比如指定/home/linux 这个/home如

果不存在,表示二级目录也不存在,这样是不会创建linux目录,不会复制模板骨架文件(与环境加载配置相关的)到

/home/linux目录下。同时指定的一级目录也不能存在,存在也不会复制模板骨架文件。

4、给用户mageia添加密码,密码为mageedu?

交互式:

[root@ACA86E1A ~]# passwd mageia

Changing password for user mageia.

New password:

BAD PASSWORD: The password is shorter than 8 characters

Retype new password:

passwd: all authentication tokens updated successfully.

非交互式:

[root@ACA86E1A ~]# echo 'mageedu'|passwd mageia --stdin

Changing password for user mageia.

passwd: all authentication tokens updated successfully.

注解:

--stdin可以读取标准输入的内容,来作为passwd的密码参数。echo的结果通过管道改变了passwd的标准输入,

所以密码即是echo的输出的结果。

5、删除mandriva,但保留其家目录?

userdel mandriva

[root@ACA86E1A ~]# id mandriva

uid=1005(mandriva) gid=2016(distro) groups=2016(distro)

[root@ACA86E1A ~]# grep 'mandriva' /etc/passwd

mandriva:x:1005:2016::/home/mandriva:/bin/bash

[root@ACA86E1A ~]# ls -ld /home/mandriva/

drwx------. 2 mandriva distro 59 Oct 12 08:32 /home/mandriva/

[root@ACA86E1A ~]# userdel mandriva

[root@ACA86E1A ~]# ls -ld /home/mandriva/

drwx------. 2 1005 distro 59 Oct 12 08:32 /home/mandriva/

[root@ACA86E1A ~]# grep 'mandriva' /etc/passwd

[root@ACA86E1A ~]# echo $?

1

注解:

userdel -r可以删除用户的同时,并删除当时创建的目录(比如用户家目录,用户的邮件目录等),

不加-r,就不会删除这些目录;

6、创建用户slackware,其ID号为2002,基本组为distro,附加组为peguin?

groupadd peguin

useradd -u 2002 -g distro -G peguin slackware

[root@ACA86E1A ~]# grep 'distro\|peguin' /etc/group

distro:x:2016:

[root@ACA86E1A ~]# groupadd peguin

[root@ACA86E1A ~]# grep 'distro\|peguin' /etc/group

distro:x:2016:

peguin:x:2017:

[root@ACA86E1A ~]# useradd -u 2002 -g distro -G peguin slackware

[root@ACA86E1A ~]# id slackware

uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin)

[root@ACA86E1A ~]# grep 'slackware' /etc/passwd

slackware:x:2002:2016::/home/slackware:/bin/bash

[root@ACA86E1A ~]# grep 'distro\|peguin' /etc/group

distro:x:2016:

peguin:x:2017:slackware

注解:

创建用户的时候,可以通过-g指定其主要组,通过-G指定它的附加组;

7、修改slackware的默认shell为/bin/tcsh?

usermod -s /bin/tcsh slackware

[root@ACA86E1A ~]# grep 'tcsh' /etc/shells

/bin/tcsh

[root@ACA86E1A ~]# grep 'slackware' /etc/passwd

slackware:x:2002:2016::/home/slackware:/bin/bash

[root@ACA86E1A ~]# usermod -s /bin/tcsh slackware

[root@ACA86E1A ~]# grep 'slackware' /etc/passwd

slackware:x:2002:2016::/home/slackware:/bin/tcsh

注解:

usermod本身就是用来修改用户属性的一个工具之一,指定-s SHELL可以修改用户默认的登录shell。

指定的登录shell,正常情况要先检查是否存在,usermod本身设置不管shell是否存在,都可以成功。

但是在做用户切换的时候,如果shell不存在,可能会导致登录异常。tcsh属于软件包tcsh,如果/etc/shells

文件中不存在,可以先安装这个tcsh软件包;

8、为用户slackware新增附加组admins?

groupadd admins

usermod -a -G admins slackware

[root@ACA86E1A ~]# id slackware

uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin)

[root@ACA86E1A ~]# usermod -a -G admins slackware

[root@ACA86E1A ~]# id slackware

uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin),2018(admins)

注解:

先判断要添加的admins组是否存在,不存在,我们要先创建它;

usermod 如果不指定-a追加选项,默认指定-G表示修改用户的附加组,如果是额外添加一个新的附加组,

应该指定-a追加选项。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值