linux綜合順練(涉及管道,正則,重定向、用戶及組管理、權限管理等相關知識點)
阿新 • • 發佈:2018-10-12
之一 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綜合順練(涉及管道,正則,重定向、用戶及組管理、權限管理等相關知識點)