python-2.7 - snmpd 通过运行 python
问题描述
我试图通过 snmp 查询 modbus 设备,使用 snmpd 传递 python 脚本来检索数据。
#! /bin/bash
if [ "$1" = "-g" ]
then
echo .1.3.6.1.4.1.52612.10.3.1
echo string
python /usr/local/bin/readvolt.py
fi
exit 0
这是 readvolt.py 的样子:
#!/usr/bin/python
import minimalmodbus
eqp = minimalmodbus.Instrument('/dev/ttyUSB0',1) # port name, slave address (in decimal)
# skip some other lines for serial port initialization
volt = eqp.read_float(0,4,2) # getting data from serial modbus
print volt
以及我的 snmpd.conf 中的这一行:
pass .1.3.6.1.4.1.52612.10.3.1 /bin/sh /usr/local/bin/volt.sh
我的问题:我从 python 获得了回溯,找不到 minimummodbus 模块,但是当我尝试直接从主机运行 readvolt.py 时,它按预期工作(它可以打印出结果(伏特))
pi@raspberrypi:/usr/local/bin $ readvolt.py
220.25
我还尝试使用简单的python脚本(test.py)来确保snmpd pass是否可以在snmp管理器的snmpget响应时运行python脚本
#!/usr/bin/python
import sys
print "test"
它运行正常:
suryo@r50e:~$ snmpwalk -v2c -c public 192.168.1.5 .1.3.6.1.4.1.52612.10.3.1
iso.3.6.1.4.1.52612.10.3.1 = STRING: "test"
suryo@r50e:~$
这里有什么问题 ?似乎python在通过snmpd pass运行时无法导入外部模块。我在想如果这是一个访问控制问题,Debian-snmp 无权访问串行端口..
解决方案
通过找出 snmpd 守护进程的用户名解决了问题。我将 whoami 放入脚本并获得了“Debian-snmp”,然后变得直截了当,通过运行检查组成员身份:
pi@rraspberrypi:~$ groups Debian-snmp
Debian-snmp : Debian-snmp
将 Debian-snmp 放入 dialout 成员以授予对串行端口的完全访问权限:
pi@raspberrypi:~ $ sudo usermod -a -G dialout Debian-snmp
重新启动 snmpd 以使用新成员身份登录,瞧..它可以从 snmp 命令 /snmpget 读取从机 modbus 设备
推荐阅读
- prolog - 我怎样才能使这更合乎逻辑?
- python - Py 3.8.2 点缺失
- javascript - 如何知道所选单元格是否是 CSS 网格中的矩形?
- swiftui - SwiftUI - 搜索栏
- xforms - XForms 是如何使用的?
- genexus - 为什么无法从 Genexus .Net 使用某些外部 REST API?
- css - 在材质 UI 中,如何将 Button 置于 Grid 项目的中间?
- javascript - 检查 TypeScript 中的全局或窗口对象上是否存在属性
- google-apps-script - 使用出现错误的 Google 表格 onOpen() 函数时,如何获得实时脚本错误通知?
- prolog - Prolog 作为第一种编程语言