1. 程式人生 > >linux綜合順練(涉及管道,正則,重定向、用戶及組管理、權限管理等相關知識點)

linux綜合順練(涉及管道,正則,重定向、用戶及組管理、權限管理等相關知識點)

之一 dump filesyste word ext 下劃線 proc usermod 文件的

一、概述

  本博文是對前邊總結的知識點的一個綜合利用,涉及的知識點比較廣泛,涉及的大概有"bash特性之管道","bash特性之重定向","grep命令與正則表達式的利用","linux下用戶與組管理","linux下權限管理"等。下面給出上邊提到知識點之前的博客鏈接:

  • bash的重定向和管道相關知識點:http://blog.51cto.com/9657273/2172717
  • 文件基礎管理類命令匯總:http://blog.51cto.com/9657273/2294340
  • linux權限管理:http://blog.51cto.com/9657273/2173030
  • linux下grep與正則的配合使用:http://blog.51cto.com/9657273/2297718


二、案例分析

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綜合順練(涉及管道,正則,重定向、用戶及組管理、權限管理等相關知識點)