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

一、概述

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

二、案例分析

2.1、杂项练习

  • 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可?
结合学习过的知识点,这题可以用who、cut、sort、uniq等命令结合管道来实现:
who|cut -d‘ ‘ -f1|sort|uniq

运行中间过程与结果为:
[[email protected] ~]# who|cut -d‘ ‘ -f1|sort|uniq
docker
ifool
root
yanhui
[[email protected] ~]# 

注解:
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)

运行结果:
[[email protected] ~]$ id $(who -u|sort -k3,3 -k4,4|tail -1|cut -d‘ ‘ -f1)
uid=5003(ifool) gid=5003(ifool) groups=5003(ifool)
[[email protected] ~]$ 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)
[[email protected] ~]$ 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)
[[email protected] ~]$ 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:]]+$‘

运行结果:
[[email protected] ~]$ 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

运行结果:
[[email protected] ~]$ sort -t‘:‘ -k3,3 -nr /etc/passwd|head|tr ‘[:lower:]‘ ‘[:upper:]‘ >/tmp/maxusers.txt
[[email protected] ~]$ 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
输出结果:
[[email protected] ~]$ ls /etc/*.conf|tr ‘[a-z]‘ ‘[A-Z]‘ >/tmp/etc.conf
[[email protected] ~]$ 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

输出结果:
[[email protected] ~]$ 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
[[email protected] ~]$ 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
输出结果:
[[email protected] ~]$ 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

输出结果:
[[email protected] ~]$ cat /etc/fstab /etc/issue > /tmp/etc.test
[[email protected] ~]$ 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

运行结果:
[[email protected] ~]# groupadd -g 2016 distro
[[email protected] ~]# grep --color=auto ‘distro‘ /etc/group
distro:x:2016:
[[email protected] ~]#

注解:
groupadd 的-g选项可以指定创建组的组ID(GID);
  • 2、创建用户mandriva,其ID号为1005;基本组为distro?
useradd -u 1005 -g distro mandriva

运行结果:
[[email protected] ~]# grep ‘distro‘ /etc/group
distro:x:2016:
[[email protected] ~]# useradd -u 1005 -g distro mandriva
[[email protected] ~]# 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 

运行结果:
[[email protected] ~]# useradd -u 1100 -d /home/linux mageia
[[email protected] ~]# grep ‘mageia‘ /etc/passwd
mageia:x:1100:1100::/home/linux:/bin/bash
[[email protected] ~]# id mageia
uid=1100(mageia) gid=1100(mageia) groups=1100(mageia)
[[email protected] ~]# 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?
交互式:
[[email protected] ~]# 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.

非交互式:
[[email protected] ~]# 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

[[email protected] ~]# id mandriva
uid=1005(mandriva) gid=2016(distro) groups=2016(distro)
[[email protected] ~]# grep ‘mandriva‘ /etc/passwd
mandriva:x:1005:2016::/home/mandriva:/bin/bash
[[email protected] ~]# ls -ld /home/mandriva/
drwx------. 2 mandriva distro 59 Oct 12 08:32 /home/mandriva/
[[email protected] ~]# userdel mandriva
[[email protected] ~]# ls -ld /home/mandriva/
drwx------. 2 1005 distro 59 Oct 12 08:32 /home/mandriva/
[[email protected] ~]# grep ‘mandriva‘ /etc/passwd
[[email protected] ~]# echo $?
1
注解:
userdel -r可以删除用户的同时,并删除当时创建的目录(比如用户家目录,用户的邮件目录等),
不加-r,就不会删除这些目录;
  • 6、创建用户slackware,其ID号为2002,基本组为distro,附加组为peguin?
groupadd peguin
useradd -u 2002 -g distro -G peguin slackware

[[email protected] ~]# grep ‘distro\|peguin‘ /etc/group
distro:x:2016:
[[email protected] ~]# groupadd peguin
[[email protected] ~]# grep ‘distro\|peguin‘ /etc/group
distro:x:2016:
peguin:x:2017:
[[email protected] ~]# useradd -u 2002 -g distro -G peguin slackware
[[email protected] ~]# id slackware
uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin)
[[email protected] ~]# grep ‘slackware‘ /etc/passwd
slackware:x:2002:2016::/home/slackware:/bin/bash
[[email protected] ~]# grep ‘distro\|peguin‘ /etc/group
distro:x:2016:
peguin:x:2017:slackware

注解:
创建用户的时候,可以通过-g指定其主要组,通过-G指定它的附加组;
  • 7、修改slackware的默认shell为/bin/tcsh?
usermod -s /bin/tcsh slackware

[[email protected] ~]# grep ‘tcsh‘ /etc/shells
/bin/tcsh
[[email protected] ~]# grep ‘slackware‘ /etc/passwd
slackware:x:2002:2016::/home/slackware:/bin/bash
[[email protected] ~]# usermod -s /bin/tcsh slackware
[[email protected] ~]# 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

[[email protected] ~]# id slackware
uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin)
[[email protected] ~]# usermod -a -G admins slackware
[[email protected] ~]# id slackware
uid=2002(slackware) gid=2016(distro) groups=2016(distro),2017(peguin),2018(admins)

注解:
先判断要添加的admins组是否存在,不存在,我们要先创建它;
usermod 如果不指定-a追加选项,默认指定-G表示修改用户的附加组,如果是额外添加一个新的附加组,
应该指定-a追加选项。

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

时间: 2024-08-04 23:50:43

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

linux基础:用户与组,权限管理

linux中用户与权限管理 与Window的单用户系统不同,Linux操作系统在设计之初就遵循着多用户.多任务的理念.而在这种情况下,安全问题非常重要,不同用户,不同的用户组之间的隐私保护,安全管理就非常有必要.对于这个问题,Linux就有了对于不同的用户,不同的组对于文件有不同的权限,以使用确保安全. 用户的概念 用户:由于Linux系统是一个多用户系统,每个用户又有不同的组.为了便于管理用户,所以在我们注册帐号时,系统会自动分配给我们一个ID,标识此用户的唯一性.而ID信息一般都存储与/et

linux用户和组及权限管理

1.用户和组管理    资源分派:        Authentication:认证        Authorization:授权        Accouting:审计            Audition token, identity(username/password) Linux用户:Username/UID        管理员:root, 0        普通用户:1-65535            系统用户:1-499, 1-999                对守护进

Linux运维学习历程-第六天-Linux用户、组以及权限管理

本章内容 Linux的安全模型 用户和组 用户和组管理命令 文件权限 默认权限 特殊权限 ACL访问控制 一:3A认证 Authentication :认证 Authorization :授权 Audition 审计 Authentication(认证):验证用户的身份(账号和密码)与可使用的网络等一系列服务 Authorization (授权):依据认证结果开放网络等各种服务给用户,对用户的资源访问权限进行集中控制. Audition (审计):将用户所有的操作日志集中记录管理和分析,不仅可以

Linux用户、组及权限管理浅析

一.用户和组 1.用户 系统用来认证(Authentication),授权(Authorization),审计(Autition)的帐号.通过登录用户来登录系统.操作系统通过登录不同的用户来调用相对应权限的进程或程序,也可以说,用户是能获取系统资源的权限集合. 2.用户的分类 Linux用户分为2类,即管理员用户和普通用户. 管理员用户:即root,拥有最大的权限的用户,可以调用系统任意的资源.其uid为0 普通用户:普通用户也分2类,分别为系统用户和登录用户. 系统用户:保障系统启动时的基本服

Linux中用户、组、权限管理

众所周知,Linux是一个多用户.多任务的系统.而当很多用户同时登录时,系统是怎样管理用户,并给他们赋予相应的权限呢? Linux中有三类用户 超级用户(UID为0) 系统用户(伪用户.非登录) 仅运行服务程序 centos6.x中UID为1-499 centos7.x中UID为1-999 登录用户(普通用户) centos6.x中UID:500-65535 centos7.x中UID:1000-65535 用户解析库文件(任何人都可以访问): /etc/passwd name:password

Linux学习日记--基础命令(5)--用户和组概念与管理--文件权限

用户和组管理: 以下区间区别于centos6,和centos7  Linux用户:Username/UID        管理员:root, 0        普通用户:1-65535            系统用户:1-499, 1-999                 对守护进程获取资源进行权限分配:            登录用户:500+, 1000+                交互式登录: Linux组:Groupname/GID         管理员组:root, 0    

LINUX用户、组、权限管理和归档压缩、时间、Ping

一.用户与用户组管理.权限 1.用户文件/etc/passwd 2.用户密码/etc/shadow 3.组文件/etc/group 4.查看用户和组信息命令id 5.添加用户 useradd [-u UID] [-g GID] [-d HOME] [-M] [-s] 用户名  (在ubuntu版本里,默认不创建家目录) -m 强制创建用户家目录 -u 自定义UID -g 自定义GID,前提是这个GID已经存在  -M 不要创建用户家目录(系统帐号默认值) -s 自定义shell,若没有默认为/b

Linux用户、组和权限管理

Linux-用户和权限管理 一.用户和组 早期的计算机的使用场景,一般都是多用户,多任务下( Multi-task,Multi-Users).为了区别不同的使用者,隔离每个人对计算机资源的访问,引入了用户的概念. 不同的使用者通过用户标识和密码加以区别, 认证:Authentication 授权:Authorization 审计:Audition(Account) 这就是3A认证 Linux下的用户标识就是:用户 组,即用户组,用户容器. 1.用户类别 用户分为管理用户和普通用户,其中普通用户又

Linux用户、组和权限管理(一)

Linux是一个Multi-tasks(多任务). Multi-Users(多用户)的系统 每一个登陆者或使用者都有用户标识.密码(所谓3A) 所谓的3A: Authentication(验证机制) Authorization(授权机制) Audition(审计) 组的概念:用户组,用户容器:是为了便于用户权限分配 用户类别: 管理员:root 普通用户: 系统用户 登录用户 在linux系统中用户标识UserID,简称UID 用户标识使用的范围: 16bits二进制数字:0-65535(默认1