一、統計出/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶個數,並將用戶都顯示出來mysql
[root@test ~]#awk -F: '{shells[$NF]++;if($NF == "/sbin/nologin"){print $1,$NF}}END{for(i in shells){print i,shells[i]}}' /etc/passwd bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin mail /sbin/nologin uucp /sbin/nologin operator /sbin/nologin games /sbin/nologin gopher /sbin/nologin ftp /sbin/nologin nobody /sbin/nologin dbus /sbin/nologin vcsa /sbin/nologin abrt /sbin/nologin haldaemon /sbin/nologin ntp /sbin/nologin saslauth /sbin/nologin postfix /sbin/nologin sshd /sbin/nologin tcpdump /sbin/nologin redis /sbin/nologin mailnull /sbin/nologin smmsp /sbin/nologin rpc /sbin/nologin rpcuser /sbin/nologin nfsnobody /sbin/nologin apache /sbin/nologin /sbin/shutdown 1 /bin/bash 5 /sbin/nologin 27 /sbin/halt 1 /bin/sync 1 [root@test ~]#
說明:上述命令用到了awk的數組,用:做爲分割符。它處理的流程是這樣的,最開始是先聲明一個數組名字爲shells,用最後一個字段做爲數組的索引,第一次shells[$NF]=shells[/bin/bash] ,由於沒有定義shells[/bin/bash]的值,因此第一次shells[/bin/bash]的值爲空,空就是假,就是0,而後在++ ,++的意思是加1,因此就變成了1,同理第二次是shells[$NF]=shells[/sbin/nologin] 而後++,shells[/sbin/nologin]=1 。由於最開始是沒有shells[/bin/bash]和shells[/sbin/nologin],因此++後就都變成了1,處理第三行的時候,shells[$NF]=shells[/sbin/nologin] ,由於第二行處理後,shells[/sbin/nologin]的值就變成了1,因此++後這裏就變成了2,以此類推,只要出現shells[/sbin/nologin] 它在處理完後都會加1。咱們正是利用了awk數組的這一特性,就統計出「/sbin/nologin」 出現的次數,也就統計出了/etc/passwd下,以冒號做爲分隔符,最後一個字段爲「/sbin/nologin」 的次數,也就是統計出了系統有這麼多用戶的默認shell是「/sbin/nologin」。這是統計的流程,其次每處理一行,就判斷用冒號分割後的字段,若是最後一個字段爲「/sbin/nologin」 就打印出這一行的第一個字段,也就是用戶名稱。最後咱們用for循環去遍歷咱們以前定義的數組下標,shells表示的是整個數組,這裏的i就表明數組中的元素的索引(下標),好比:"/bin/bash","/sbin/nologin"等,再來看看shells[i]=shells[/bin/bash],在上面已經闡述了shells[/bin/bash]是元素出現的次數,因此咱們就分別打印了shells裏的元素下標和對應出現的次數。NF是awk裏的一個變量,它表示以某個分隔符分割後,總共有多少個字段。$NF表示最後一個字段。以上是shell類型爲/sbin/nologin的用戶,要看非/sbin/nologin的用戶在上面的命令上改下判斷條件便可。redis
[qiuhom@test ~]$ echo "Users whose shell type is not /sbin/nologin are:`awk -F: '{shells[$NF]++;if($NF != "/sbin/nologin"){print $1}}' /etc/passwd`" Users whose shell type is not /sbin/nologin are:root sync shutdown halt qiuhom mysql tom jerry [qiuhom@test ~]$
說明:以上命令顯示了shell類型爲非「/sbin/nologin」 的用戶sql
[qiuhom@test ~]$ awk -F: '{shells[$NF]++}END{for(i in shells){print i,shells[i]}}' /etc/passwd|grep -v "/sbin/nologin"|awk -v total=0 '{total+=$2}END{print "The number of users whose shell type is not /sbin/nologin is:"total}' The number of users whose shell type is not /sbin/nologin is:8 [qiuhom@test ~]$
說明:以上命令顯示了shell類型爲非「/sbin/nologin」的用戶有8個,固然我我的以爲編寫個腳本更容易理解,寫成命令,太長,可讀性太差,建議把命令寫進腳本里。docker
[qiuhom@test ~]$ cat checking_users.sh #!/bin/bash user=`awk -F: ' { shells[$NF]++ } { if($NF != "/sbin/nologin") { print $1 } }' /etc/passwd` echo "Users whose shell type is not /sbin/nologin are:$user" user_total=`awk -F: ' { shells[$NF]++ } END{ for(i in shells) { print i,shells[i] } }' /etc/passwd|grep -v "/sbin/nologin"|awk 'BEGIN{total=0}{total+=$2}END{print total}'` echo "The number of users whose shell type is not /sbin/nologin is:$user_total" [qiuhom@test ~]$ sh checking_users.sh Users whose shell type is not /sbin/nologin are:root sync shutdown halt qiuhom mysql tom jerry The number of users whose shell type is not /sbin/nologin is:8 [qiuhom@test ~]$
說明:以上腳本也是利用了上面說到的命令shell
二、查出用戶UID最大值的用戶名、UID及shell類型apache
[root@test ~]#awk -F: 'BEGIN{max=0;user="";shell="";UID=0}{if($3>max){max=$3;user=$1;UID=$3;shell=$NF}}END{print user,UID,shell,max}' /etc/passwd nfsnobody 65534 /sbin/nologin 65534
說明:上面的中心思想是這樣的,先定義幾個初始值,咱們把/etc/passwd文件內容,用「:」分割,而後去判斷第三個字段,和咱們定義的max比較,若是第三個字段的值大於咱們的初始化值,那麼就把當前第三個字段的值賦給咱們定義的變量max,一樣,把當前對應的其餘值賦給咱們定義的變量,這樣每處理一行咱們定義的變量的值都會相應的發生變化。這樣一來max變量最終記錄的是處理後最大的值,處理完全部數據,max就是/etc/passwd裏面第三個字段最大的值,也就是用戶UID最大的那個值,user就是最大uid對應的用戶名稱,shell就是最大uid對話用戶的默認shell類型。vim
三、統計當前鏈接本機的每一個遠程主機IP的鏈接數,並按從大到小排序數組
[qiuhom@docker ~]$ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.0.99:41319 192.168.0.212:54223 ESTAB 0 0 192.168.0.99:41319 192.168.0.232:2187 ESTAB 0 0 192.168.0.99:41319 192.168.0.232:2192 ESTAB 0 0 192.168.0.99:41319 192.168.0.151:42271 ESTAB 0 0 192.168.0.99:41319 192.168.0.212:54224 ESTAB 0 264 192.168.0.99:41319 192.168.0.232:2186 ESTAB 0 0 192.168.0.99:41319 192.168.0.212:54222 ESTAB 0 0 192.168.0.99:41319 192.168.0.232:2190 ESTAB 0 0 192.168.0.99:41319 192.168.0.232:2193 ESTAB 0 0 192.168.0.99:41319 192.168.0.232:2191 [qiuhom@docker ~]$ss -nt|awk -F'[: ]+' '/ESTAB/{ip[$(NF-2)]++}END{for(i in ip){print i,ip[i]}}'|sort -k2 -nr 192.168.0.232 6 192.168.0.212 3 192.168.0.151 1 [qiuhom@docker ~]$
說明:以上命令的核心思想是,先過濾沒有用的信息而後取出ip地址,而後利用awk數組來統計每一個ip鏈接的次數,而後再利用sort來排序。awk用-F指定了多個字符爲分隔符,這裏須要注意的是經過多個分割符分割後,最後面是有一個字段內容爲空格,因此咱們在統計的時候要用NF-2纔是客戶端鏈接本機的ip地址,而不是NF-1,統計的方法也是利用awk數組來實現的,排序是用sort命令,指定第二字段來排序。ss -nt 表示列出已經創建鏈接的tcp鏈接信息,其中-n表示不名稱解析,-t表示tcp.bash
四、編寫腳本 createuser.sh,實現以下功能:使用一個用戶名作爲參數,若是 指定參數的用戶存在,就顯示其存在,不然添加之;顯示添加的用戶的id號等 信息ssh
[root@docker qiuhom]#cat createuser.sh #!/bin/bash [ $# -ne 1 ] && echo "Usage: $0 USERNAME " && exit [ $UID -ne 0 ] && echo "Run this script with root" && exit if grep -o "^$1" /etc/passwd &>/dev/null;then echo "$1 User Exists" exit else useradd $1 [ $? -eq 0 ] && echo "$1 add succeeful" id $1 fi [root@docker qiuhom]#sh createuser.sh Usage: createuser.sh USERNAME [root@docker qiuhom]#sh createuser.sh a b c Usage: createuser.sh USERNAME [root@docker qiuhom]#su qiuhom [qiuhom@docker ~]$sh createuser.sh f1 Run this script with root [qiuhom@docker ~]$su root 密碼: [root@docker qiuhom]#sh createuser.sh root root User Exists [root@docker qiuhom]#sh createuser.sh abc abc add succeeful uid=1003(abc) gid=1003(abc) 組=1003(abc) [root@docker qiuhom]#
五、編寫生成腳本基本格式的腳本,包括做者,聯繫方式,版本,時間,描述等
[qiuhom@docker ~]$ls createuser.sh creatscript.sh f1 tmp.txt xx.sh [qiuhom@docker ~]$cat creatscript.sh #!/bin/bash [ $# -gt 1 ] && echo "Usage:sh $0 FileName" && exit [ $# -eq 0 ] && read -p "please input file name: " filename [ $# -eq 1 ] && filename=$1 -e "$filename" ] && echo "$filename is exists !!!" && exit cat >> $filename << EOF #!/bin/bash ################################################################# #Author: qiuhom #QQ: 467697313 #mail: qiuhom467697313@qq.com #Date: `date +"%F %T"` #FileName: `basename $filename` #URL: https://www.cnblogs.com/qiuhom-1874 #Copyright (C): `date +%Y` All rights #Description: #Version v1.0 ################################################################# EOF vim + $filename [qiuhom@docker ~]$sh creatscript.sh f1 f1 is exists !!! [qiuhom@docker ~]$sh creatscript.sh /etc/fstab /etc/fstab is exists !!! [qiuhom@docker ~]$sh creatscript.sh f2 #!/bin/bash ################################################################# #Author: qiuhom #QQ: 467697313 #mail: qiuhom467697313@qq.com #Date: 2019-10-31 23:24:48 #FileName: f2 #URL: https://www.cnblogs.com/qiuhom-1874 #Copyright (C): 2019 All rights #Description: #Version v1.0 ################################################################# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "f2" 13L, 460C