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. 接下来,让我们一起来看看都有那些常用的 ...
随机推荐
- Java学习笔记之基础语法(数组)
数组 数组概述:是具有相同数据类型的数据的集合 数组的定义:数据类型 数组名 [] 数组特点: 1,数组是引用数据类型. 2,数组值用大括号,元素之间用逗号隔开,元素的个数是0-N个 3,数组长度是固 ...
- 代码审计-Thinkphp3框架EXP表达式SQL注入
最近看java框架源码也是看的有点头疼,好多还要复习熟悉 还有好多事没做...慢慢熬. 网上好像还没有特别详细的分析 我来误人子弟吧. 0x01 tp3 中的exp表达式 查询表达式的使用格式: $m ...
- JavaScript实现百度搜索页面
JavaScript实现百度搜索页面 HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...
- JQ获取元素属性值
最近在学习JAVA Web,自己也是做个下列表左右选择的小案例. 获取某个元素的属性值一直以为是要调用atrr方法,不过好像获取元素的数组形式再遍历每个元素的时候想获取到它的属性值用attr方法有问题 ...
- 2.单核CPU是如何实现多进程的?
单核cpu之所以能够实现多进程,主要是依靠于操作系统的进程的调度算法 如时间片轮转算法,在早期,举例说明:有5个正在运行的程序(即5个进程) : QQ 微信 有道词典 网易云 ...
- MyBatis 之源码浅读
环境简介与入口 记录一下尝试阅读Mybatis源码的过程,这篇笔记是我一边读,一遍记录下来的,虽然内容也不多,对Mybatis整体的架构体系也没有摸的很清楚,起码也能把这个过程整理下来,这也是我比较喜 ...
- vscode发博客插件更新v0.1.0(可能会相对好用点吧)
距离上一次编写这个vscode在博客园发博客的插件已经过去好久了,那个时候vscode插件的功能也没有那么强大,期间有人提出问题来,也有人提出建议来,我一直没有抽出时间来维护,深感抱歉,直到有人加到我 ...
- gulp源码分析
一.整体结构分析 整体结构 通过在nodejs环境对源码的打印,我们最终得到的gulp实例行如下图.那么我们gulp实例上的属性和方法是如何生成的呢? Gulp { domain: null, _ev ...
- SpringBoot整合Mybatisplus3.x之CRUD(一)
pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...
- mysql实现海量数据的存储、访问的解决方案
mysql实现海量数据的存储.访问的解决方案: mysql数据库水平切分的实现原理可分为以下几个:分库,分表,主从,集群,负载均衡器等 第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为 ...