Zabbix监控接收SNMPTrap消息与SNMPTT结合

news2025/1/29 14:06:31

一.SNMP 协议

1.协议介绍

snmp 协议是日常使用的较多的一种协议,绝大多数网络设备/存储等都支持 snmp 协议,通过此协议可以实现设备状态的监控及管理。

2.主要组成

SNMP 协议包括以下三个部分:

SNMP Agent:负责处理 snmp 请求,主要包括 get,set 等操作。可通过此接口查询设备的运行状态(使用较多),或者变更配置(使用较少),默认使用 UDP 161 端口
SNMP Trap: snmp 通知消息,主动发送消息到管理端。如设备故障,端口 down 等都会实时发送消息到接收端。默认使用 UDP 162 端口
SNMP MIB:MIB 代表管理信息库,是按层次结构组织的信息的集合,定义了设备内被管理对象的属性。

3.基本操作

经常使用的终端命令有以下几个:
snmpwalk:遍历整个 snmp mib 树,通常用来检测 snmp 是否配置成功,一般完整 walk 到一个 MIB,在 MIB 末尾,都会输出“End Of Mib”的字样。否则可能为 Response timeout 等错误,以此来判断 snmp agent 是否配置成功
snmpget:获取某个 oid 的具体数值,通常用来检测 oid 是否正确
遇到很多使用 snmpwalk 来获取 oid 数据的,这是错误的用法,这样是不能测试 oid 的正确性。只有通过 snmpget+oid 能获取的数据的 oid,才能配置成独立的监控项,作为监控指标采集数据。
使用 zabbix 监控 snmp 设备状态,一般按照以下步骤进行操作:

  1. 通过 snmpwalk 确定 snmp agent 配置是否正确
  2. 通过 snmpget 获取具体的某个 oid 的数据,记录 oid
  3. 在 zabbix 上建立对应的 item,interface 选择设备 snmp 接口,Key 可随意,SNMP OID 输入 oid,SNMP community 输入 snmp community Type of information 选择对应类型即可。

二.SNMPTrap 监控

1.SNMPTT 介绍

SNMPTT (SNMP Trap Translator) 是一个 perl 语言编写的用来处理 snmptrap 消息的程序,可与 Net-SNMP / UCD-SNMP snmptrapd 程序(www.net-snmp.org)一起使用,基本流程如下

snmptt 负责处理 net-snmp 接收到的 trap 消息,通过 snmptt 命令或 snmptthandler 进行处理,解析消息之后可将消息写入文件或数据库。

2.安装 SNMPTT

操作系统为 centos 7.7 1908 x64,使用 yum 方式安装 snmptt,snmptt 不在默认的官方源,属于 epel 源,因此需要首先安装 epel 源。 添加 epel 源

yum install epel-release -y

安装 snmptt 及相关组件

yum install snmptt perl-Sys-Syslog perl-DBD-MySQL -y

 即可完成安装。

3.转换 MIB 文件

snmp trap 消息如果不翻译,原始内容可能是这样的

{
  "Version": 2,
  "TrapType": 0,
  "OID": null,
  "Other": null,
  "Community": "public",
  "Username": "",
  "Address": "172.16.1.64:49692",
  "VarBinds": {
    ".1.3.6.1.2.1.1.3.0": 7908527690000000,
    ".1.3.6.1.2.1.2.2.1.1.18": 18,
    ".1.3.6.1.2.1.2.2.1.2.18": "Vlanif103",
    ".1.3.6.1.2.1.2.2.1.7.18": 2,
    ".1.3.6.1.2.1.2.2.1.8.18": 2,
    ".1.3.6.1.6.3.1.1.4.1.0": [1, 3, 6, 1, 6, 3, 1, 1, 5, 3]
  },
  "VarBindOIDs": [
    ".1.3.6.1.2.1.1.3.0",
    ".1.3.6.1.6.3.1.1.4.1.0",
    ".1.3.6.1.2.1.2.2.1.1.18",
    ".1.3.6.1.2.1.2.2.1.7.18",
    ".1.3.6.1.2.1.2.2.1.8.18",
    ".1.3.6.1.2.1.2.2.1.2.18"
  ]
}

如果需要知道上述 oid 的具体内容及数值意义就需要对照 MIB 文件对消息进行“翻译”。snmptt 需要加载对应配置文件,对 trap 消息进行翻译。 snmptt 提供了 snmpttconvertmib 工具,snmpttconvertmib 是一个 Perl 脚本,它将读取 MIB 文件并将 TRAP-TYPE(v1)或 NOTIFICATIONATION-TYPE(v2)定义转换为 SNMPTT 可读的配置文件,从而实现对 trap 消息的翻译,基本命令如下:

/usr/bin/snmpttconvertmib --in=/usr/share/snmp/mibs/CPQHOST.mib --out=/etc/snmp/snmptt.conf.compaq --net_snmp_perl
  • /usr/share/snmp/mibs/ 为 centos7 默认的 mibs 文件路径,上传设备 mib 文件到此目录。
  • /etc/snmp/snmptt.cong.compaq 转换完输出的配置文件

由于一般情况设备 mib 可能有多个,建议转换为一个配置文件中,便于管理,可使用以下命令进行批量转换

for i in HUAWEI*
do
/usr/bin/snmpttconvertmib --in=$i --out=/etc/snmp/snmptt.conf.huawei --net_snmp_perl
done

 以 HUAWEI 开头的 mib 文件都转换为 snmptt.conf.huawei,基本都是一些私有的 MIB。snmptt 自带的 snmptt.conf 配置文件里已经包括了一些常用的配置如端口 up/down。实际过程中,只转换需要关注的 MIB 文件即可。 这里以配置华为 USG 6320 登录 trap 告警为例,从华为官网下载 MIB 文件,并上传到系统/usr/share/snmp/mibs 目录下,从 MIB 说明文件得知,用户登录 MIB 文件属于 HUAWEI-SECURITY-LOGIN-MIB.mib 文件,对 mib 文件进行转换

/usr/bin/snmpttconvertmib --in=/usr/share/snmp/mibs/HUAWEI-SECURITY-LOGIN-MIB.mib --out=/etc/snmp/snmptt.conf.HUAWEI-SECURITY-LOGIN --net_snmp_perl

输入如下

表示转换成功,已经生成 snmptt.conf.HUAWEI-SECURITY-LOGIN,这里转换出来的为标准的文件,不符合 zabbix snmptrap 文件格式,因此还需要执行以下命令对配置文件进行稍加修改。

sed -i 's/FORMAT/FORMAT ZBXTRAP $aA/g' /etc/snmp/snmptt.conf.HUAWEI-SECURITY-LOGIN

其实就是添加一个 ZBXTRAP 字符。很多文档遗漏此项,导致后续配置后 zabbix server 日志出现以下错误:

28391:20190923:150150.572 invalid trap data found "2019/09/23 15:01:49 .1.3.6.1.6.3.1.1.5.4 Normal "Status Events" 172.16.1.64 - Link up on interface 18.  Admin state: up.  Operational state: up
2019/09/23 15:01:49 .1.3.6.1.6.3.1.1.5.4 Normal "Status Events" 172.16.1.64 - A linkUp trap signifies that the SNMPv2 entity, 18 up up Vlanif103

无法识别 trap 文件格式。

4.配置 snmptt

snmptt 配置文件有 2 个

  • /etc/snmp/snmptt.ini snmptt 主要配置文件
  • /etc/snmp/snmptt.conf 系统默认的策略文件,包括一些基本的端口 up/down 的配置 修改默认的 snmptt.ini 配置文件,主要修改一下几个地方
mode = standalone
multiple_event = 0
net_snmp_perl_enable = 1
translate_log_trap_oid = 1
date_time_format = %Y/%m/%d %H:%M:%S
syslog_enable = 0

在这里需要加载刚才转换完成的 snmptt.conf.HUAWEI-SECURITY-LOGIN 配置文件 在 snmptt.ini 文件末尾如下添加 snmptt.conf.HUAWEI-SECURITY-LOGIN

[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file).  The COMPLETE path
# and filename.  Ex: '/etc/snmp/snmptt.conf'
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/snmptt.conf.HUAWEI-SECURITY-LOGIN
END

snmptt 有二种模式,分别为

  • standalone 每次收到 trap 消息时读取 snmptt.ini 配置文件调用 snmptthandler 来处理 trap 消息
  • daemon 顾名思义守护进程方式,启动 snmptrap 时,初始化时一次性读取 snmptt.ini 二种方式各有区别,选择使用即可,具体区别可查看官方说明snmptt mode

 由于这里测试使用,经常修改 snmptt.ini 配置文件,如果使用 daemon 模式,那么每次修改 snmptt.ini 配置文件就需要重启 snmptt,因此这里我使用 standalone 模式。

5.配置 snmptrap

snmp trap 消息为主动通知,因此需要配置服务器来接收设备发送过来的 snmp trap 消息。net snmp 接收 trap 消息后,通过 traphandle 调用 snmptt 来对 trap 消息进行处理。 安装 net snmp,建议安装 net-snmp 的所有关联包

yum install net-snmp* -y

 即可完成 snmp 安装。 修改/etc/sysconfig/snmptrapd 为以下内容

OPTIONS="-m +ALL -On"

 修改/etc/snmp/snmptrapd.conf 配置文件,添加如下

authCommunity execute public
traphandle default /usr/sbin/snmptt

 authCommunity 可以配置多个 启动 snmptrap 服务

systemctl start snmptrapd
systemctl enable snmptrapd

在 usg 6320 上配置 trap 消息,并指向 snmp trap server,配置 Community 为 public

 配置之后,通过 web 登录 USG 和退出 USG,都会收到 trap 消息。snmptt 日志文件为/var/log/snmptt/snmptt.log 可看到相关信息,则表示配置处理 trap 成功,原始内容都为变量内容,不太友好, 可以通过调整 snmptt.conf.HUAWEI-SECURITY-LOGIN,配置 trap 消息输出格式。 snmptt.conf.HUAWEI-SECURITY-LOGIN 配置文件内容大致如下:

...
EVENT hwSecLOGINSucced .1.3.6.1.4.1.2011.6.122.62.2.1 "Status Events" Normal
FORMAT ZBXTRAP $aA $*
SDESC

The user login succeeded.
Variables:
  1: hwSecLOGINUser
     Syntax="OCTETSTR"
     Descr="The user name."
  2: hwSecLOGINIP
     Syntax="OCTETSTR"
     Descr="The User IP address."
  3: hwSecLOGINTime
     Syntax="OCTETSTR"
     Descr="The User login time."
  4: hwSecLOGINType
     Syntax="OCTETSTR"
     Descr="The User access type."
  5: hwSecLOGINLevel
     Syntax="INTEGER32"
     Descr="The User login level."
EDESC
......

其中 FROMAT 就是需要修改定义的,其中包括很多变量,具体可在SNMPTT.CONF-FORMAT 常用的几个如下:

  • $aA snmp trap 的代理 IP,即源 IP
  • $* 所有变量
  • $n n 为数字,表示变量次序 Variables 为 trap 变量,基本可以看懂
  • hwSecLOGINUser 登录用户名
  • hwSecLOGINIP 登录 IP
  • hwSecLOGINTime 登录时间
  • hwSecLOGINType 登录类型
  • hwSecLOGINLevel 登录级别 按照变量,可以对 trap 消息进行定制化,还支持中文!将 FORMAT 一行修改为
FORMAT ZBXTRAP $aA User login succeed!userName = $1, loginIP = $2, loginTime = $3, accessType = $4, userLevel = $5

 修改后,登录 USG,查看 snmptt.log 日志,日志已经被格式成需要的格式,已经可以看懂了!

2019/09/27 15:08:49 hwSecLOGINSucced Normal "Status Events" 172.16.1.64 - ZBXTRAP 172.16.1.64 User login succeed!userName = admin, loginIP = 10.128.23.19, loginTime = 2019/09/27 16:54:08, accessType = web, userLevel = 15

至此完成了 snmp trap 消息的接收及翻译工作。

三.配置 Zabbix

1.zabbix 安装注意事项

zabbix 可以配置读取接收到的 trap 文件,从而实现对对 trap 消息的告警,如过 zabbix 是编译安装,系统需要安装 net-snmp-devel 包,编译时需要添加以下参数

–with-net-snmp

2.修改 zabbix server 配置文件

SNMPTrapperFile=/var/log/snmptt/snmptt.log
StartSNMPTrapper=1

 制定 trap 文件为 snmptt 日志文件,并开启 strap 处理的 poller,修改之后重启 zabbix server。

3.配置 snmptrap item

1.添加一个主机

SNMP interfaces 添加机器 Ip,添加之后创建 item

  • Type 为 SNMP trap
  • snmptrap 为 zabbix 内置的 key,用来获取 trap 文件内容
  • Type of information 选择 log
  • Log time format 和 snmptt 配置一致,配置为 yyyy/MM/dd hh:mm:ss 直接配置 Key 为 snmptrap,表示获取 snmptt 日志里的所有消息。配置之后登录设备,退出设备,可在 Last data 看到数据已经采集。(此截图为为进行翻译之前截取,翻译之后可显示中文,英文)

4.配置 Trigger

目前已经采集了 trap 日志,需要配置对应的 trigger 对 trap 消息进行告警。以 usg 设备登录错误为例,登录错误时间类型为:hwSecLOGINFailed,因此配置如下 trigger

配置之后,用错误的用户登录 USG就可以产生告警。可以在问题中查看告警信息即可。

告警内容有点模糊,同样修改下 snmptt.conf.HUAWEI-SECURITY-LOGIN,将登录失败的内容修改为容易理解的中文,即修改 FORMAT 为中文

EVENT hwSecLOGINFailed .1.3.6.1.4.1.2011.6.122.62.2.2 "Status Events" Normal
FORMAT ZBXTRAP $aA 用户登录设备失败!用户名 = $1,登录ip = $2, 登录时间 = $3, 接入类型 = $4, 用户级别 = $5
SDESC

The user login failed.
Variables:
  1: hwSecLOGINUser
     Syntax="OCTETSTR"
     Descr="The user name."
  2: hwSecLOGINIP
     Syntax="OCTETSTR"
     Descr="The User IP address."
  3: hwSecLOGINTime
     Syntax="OCTETSTR"
     Descr="The User login time."
  4: hwSecLOGINType
     Syntax="OCTETSTR"
     Descr="The User access type."
EDESC

配置后告警内容

5 分钟后故障自动恢复,至此配置完成。

5.一般用法

以上只是简单测试,生产环境中应该注意以下事项

  • 分析需要告警的 trap event 类型 如:hwSecLOGINFailed/warmStart/linkDown/coldStart/authenticationFailure 根据类型,配置对应的 triger 即可
  • 可直接配置对应的 key 来采集对应的指标,只要收到消息就告警。如下图配置只采集 hwSecLOGINSucced 的指标。

配置对应的 trigger,进行告警

  • 如只配置了采集对应的 item,而没有配置 snmptrapkey,建议配置一个 snmptrap.fallback 的 item,配有匹配的 item 消息,都会保存到此 item 里
  • 更多配置及用法参考 zabbix 官网配置zabbix trap

四.注意事项

1.MIB 文件

一定要确保 MIb 文件的准确性,设备版本与 MIB 文件版本必须一致,包括大小版本。如不一致会看到解析文件出现以类似错误

2019/09/27 08:34:23 .1.3.6.1.4.1.2011.6.122.62.2.2 Normal "Status Events" 172.16.1.64 - the user 123 login with web on 10.128.23.19 in 2019/09/27 08:34:22 by time on 2019/09/27 08:34:22 ,status is Wrong Type (should be OCTET STRING): 0

 说明 mib 文件里定义的 trap 变量类型和实际收到的 trap 消息变量类型不一致,解析错误。

2.zabbix 配置

建议对同一类型设备配置统一的 snmp trap 模版,相同型号直接关联模版即可使用。

3.snmptt 日志

随之 snmp trap 消息的增多,snmptt 会逐渐变大,建议配置 logrotate 对日志进行切分,使用 yum 安装的 snmptt 已经自动配置了,使用编译安装的,可以参考 /etc/logrotate.d/snmptt

/var/log/snmptt/snmptt*.log /var/log/snmptt/snm ptthandler.debug {
    weekly
    notifempty
    missingok
}
/var/log/snmptt/snmptt.debug {
    weekly
    notifempty
    missingok
    postrotate
        /etc/init.d/snmptt reload >/dev/null 2>/dev/null || true
    endscript
}

snmptt 可开启 debug 日志,建议在测试阶段开启 debug 日志,以便进行排错。

参考文档
1.http://snmptt.sourceforge.net/docs/snmptt.shtml
2.https://www.miraclelinux.com/product-service/zabbix/tech-lounge/zbx-tl-001

探索技术无限可能,博主具有丰富监控模板资源及开发能力和项目管理经验,欢迎添加交流一起探讨,解决你的技术难题!

微信号:king_songax

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实战:批量加密Excel文件指南

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python实战&#xff1a;批量加密Excel文件指南&#xff0c;全文3800字&#xff0c;阅读大约10分钟。 在日常工作中&#xff0c;保护敏感数据是至关重要的。本文将引导你通过…

ARP安全综合功能示例

ARP安全简介 定义 ARP&#xff08;Address Resolution Protocol&#xff09;安全是针对ARP攻击的一种安全特性&#xff0c;它通过一系列对ARP表项学习和ARP报文处理的限制、检查等措施来保证网络设备的安全性。ARP安全特性不仅能够防范针对ARP协议的攻击&#xff0c;还可以防…

在国内Facebook广告怎么解决充值渠道问题?

怎么解决Facebook预充值跑广告营销的付款方式问题呢&#xff1f; Facebook跑广告是很多做出口营销的公司或团队喜欢的平台之一&#xff0c;那就避免不了需要支付给Facebook平台广告费用了&#xff0c;那到底用什么方式去充值到FB号上去解决呢&#xff1f;FB预充值有什么咔可以…

使用极限网关助力 ES 集群无缝升级、迁移上/下云

在工作中大家可能会遇到以下这些场景&#xff1a; 自建 ES 集群需要平滑迁移到 XX 云&#xff1b;从 XX 云将 ES 集群迁移到自建机房&#xff1b;ES 集群进行跨版本升级&#xff0c;同时保留回退能力&#xff1b; 这些场景往往都还有个共同的需求&#xff1a;迁移过程要保证业…

面试 Java 基础八股文十问十答第三期

面试 Java 基础八股文十问十答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 21.说下Java8的Stream流的常用方法 答: forEach遍历、find、match进行匹配reduce进行归约&#xff0c;比如求和&#xff0c;乘&#xff0c;除聚合…

前端项目打包和自动化部署(jenkins+gitee+nginx)

项目打包和自动化部署 一. 项目部署和DevOps 1. 传统的开发模式 在传统的开发模式中&#xff0c;开发的整个过程是按部就班就行&#xff1a; 但是这种模式存在很大的弊端&#xff1a; 工作的不协调&#xff1a;开发人员在开发阶段&#xff0c;测试和运维人员其实是处于等待…

基于SpringBoot + vue的在线视频教育平台

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

优化你的计算机性能:如何根据 CPU 占用率决定硬件升级

优化你的计算机性能&#xff1a;如何根据 CPU 占用率决定硬件升级 一、引言二、CPU 占用率的意义与影响三、监测和评估 CPU 占用率四、判断硬件升级需求的依据五、硬件升级方案和建议六、总结 一、引言 计算机性能优化是提升计算机系统整体效能的过程&#xff0c;它对于用户和…

etlbox.3.1.0 for NET 轻量级 ETL数据集成库 Crack

适用于 .NET 的轻量级 ETL&#xff08;提取、转换、加载&#xff09;工具箱和数据集成库 高度可定制 厌倦了使用几乎不可能实现复杂需求的用户界面&#xff1f;使用 ETLBox&#xff0c;可以轻松编写适合您独特需求的代码。插入您自己的逻辑或修改现有行为以满足您的特定要求。 …

数据库表的管理

表的基本概念 表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似&#xff0c;都是 按行和列的格式组织的。每行代表一条唯一的记录&#xff0c;每列代表记录中的一个字段。例如&#xff0c;在包含公 司员工信息的表中&#xff0c;每行代表一名员工…

VMware安装Debian12.2作为服务器(无桌面)

[TOC]VMware安装Debian12.2作为服务器&#xff08;无桌面&#xff09; 下载Debian系统 官方网站&#xff1a;https://www.debian.org/index.zh-cn.html 创建新的虚拟机 打开VMware Workstation&#xff0c;点击创建新的虚拟机 向导虚拟机类型选择 一般我会选择典型&…

UVA1368 DNA Consensus String

DNA Consensus String The Hamming distance is the number of different characters at each position from two strings of equal length. For example, assume we are given the two strings “AGCAT” and “GGAAT.” The Hamming distance of these two strings is 2 bec…

python 图书馆选座小程序源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索房间&#xff0c;轮播图&#xff0…

[FC][常见Mapper IRQ研究]

本次IRQ研究了如下表所示Mapper的IRQ操作: 卡带名Mapper号VRC373VRC421,23,25VRC624 & 26VRC785MMC34MMC410MMC55Sunsoft FME-769Namco16319Jaleco SS 8800618RAMBO-164 共计11种Mapper的IRQ操作使用例子 代码内有详细注释, 希望能帮助到感兴趣的人. Mapper控制代码(MMC3…

工业机器视觉megauging(向光有光)使用说明书(三,轻量级的visionpro)

下来我们说说第二个相机的添加&#xff1a; 第一步&#xff0c;点击相机二&#xff0c;如下&#xff1a; 第二步&#xff0c;点击&#xff1a;加载工具组.xml&#xff0c;加载toolgroupxml2目录下的&#xff1a;工具组.xml 注意&#xff0c;一个相机只能用一个toolgroupxml,第…

docker配置redis插件

从页面上下载对应的redis.conf文件 放入redis下的conf文件夹&#xff0c;作为通用的conf文件。 将redis.conf文件拷贝到6390/conf文件夹下 [roothao /usr/local/software/redis/conf]# cp redis.conf /usr/local/software/redis/6390/conf配置6390的redis.conf文件 配置插件…

云时空社会化商业 ERP 系统 service SQL 注入漏洞复现

0x01 产品简介 时空云社会化商业ERP&#xff08;简称时空云ERP&#xff09; &#xff0c;该产品采用JAVA语言和Oracle数据库&#xff0c; 融合用友软件的先进管理理念&#xff0c;汇集各医药企业特色管理需求&#xff0c;通过规范各个流通环节从而提高企业竞争力、降低人员成本…

[c]比较月亮大小

本题的难点就是分情况讨论 #include<stdio.h> int main() {int n;scanf("%d",&n);int arr2[n];int p;for(int m0;m<n-1;m){scanf("%d",&arr2[m]);//输入n个数保存到数组}if(n1)//当输入一个数据时&#xff0c;输入0&#xff0c;可以判断…

微信小程序 内置地图及打开外部地图导航

1. 微信小程序 内置地图及打开外部地图导航 1.1 说明 用户点击通过目的地经纬度打开地图展示坐标点&#xff0c;然后可以选择外部安装的地图app进行导航搜索。    scale“4” 缩放比例&#xff0c;缩放级别&#xff0c;取值范围为3-20。 1.2. wxml代码 <button type&qu…

leetcode:225. 用队列实现栈

一、题目 链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; typedef struct { } MyStack; MyStack* myStackCreate() void myStackPush(MyStack* obj, int x) int myStackPop(MyStack* obj) int myStackTop(MyStack* obj) …