1、统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来

[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的用户在上面的命令上改下判断条件即可。

[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” 的用户

[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个,当然我个人觉得编写个脚本更容易理解,写成命令太长,可读性太差,建议把命令写进脚本里。

[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 ~]$

  说明:以上脚本也是利用了上面说到的命令

2、查出用户UID最大值的用户名、UID及shell类型

[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类型。

3、统计当前连接本机的每个远程主机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.

4、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果 指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等 信息

[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]#

5、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等

[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

Linux命令实践( 六)的更多相关文章

  1. 排查问题所用到的一些Linux命令实践(不定期更新。。)

    一.前言 线上问题排查可能是每个程序员都会经历的.在排查的过程中,往往会用到很多Linux命令,也会产生一些很实用的技巧.本博文通过分析一次线上问题排查的过程,把所有用到的命令串起来.每个Linux命 ...

  2. Linux命令(六)——软件包管理(安装应用程序)

    与windows安装各种应用程序相似,在linux下也可以安装各种需要的应用程序,通常称为软件包.目前,在linux系统下常见的软件包格式主要有:RPM包.TAR包.bz2包.gz包.deb包.sh结 ...

  3. Linux命令(六) 查看文件 cat tac more less tail

    如果要查看文件,使用 cat  less  tac   tail  和 more 中的任意一个即可. 1.cat 使用 cat 命令查看文件时会显示整个文件的内容,注意cat只能查看文本文件的内容,如 ...

  4. Linux命令(六)Linux超级用户和管理组

    修改文件目录的所属组

  5. Linux命令(六)之防火墙iptables的相关操作以及端口的开放

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  6. Linux命令博客目录

    Linux 目录结构 Linux命令(一) pwd ,cd Linux命令(二) 复制文件 cp Linux命令(三) 移动文件 mv Linux命令(四)删除文件 rm Linux终端常用快捷键 L ...

  7. 六个优雅的 Linux 命令行技巧

    一些非常有用的命令能让命令行的生活更满足,使用 Linux 命令工作可以获得许多乐趣,但是如果您使用一些命令,它们可以减少您的工作或以有趣的方式显示信息时,您将获得更多的乐趣.在今天的文章中,我们将介 ...

  8. Linux课题实践五——字符集总结与分析

    Linux课题实践三——字符集总结与分析 20135318  刘浩晨 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字 ...

  9. 45 个常用Linux 命令,让你轻松玩转Linux!

    Linux 的命令确实非常多,然而熟悉 Linux 的人从来不会因为 Linux 的命令太多而烦恼.因为我们仅仅只需要掌握常用命令,就完全可以驾驭 Linux. 接下来,让我们一起来看看都有那些常用的 ...

随机推荐

  1. 微信小程序学习总结

    微信小程序开发环境安装以及相关设置配置 微信小程序前端页面书写 微信小程序前端样式WXSS书写 微信小程序中事件 微信小程序自定义组件 微信小程序发起请求 微信小程序登入流程 微信小程序路由跳转 微信 ...

  2. 当前机器的各种进程、服务信息的收集(win)

    当前机器的各种进程.服务信息的收集(win) 前言 我们在做渗透测试的过程中,遇到Windows系统的环境是最多的,然而在拿到一台Windows胸膛呢权限之后,我们要进行横向渗透测试或者纵向渗透测试, ...

  3. PMP(第六版)中的控制账户、规划包、工作包

    PMP(第六版)中的控制账户.规划包.工作包 控制账户是一个管理控制点,在该控制点上,把范围.预算和进度加以整合,并与挣值比较,以测量绩效.控制账户拥有2个或以上的工作包,但每个工作包只与一个控制账户 ...

  4. C#读取邮件附件的方法

    基于需求需要从邮件里读取附件,从网络搜索整理如下: 1 使用 Spire.Email 从官网下载安装并引用,地址:https://www.e-iceblue.com/Download/email-fo ...

  5. C#版本websocket及时通信协议实现(教程示例)

    1:Websocket有java.nodejs.python.PHP.等版本 ,我现在使用的是C3版本,服务器端是Fleck.客户端和服务器端来使用websocket的,下面开始讲解如何使用: 2:在 ...

  6. 一文详解CentOS6.5搭建DNS服务

    本文详细介绍DNS服务在Linux Operation System 中的搭建过程 一.DNS服务器的工作原理 客户机提出域名解析请求,并将该请求发送给本地的域名服务器.当本地的域名服务器收到请求后, ...

  7. 4.Linux文件管理相关命令(上)

    1.复制命令cp cp - copy files and directories 拷贝 文件 和 目录 -r 递归复制,通常用来复制目录 -p 保持复制源文件的属性 -v 显示复制的过程 1. 将当前 ...

  8. Vue系列---理解Vue.nextTick使用及源码分析(五)

    _ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...

  9. 增强for循环遍历HashSet

    package cn.bdqn.chatpterone.keben; import java.util.*; public class TestHanshSet { public static voi ...

  10. 解决 Mybatis报错org.apache.ibatis.ognl.NoSuchPropertyException: XXXCriteria$Criterion.noValue

    问题 这个noValue一定存在,但是报错. 场景就是存在并发的情况下,尤其是在服务刚刚启动的时候,就会发生这个异常. 但是很不幸,mybatis 3.4.1之前,用的 OGNL都是由这个问题. 分析 ...