5

我是一名应届毕业生,刚刚在香港找到了第一份程序员工作。如主题所述,我需要使用 C# 来控制 Cisco 交换机上的端口。

我搜索和研究了很长时间,所以我对SNMP和MIB有基本的了解。我可以找到一些关于如何管理 cisco 交换机的文章,但没有一篇文章具体说明了如何启用和禁用端口。此时我想我需要配置交换机以启用 SNMP 服务,然后我应该发送一个 SNMP Set 数据包来打开/关闭特定端口。这是正确的吗?

有人有这方面的经验并愿意与我分享吗?请留下一些建议。如果你以前读过一些有用的网站,请把网址留在这里,我也可以看看。

非常感谢您的关注。

4

3 回答 3

7

我知道三种方法(我最喜欢第一种):

选项 1:
处理此类问题的常用方法是自动 telnet(或自动 ssh)发送适当的命令。IOS 在很大程度上是相当标准化的,并且以这种方式工作得很好——TCL
Expect包非常适合这种事情......我想有一个 C# 实现。

如果您已经熟悉 IOS 语法,这将最有效。

选项 2:
这可能是您想要的:
IF-MIB:: ifAdminStatus可通过 SNMP 写入(这里是使用 NET-SNMP 的示例):

接口 UP:
snmpset -v1 -c 社区主机名 IF-MIB::ifAdminStatus.interface i 1

接口关闭:
snmpset -v1 -c 社区主机名 IF-MIB::ifAdminStatus.interface i 2

(其中“接口”是表示接口的数字,该值在同一个 MIB 中可用 - 在1.3.6.1.2.1.2.2.1.2上查找接口值和描述。)

(同样,您可能会利用 snmpset 的 C# 实现......并且您必须事先在设备上配置 SNMP 社区。)

选项 3:
可以使用 SNMP通过 TFTP 服务器触发上传或下载配置。
这有时按以下顺序使用:
1. 下载运行配置
2. 更改该配置
3. 上传配置
4. 将上传的配置复制到运行配置(覆盖设备上的活动)

于 2012-02-07T05:59:52.923 回答
1

对于几个 POE 交换机(cisco 和 zyxel),我发现用于操作 POE 状态的 snmp 字符串是

SNMPv2-SMI::mib-2.105.1.1.1.3.1.x 其中 x 是所需的端口(对于 8 端口交换机 1~8 对于 24 端口交换机 1~24 )

提到的 IF-MIB::ifAdminStatus.interface 仅用于启用/禁用端口 - 但主要目标是在具有数十/数百个接入点/VoIP 电话的环境中重置或降低夜间/周末的电力成本,这可以节省大量能源

在端口上停止 POE 的命令是

snmpset -v 2c -c setcomunity 主机 SNMPv2-SMI::mib-2.105.1.1.1.3.1.xi 2

在端口上启动 POE 的命令是

snmpset -v 2c -c setcomunity 主机 SNMPv2-SMI::mib-2.105.1.1.1.3.1.xi 1

如果您使用版本 3,您还需要身份验证

于 2014-09-19T15:43:43.937 回答
0

您可以通过这种方式使用 telnet 程序谷歌“MinimalisticTelnet”并使用示例来理解这个解决方案

另一种方法是使用 SNMP 协议,例如此示例:注意:对于使用 snmp,我得到更改并自定义 SnmpSharpNet 库,并在我的程序中调用它

using SnmpSharpNet;

然后编写此代码以禁用从 1 到 6 的端口:

Console.WriteLine("Ports Disabler ");
            UdpTarget target = new UdpTarget((IPAddress)new IpAddress("192.168.1.200"));
            Pdu pdu = new Pdu(PduType.Set);
            pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.1"), new Integer32(2));
            pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.2"), new Integer32(2));
            pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.3"), new Integer32(2));
            pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.4"), new Integer32(2));
            pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.5"), new Integer32(2));
            pdu.VbList.Add(new Oid("1.3.6.1.2.1.2.2.1.7.6"), new Integer32(2));
            AgentParameters aparam = new AgentParameters(SnmpVersion.Ver2, new OctetString("2645"));
            SnmpV2Packet response;
            try
            {
                // Send request and wait for response
                response = target.Request(pdu, aparam) as SnmpV2Packet;
            }
            catch (Exception ex)
            {
                // If exception happens, it will be returned here
                Console.WriteLine(String.Format("Request failed with exception: {0}", ex.Message));
                target.Close();
                return;
            }
            // Make sure we received a response
            if (response == null)
            {
                Console.WriteLine("Error in sending SNMP request.");
            }
            else
            {
                // Check if we received an SNMP error from the agent
                if (response.Pdu.ErrorStatus != 0)
                {
                    Console.WriteLine(String.Format("SNMP agent returned ErrorStatus {0} on index {1}",
                      response.Pdu.ErrorStatus, response.Pdu.ErrorIndex) + response.ToString());
                }
                else
                {
                    // Everything is ok. Agent will return the new value for the OID we changed
                    Console.WriteLine(String.Format("Agent response {0}: {1}",
                      response.Pdu[0].Oid.ToString(), response.Pdu[0].Value.ToString()));
                }
            }

我希望这个答案是有用的,可以帮助你,

于 2014-03-03T14:55:58.427 回答