Python Scapy模块报错19:即使是合法端口也没有设备

2 投票
1 回答
739 浏览
提问于 2025-04-18 01:47

非常抱歉,尽管我已经在网上搜索并查看了StackOverflow的资料,但即使尝试了一些解决办法,我还是遇到了同样的问题。

我有一个Ubuntu主机。在这个主机上,我运行我的Python脚本。这个脚本的一部分是登录到另一个远程的Ubuntu主机(上面运行着scapy 2.2.0),然后执行我的scapy函数,生成一个在特定端口上的单播数据包。

这是我的scapy函数:

def send_scapy(self,port='vintf10',num_frames=10,scale_macs=0):
    '''
    Generates L2 frames(incl Payload) with both Src & Dest MAC == Unicast
    num_frames for each SRC-MAC is sent out. Returns a list of SRC_MAC generated for further verifying in Flow & L2 Tables of VEM
    '''
    src_mac_list = []
    for i in range(num_frames):
              oui = [ 0x00, 0x11, 0x22,
              random.randint(0x00, 0x7f),
              random.randint(0x00, 0xff),
              random.randint(0x00, 0xff) ]
              src_mac = ':'.join(map(lambda x: "%02x" % x, oui))
              src_mac_list.append(src_mac)
    try:
           payload = 'REMOTE REMOTE REMOTE REMOTE REMOTE'
           brcd_log.info ("Payload of the to-be-generated frames = \n%s" % payload)
           brcd_log.info (" SRC MAC LIST  == %s" % src_mac_list)
           for i in range(len(src_mac_list)):
              print "MAC == %s" % src_mac_list[i]
              #sendp(Ether(dst='00:16:17:18:19:20',src=src_mac_list[i])/IP()/payload,iface=port,count = 1)
              pkt = Ether(dst='00:16:17:18:19:20',src=src_mac_list[i])/IP()
              print "PKT == %s" % pkt
              sendp(pkt,iface=port,count = 1)
              brcd_log.info ("Sent Out of Port %s ,1 frame with Unicast Src MAC %s and Unicast Dest MAC 00:16:17:18:19:20" %(port,src_mac_list[i]))


when I run on calling this function as below, the following error comes:
self.remote_kvm = Kvm_Infra(self.vem_2_ip,self.vem2_uname,self.vem2_pwd)
self.remote_kvm.send_scapy() ##

Error:
root@com-node12-36:/home/localadmin# 2014-04-07 22:47:57,520 [INFO] brcd_os - Payload of the to-be-generated frames =
REMOTE REMOTE REMOTE REMOTE REMOTE
2014-04-07 22:47:57,524 [INFO] brcd_os -  SRC MAC LIST  == ['00:11:22:23:bb:88', '00:11:22:5a:e6:b8', '00:11:22:13:70:39', '00:11:22:42:b6:11', '00:11:22:16:a4:ff', '00:11:22:1c:23:88', '00:11:22:3a:3b:b6', '00:11:22:3e:dd:f0', '00:11:22:03:5b:72', '00:11:22:7b:16:d7']
MAC == 00:11:22:23:bb:88
PKT ==  "#»E@
2014-04-07 22:47:57,531 [INFO] brcd_os - Exception Type = <class 'socket.error'>, Exception Object = [Errno 19] No such device

<<<<<<<<<<<

我到底漏掉了什么呢?

当我在本地主机(也就是运行Python脚本的那台机器)调用同样的函数时,它能正常工作。而且在远程主机上,当我手动尝试同样的步骤(也就是函数为同一个有效端口所做的事情)时,它也能正常工作。

1 个回答

0

我觉得问题可能出在与远程主机通信时,传输的值被转换成了unicode格式。比如说,如果用json格式来传输IP地址,那么虽然打印出来的值看起来没什么特别的,甚至和预期的str值比较时一切都正常,但实际上底层的系统可能对unicode的处理不太好。你可以试着打印一下所有传输值的类型,然后把它们再转换回str格式。

撰写回答