码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2018-10-12 14:52:27      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:init   auto   bin   ini   gre   find   users   非贪婪   情况下   

一、概述

 

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

 
 

二、案例分析

 

2.1、杂项练习

 

  • 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可?
结合学习过的知识点,这题可以用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、列出/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追加选项。

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

标签:init   auto   bin   ini   gre   find   users   非贪婪   情况下   

原文地址:http://blog.51cto.com/9657273/2299225

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!