Linux命令实践( 六)
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命令实践( 六)的更多相关文章
- 排查问题所用到的一些Linux命令实践(不定期更新。。)
一.前言 线上问题排查可能是每个程序员都会经历的.在排查的过程中,往往会用到很多Linux命令,也会产生一些很实用的技巧.本博文通过分析一次线上问题排查的过程,把所有用到的命令串起来.每个Linux命 ...
- Linux命令(六)——软件包管理(安装应用程序)
与windows安装各种应用程序相似,在linux下也可以安装各种需要的应用程序,通常称为软件包.目前,在linux系统下常见的软件包格式主要有:RPM包.TAR包.bz2包.gz包.deb包.sh结 ...
- Linux命令(六) 查看文件 cat tac more less tail
如果要查看文件,使用 cat less tac tail 和 more 中的任意一个即可. 1.cat 使用 cat 命令查看文件时会显示整个文件的内容,注意cat只能查看文本文件的内容,如 ...
- Linux命令(六)Linux超级用户和管理组
修改文件目录的所属组
- Linux命令(六)之防火墙iptables的相关操作以及端口的开放
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Linux命令博客目录
Linux 目录结构 Linux命令(一) pwd ,cd Linux命令(二) 复制文件 cp Linux命令(三) 移动文件 mv Linux命令(四)删除文件 rm Linux终端常用快捷键 L ...
- 六个优雅的 Linux 命令行技巧
一些非常有用的命令能让命令行的生活更满足,使用 Linux 命令工作可以获得许多乐趣,但是如果您使用一些命令,它们可以减少您的工作或以有趣的方式显示信息时,您将获得更多的乐趣.在今天的文章中,我们将介 ...
- Linux课题实践五——字符集总结与分析
Linux课题实践三——字符集总结与分析 20135318 刘浩晨 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字 ...
- 45 个常用Linux 命令,让你轻松玩转Linux!
Linux 的命令确实非常多,然而熟悉 Linux 的人从来不会因为 Linux 的命令太多而烦恼.因为我们仅仅只需要掌握常用命令,就完全可以驾驭 Linux. 接下来,让我们一起来看看都有那些常用的 ...
随机推荐
- django-搭建BBS关键点总结
0826自我总结 django-搭建BBS关键点总结 一.关于开口子,直接输入url访问文件内容 django自带开了个口子是static文件可以直接访问到 手动开口子 urs.py from dja ...
- CEILING保留n位小数向上取整
number=3.1415926 CEILING(number*POWER(10,n))/POWER(10,n) 思路为:乘以10的n次方得到要保留的小数部分并转换为整数,再用CEILING向上取整, ...
- Javascript之傻傻理不清的原型链、prototype、__proto__
新人学习Javascript,其中的原型链一直是云里雾里,不得要领,查了很多相关资料,觉得这遍讲得最为清晰易懂,特转载分享,共同学习. 1. JavaScript内置对象 所谓的内置对象 指的是:Ja ...
- tinyxml2
网上下载tinyxml2:tinyxml2.h和tinyxml2.cpp 加载xml XMLDocument doc; doc.LoadFile("test.xml"); ...
- CSP考场Emacs使用指南[原创]
前言: 据说,CSP考试,之后不再支持windows了呢. windows用户真得劲! 那用什么系统? Ubuntu上场了 Ubuntu编译指南 进入Ubuntu系统,在你想存的文件夹中新建一个空白文 ...
- 百万年薪python之路 -- re模块
re模块 re模块是python用来描述正则表达式的一个模块. 正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则. 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先 ...
- 【Go】高效截取字符串的一些思考
原文链接:https://blog.thinkeridea.com/201910/go/efficient_string_truncation.html 最近我在 Go Forum 中发现了 [SOL ...
- nsq (三) 消息传输的可靠性和持久化[一]
上两篇帖子主要说了一下nsq的拓扑结构,如何进行故障处理和横向扩展,保证了客户端和服务端的长连接,连接保持了,就要传输数据了,nsq如何保证消息被订阅者消费,如何保证消息不丢失,就是今天要阐述的内容. ...
- 基于redis解决session分布式一致性问题
1.session是什么 当用户在前端发起请求时,服务器会为当前用户建立一个session,服务器将sessionId回写给客户端,只要用户浏览器不关闭,再次请求服务器时,将sessionId传给服务 ...
- C# .NET .NET Framework .NET CORE 等的关系简介
2019新的一年,祝大家新年快乐,工作生活一帆风顺,心想事成!诸事大吉! 这篇文章是我今年的第一篇博客,主题是:C# .NET .NET Framework .NET CORE 等这些名词之 ...