自动化运维-《日常运维手册接入手册》之 服务器端口表

news/2024/11/16 3:17:41/文章来源:https://www.cnblogs.com/zhoutuo/p/18352599

前言:脚本编写不是一蹴而就,需要根据当前场景和实际需求不断测试和调整,最重要的是勇于踏出敢于尝试的这一步。

任务需求:在ansible-vault加密环境下,使用root权限批量将项目上所有服务器的tcp端口过滤掉22, 25, 53, 443,631,9100,10050端口 后显示出来;判断服务器上如果有jps命令的就执行,输出的所有的程序的PID,并显示PID对应的进程,查出各PID对应的端口;如果没有jps命令的服务器就只显示过滤后的端口信息。

1.0版本:

第一步:写一个在ansible上执行的脚本yaml文件

---
- name: 项目名hosts: 项目hosts名user: 普通用户vars_files:- "secrets.yml"vars:ansible_ssh_pass: "{{ lookup('vars', 'dms_password') }}"ansible_become_pass: "{{ lookup('vars', 'dms_password') }}"tasks:- name: just testbecome: yesbecome_user: rootbecome_method: sudoshell:  netstat -tlnp

第二步执行命令:ansible-playbook -i /etc/ansible/hosts ***.yaml --ask-vault-pass -v
这个是输出项目上所有服务器的tcp端口,然后手动排查系统默认端口,各web服务,中间件和数据库等自己判断,jar应用又下一步来完成统计。

第三步 写个jps-pid-端口的脚本
这里我将错误的脚本和达不到的效果的脚本都列举出来
脚本1:

#!/bin/bash# 获取 root 用户下的所有 Java 进程的 PID 和名称
PIDS_NAMES=$(sudo jps | awk '{print $1","$2}')# 遍历每个 PID 和名称,查找对应的端口
for PID_NAME in $PIDS_NAMES; doPID=$(echo $PID_NAME | cut -d, -f1)NAME=$(echo $PID_NAME | cut -d, -f2)echo "PID: $PID, Name: $NAME"# 使用 lsof 查找端口PORTS=$(sudo lsof -a -p $PID -i -n | grep LISTEN | awk '{print $9}' | cut -d: -f2)# 或者使用 netstat 查找端口# PORTS=$(sudo netstat -anp | grep $PID | grep LISTEN | awk '{print $4}' | cut -d: -f2)echo "Ports: $PORTS"echo "----------------------------------------"
done

执行结果:

结论:有的jar程序无法显示出对应的端口

脚本2:

#!/bin/bash# 执行 jps 命令获取进程信息
jps_output=$(jps -l)# 提取 PID 和进程名
IFS=$'\n'
for line in $jps_output; dopid=$(echo $line | awk '{print $1}')process_name=$(echo $line | awk '{print $2}')# 使用 netstat 查找 PID 对应的端口ports=$(sudo netstat -nlp | awk '$7 ~ /'$pid'/{print $4}' | awk -F ':' '{print $NF}')echo "PID: $pid, Process: $process_name, Ports: $ports"
done

执行结果:

结论:无法显示对应端口

脚本3:

#!/bin/bash# 检查jps和netstat命令是否存在
if ! command -v jps &> /dev/null; thenecho "jps 命令未找到,请确保Java已安装。"exit 1
fiif ! command -v netstat &> /dev/null; thenecho "netstat 命令未找到,请确保net-tools已安装。"exit 1
fi# 获取所有Java进程的PID和命令行参数
java_processes=$(jps -l)# 检查jps命令是否成功执行
if [ $? -ne 0 ]; thenecho "jps 命令执行失败。"exit 1
fiecho "Java进程的PID和命令行参数:"
echo "$java_processes"# 定义一个函数来查找进程的端口
find_ports_for_pid() {local pid=$1# 使用netstat和grep查找PID对应的端口netstat -tulnp | grep "$pid" | awk '{print $4}'
}# 遍历所有Java进程
for process in $java_processes; do# 提取PIDpid=$(echo $process | cut -d ' ' -f 1)# 打印PIDecho "查找 PID: $pid 对应的端口..."# 查找端口find_ports_for_pid "$pid"# 打印分隔线echo "----------"
done

执行结果:

结论:端口没有并排显示,不方便统计

脚本F:

#!/bin/bash# 执行 jps 命令获取进程信息
jps_output=$(jps -l)# 提取 PID 和进程名
IFS=$'\n'
for line in $jps_output; dopid=$(echo $line | awk '{print $1}')process_name=$(echo $line | awk '{print $2}')# 使用 netstat 查找 PID 对应的端口ports=$(sudo netstat -nlp | awk '$7 ~ /'$pid'/{print $4}' | awk -F ':' '{print $NF}')ports_array=($ports)ports_str=""for port in "${ports_array[@]}"; doif [ -n "$ports_str" ]; thenports_str="$ports_str,"fiports_str="$ports_str$port"doneecho "PID: $pid, Process: $process_name, Ports: $ports_str"
done

执行结果:

结论:完美!

2.0版本:
1.0版本所有步骤,也就是整个需求又自动化工具ansible一键完成。
写一个在ansible上执行的脚本yaml文件

- name: 项目名hosts: 项目hostsuser: 普通用户vars_files:- "secrets.yml"vars:ansible_ssh_pass: "{{ lookup('vars', 'dms_password') }}"ansible_become_pass: "{{ lookup('vars', 'dms_password') }}"tasks:- name: Gather filtered TCP portsbecome: yesbecome_user: rootbecome_method: sudoshell: "netstat -tlnp | grep LISTEN | awk '{print $4}' | cut -d: -f2 | grep -Ev '22|25|53|443|631|9100|10050'"register: filtered_ports- name: Display filtered TCP portsbecome: yesbecome_user: rootbecome_method: sudodebug:var: filtered_ports.stdout_lines- name: Check if jps shell is availablebecome: yesbecome_user: rootbecome_method: sudoshell: "which jps"register: jps_checkfailed_when: false- name: Gather Java process informationbecome: yesbecome_user: rootbecome_method: sudoshell: "jps -l"register: jps_outputwhen: jps_check.stdout | length > 0- name: Display Java process informationbecome: yesbecome_user: rootbecome_method: sudodebug:var: jps_output.stdout_lineswhen: jps_check.stdout | length > 0- name: Gather ports for Java processesbecome: yesbecome_user: rootbecome_method: sudoshell: "lsof -a -p {{ item }} -i -n | grep LISTEN | awk '{print $9}' | cut -d: -f2"loop: "{{ jps_output.stdout_lines | map('regex_replace', '^(.*) (.*)$', '\\1') | list }}"register: java_process_portswhen: jps_check.stdout | length > 0- name: Display ports for Java processesbecome: yesbecome_user: rootbecome_method: sudodebug:var: java_process_ports.results | map(attribute='stdout_lines') | listwhen: jps_check.stdout | length > 0


执行结果:

这里只能展示最后的结果,没有报错和失败的,上面的输出信息涉及公司隐私

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780961.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

transformer的位置编码具体是如何做的

Vision Transformer (ViT) 位置编码 body { font-family: Arial, sans-serif; line-height: 1.6; margin: 20px; background-color: rgba(244, 244, 244, 1) } h2 { color: rgba(51, 51, 51, 1) } p { margin-bottom: 10px } ul { margin-bottom: 20px } .code { background-co…

第六周学习mysql

本周学习到了mysql中的视图距离学习完进阶篇的mysql还差五十节课,下周就可以完全学完,对于本周,并没有完整的完成上周定制的任务,不过整体本周表现还行。 下周至少学完mysql之后开始学习jdbc,jdbc内容看了一下,相对较少,希望下周可以提前开始学习。 总结:进度来说还是相…

009.Vue3入门,事件修饰符的使用方法

1、代码如下:<template><h3>事件修饰符</h3><a @click.prevent="clickHandle" href="http://www.baidu.com">百度</a><div @click="click1"><p @click="click2">测试1</p></div&…

php程序对微信你昵称的表情处理导出excel文件

php程序对微信昵称的表情处理,若转义存数据库,怎么读出并导出成excel文件.<?phpinclude(dirname(__FILE__) ./phpexcel-1.7.7/Classes/PHPExcel.php); include(dirname(__FILE__) ./phpexcel-1.7.7/Classes/PHPExcel/IOFactory.php);$name2 = "[[EMOJI:%F0%9F%91%BF]]…

『模拟赛』暑假集训CSP提高模拟17

『模拟赛记录』暑假集训CSP提高模拟17RankA. 符号化方法初探 原[ABC081D] Non-decreasing 挺水的,不过赛时想了错解。 赛时做法是都塞到一个 set 里一遍推过去,如果比上一个小就 lower_bound 找一个最接近差的数加上,不过它存在比较大的问题。 首先全是负判不了,会进入死循…

008.Vue3入门,事件传参的用法

1、代码如下<template><h3>事件传参</h3><p @click="getNameHandler(item,$event)" v-for="(item,index) of names":key="index">{{ item }}</p> </template><script> export default {data() {retur…

表达式目录树

1.表达式目录树和委托的类比: 表达式目录树 是一种数据结构、是一种语法树,可以被我们解析: 2.表示式目录树的使用场景:把一个对象中的数据赋值到另一个对象当中: 实现对象值赋值: 一.反射: 二.序列化器: 三.使用表达式目录树4.使用泛型缓存+表达式目录树 调用如下: 5…

2024比赛wp合集

记录一下最近比赛的wp吧 D^3CTF d3note 没有限制idx范围,越界任意读写,读malloc地址泄露libc,网上写system from Excalibur2 import*proc(./pwn) lib(./libc.so.6) el(./pwn)default(h)def add(idx,size,content):sl(b"276")sl(str(idx))sl(str(size))sl(content)…

比较运算符和逻辑运算符

//比较运算符:        // >// <// ==// >=// <=// !=//逻辑运算符 与&& 或|| 非! static void Main(string[] args){while (true){Console.WriteLine("请输入年份:");int year = Convert.ToInt32(Console.ReadLine());if (year % 400 =…

计算机的发展史和基本结构

关于CSP-J初赛的学习笔记2.计算机的发展史和基本结构 2.1. 计算机发展史阶段 年代 电子元件 运算速度(每秒/次)第一代 \(1946-1958\) 真空电子管 数千至数万第二代 \(1958-1964\) 晶体管 几十万至几百万第三代 \(1964-1970\) 中小规模集成电路 百万至几百万第四代 \(1970-202…

008.Vue3入门,最基础的事件处理,点击按钮增加次数,支持传参

1、代码如下:<template><h3>内联事件处理群</h3><button @click="addCount1">Add</button><p>{{ count1 }}</p><button @click="addCount2(hello)">按钮</button><p>{{ count2 }}</p>…