第七周作业——第三种

本文介绍了五个Linux脚本实例,包括通过进程PID获取CPU和内存指标、定期检查端口状态、判断文件类型并赋予执行权限、控制用户登录权限以及计算指定用户ID之和。这些脚本涵盖了系统监控、网络检查和文件管理等实用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、编写脚本实现传入进程pid,查看对应进程/proc下CPU、内存指标.

脚本内容:

 

#!/bin/sh
# ******************************************************
# Author       :suika_xiaoyuzhenren
# Last modified: 2019-12-12 16:36
# Email        : 2429366765@qq.com
# blog         : https://blog.csdn.net/suika_xiaoyuzhenren
# Filename     : 7-1.sh
# Description  : 
# ******************************************************

cat <<EOF
一键查询进程信息
版本:Ver 1.32  复合版
功能:输入PID号码可以查询进程使用了多少CPU、内存资源,输入quit可以退出查询
本软件仅供学习交流,严禁用于商业用途,请于24小时内删除。
支持正版,人人有责

 |||||||||||||  
╭| ━ ━ |╮  
╰| • • |╯找女朋友中……………………  
 ╰╭╮-╭╮╯  
EOF
sleep 1


while :
  do
        #用户输入的进程号赋值给后面的 Pid_Num 变量
        read -p '请输入需要查询的进程PID号,或者输入quit退出:' Pid_Num
                
        case $Pid_Num in
        #这里要先判断$Pid_Num 是否是quit
        quit)
                echo '已退出'
                exit 1
                ;;
        #这里我忘了case语句 )这儿怎么表示多位数的数字,先在这儿用*,再在语句里面判断
        *)
                #用 expr 计算和 $? 取是否是正常值 0
                expr $Pid_Num + 0 &> /dev/null && echo $? >/dev/null
                #如果 $?等于 0 并且 /proc/$Pid_Num 目录存在,就打印这个进程使用的CPU、内存指标
                if [ $? -eq 0 -a -d /proc/$Pid_Num ];then
                        cat /proc/$Pid_Num/status
                else
                        echo '系统没有这个进程号'
                fi
                ;;
        esac
done

执行结果:

执行结果 :
[root@localhost mage]# sh  7-1.sh 
一键查询进程信息
版本:Ver 1.32  复合版
功能:输入PID号码可以查询进程使用了多少CPU、内存资源,输入quit可以退出查询
本软件仅供学习交流,严禁用于商业用途,请于24小时内删除。
支持正版,人人有责
 |||||||||||||  
?| ━ ━ |?  
?| ? ? |?找女朋友中……………………  
 ???-???  

请输入需要查询的进程PID号,或者输入quit退出:1
Name:	systemd
Umask:	0000
State:	S (sleeping)
Tgid:	1
Ngid:	0
Pid:	1
PPid:	0
TracerPid:	0
Uid:	0	0	0	0
Gid:	0	0	0	0
FDSize:	64
Groups:	
VmPeak:	  256236 kB
VmSize:	  190832 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	    3720 kB
VmRSS:	    3720 kB
RssAnon:	    1156 kB
RssFile:	    2564 kB
RssShmem:	       0 kB
VmData:	  148424 kB
VmStk:	     132 kB
VmExe:	    1412 kB
VmLib:	    3728 kB
VmPTE:	     120 kB
VmSwap:	       0 kB
Threads:	1
SigQ:	0/14588
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	7be3c0fe28014a03
SigIgn:	0000000000001000
SigCgt:	00000001800004ec
CapInh:	0000000000000000
CapPrm:	0000001fffffffff
CapEff:	0000001fffffffff
CapBnd:	0000001fffffffff
CapAmb:	0000000000000000
Seccomp:	0
Speculation_Store_Bypass:	thread vulnerable
Cpus_allowed:	f
Cpus_allowed_list:	0-3
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	95684
nonvoluntary_ctxt_switches:	4256
请输入需要查询的进程PID号,或者输入quit退出:2
Name:	kthreadd
Umask:	0000
State:	S (sleeping)
Tgid:	2
Ngid:	0
Pid:	2
PPid:	0
TracerPid:	0
Uid:	0	0	0	0
Gid:	0	0	0	0
FDSize:	64
Groups:	
Threads:	1
SigQ:	0/14588
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	ffffffffffffffff
SigCgt:	0000000000000000
CapInh:	0000000000000000
CapPrm:	0000001fffffffff
CapEff:	0000001fffffffff
CapBnd:	0000001fffffffff
CapAmb:	0000000000000000
Seccomp:	0
Speculation_Store_Bypass:	thread vulnerable
Cpus_allowed:	f
Cpus_allowed_list:	0-3
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	2936
nonvoluntary_ctxt_switches:	0
请输入需要查询的进程PID号,或者输入quit退出:ew33
系统没有这个进程号
请输入需要查询的进程PID号,或者输入quit退出:233weew
系统没有这个进程号
请输入需要查询的进程PID号,或者输入quit退出:1qe
系统没有这个进程号
请输入需要查询的进程PID号,或者输入quit退出:1..2
系统没有这个进程号
请输入需要查询的进程PID号,或者输入quit退出:quit
已退出

2、编写脚本实现每分钟检查一个主机端口是否存活(提示使用nmap),如果检查到端口不在线,sleep 10s,如果三次都不存在,记录到日志

脚本内容:

#!/bin/sh
# Last modified: 2019-12-15 13:13
# Email        : 2429366765@qq.com
# blog         : https://blog.csdn.net/suika_xiaoyuzhenren
# Filename     : 7-2.sh
# Description  : 
# ******************************************************



#ip_geshi=`grep -o "\<\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)\>"`

#nmap_ceshi 变量目的是过滤出 open
nmap_ceshi=`nmap $1 -p $2 | sed -n '6p' |cut -d' ' -f2`
for i in `seq 1 3`;do
        if [ $nmap_ceshi != "open" ];then
                sleep 10
        fi
        [ $i -eq 3 ] && echo "Port $2 with IP address $1 does not exist for 3 consecutive times" >> /var/log/ip_duankou.log
done

执行结果:

3、编写脚本/root/bin/excute.sh,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件

vim /root/bin/excute.sh

脚本内容:

#!/bin/sh
# ******************************************************
# Author       :suika_xiaoyuzhenren
# Last modified: 2019-12-14 21:56
# Email        : 2429366765@qq.com
# blog         : https://blog.csdn.net/suika_xiaoyuzhenren
# Filename     : excute.sh
# Description  : 
# ******************************************************


rrr=`echo "$1" |sed -n 's/.*\(\.sh\)/\1/g'`

if [[ $rrr =~ .sh  ]];then
        chmod o+x $1
else
        echo $1'不是脚本文件'   
fi

执行结果:

4、编写/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统

vim /root/bin/nologin.sh

nologin.sh 脚本内容:

#!/bin/sh
# ******************************************************
# Author       :suika_xiaoyuzhenren
# Last modified: 2019-12-14 19:20
# Email        : 2429366765@qq.com
# blog         : https://blog.csdn.net/suika_xiaoyuzhenren
# Filename     : nologin.sh

#变量,自定义登录状态
Login_Status=/sbin/nologin

while : 
  do
        read -p '请输入你需要禁止用户登录系统的用户名,退出请输入quit.:' NoLogin
        if [[ $NoLogin =~ quit ]];then
                echo '已成功退出。'
                exit 1
        else
                #这里用id 命令来判断输入的是否是用户名
                id $NoLogin &> /dev/null

                #如果 $? 等于0,那么输入的就是用户名
                if [ $? -eq 0 ];then
                        #这里用sed来取值更改 /etc/passwd 文件后面的登录状态
                        #注:我这儿用的是变量来控制 输入的用户名 和 要更改的登录状态,如果分隔符用的是 / ,那么
 sed 命令会报错,错误信息为:sed: -e expression #1, char 22: unknown option to `s'  
                        #解决方法:把 sed 的分隔符由 / 改为 @ 或者 # 符号等。
                        sed -i 's@\(^'''$NoLogin''':.*:\).*@\1'''$Login_Status'''@g' /etc/passwd
                        echo "$NoLogin现在已经禁止登录系统。"
                else
                        #否则打印提示信息 
                        echo "系统里没有用户名$NoLogin"
                fi
        fi
done

____________________________________________________

vim /root/bin/login.sh

login.sh 脚本内容:

#!/bin/sh
# ******************************************************
# Author       :suika_xiaoyuzhenren
# Last modified: 2019-12-14 19:20
# Email        : 2429366765@qq.com
# blog         : https://blog.csdn.net/suika_xiaoyuzhenren
# Filename     : login.sh

#变量,自定义登录状态
Login_Status=/bin/bash

while : 
  do
        read -p '请输入你需要用户登录系统的用户名,退出请输入quit.:' Login
        if [[ $Login =~ quit ]];then
                echo '已成功退出。'
                exit 1
        else
                #这里用id 命令来判断输入的是否是用户名
                id $Login &> /dev/null

                #如果 $? 等于0,那么输入的就是用户名
                if [ $? -eq 0 ];then
                        #这里用sed来取值更改 /etc/passwd 文件后面的登录状态
                        #注:我这儿用的是变量来控制 输入的用户名 和 要更改的登录状态,如果分隔符用的是 / ,那么
 sed 命令会报错,错误信息为:sed: -e expression #1, char 22: unknown option to `s'  
                        #解决方法:把 sed 的分隔符由 / 改为 @ 或者 # 符号等。
                        sed -i 's@\(^'''$Login''':.*:\).*@\1'''$Login_Status'''@g' /etc/passwd
                        echo "$Login现在已经可以登录系统。"
                else
                        #否则打印提示信息 
                        echo "系统里没有用户名$Login"
                fi
        fi
done

执行结果 :

5、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件的第10个用户和第20个用户的ID之和

vim /root/bin/sumid.sh

脚本内容:

#!/bin/sh
# ******************************************************
# Author       :suika_xiaoyuzhenren
# Last modified: 2019-12-13 21:18
# Email        : 2429366765@qq.com
# blog         : https://blog.csdn.net/suika_xiaoyuzhenren
# Filename     : 7-5.sh
# Description  : 
# ******************************************************
a=`sed -n '10s/.*:x:\([0-9]\+\):.*/\1/gp' /etc/passwd`
b=`sed -n '20s/.*:x:\([0-9]\+\):.*/\1/gp' /etc/passwd`

echo '第十个用户和第二十个用户ID之和为'$(($a+$b))

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值