Linux命令實踐( 六)

一、統計出/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 
相關文章
相關標籤/搜索