Ⅰ python获取系统下打开的端口
第一个问题没啥,用0作为端口那么就会选择本地没有使用的端口。
第二个要么用python序列化的方法,只要对端用反序列化解释就可以。要么用自定义的,借助于struct的pack/unpack,或者如果跟c通讯,用ctypes定义结构体也可以。看你需要了
Ⅱ 关于ping命令
ttl=255为unix
(转)
ping 命令的用法Ping
��Ping是个使用频率极高的实用程序,用于确定本地主机是否能与另一台主机交换(发送与接收)数据报。根据返回的信息,你就可以推断TCP/IP参数是否设置得正确以及运行是否正常。需要注意的是:成功地与另一台主机进行一次或两次数据报交换并不表示TCP/IP配置就是正确的,你必须执行大量的本地主机与远程主机的数据报交换,才能确信TCP/IP的正确性。
��简单的说,Ping就是一个测试程序,如果Ping运行正确,你大体上就可以排除网络访问层、网卡、MODEM的输入输出线路、电缆和路由器等存在的故障,从而减小了问题的范围。但由于可以自定义所发数据报的大小及无休止的高速发送,Ping也被某些别有用心的人作为DDOS(拒绝服务攻击)的工具,前段时间Yahoo就是被黑客利用数百台可以高速接入互联网的电脑连续发送大量Ping数据报而瘫痪的。
��按照缺省设置,Windows上运行的Ping命令发送4个ICMP(网间控制报文协议)回送请求,每个32字节数据,如果一切正常,你应能得到4个回送应答。
��Ping能够以毫秒为单位显示发送回送请求到返回回送应答之间的时间量。如果应答时间短,表示数据报不必通过太多的路由器或网络连接速度比较快。Ping还能显示TTL(Time To Live存在时间)值,你可以通过TTL值推算一下数据包已经通过了多少个路由器:源地点TTL起始值(就是比返回TTL略大的一个2的乘方数)-返回时TTL值。例如,返回TTL值为119,那么可以推算数据报离开源地址的TTL起始值为128,而源地点到目标地点要通过9个路由器网段(128-119);如果返回TTL值为246,TTL起始值就是256,源地点到目标地点要通过9个路由器网段。
通过Ping检测网络故障的典型次序
��正常情况下,当你使用Ping命令来查找问题所在或检验网络运行情况时,你需要使用许多Ping命令,如果所有都运行正确,你就可以相信基本的连通性和配置参数没有问题;如果某些Ping命令出现运行故障,它也可以指明到何处去查找问题。下面就给出一个典型的检测次序及对应的可能故障:
ping 127.0.0.1--这个Ping命令被送到本地计算机的IP软件,该命令永不退出该计算机。如果没有做到这一点,就表示TCP/IP的安装或运行存在某些最基本的问题。
ping 本机IP--这个命令被送到你计算机所配置的IP地址,你的计算机始终都应该对该Ping命令作出应答,如果没有,则表示本地配置或安装存在问题。出现此问题时,局域网用户请断开网络电缆,然后重新发送该命令。如果网线断开后本命令正确,则表示另一台计算机可能配置了相同的IP地址。
ping 局域网内其他IP--这个命令应该离开你的计算机,经过网卡及网络电缆到达其他计算机,再返回。收到回送应答表明本地网络中的网卡和载体运行正确。但如果收到0个回送应答,那么表示子网掩码(进行子网分割时,将IP地址的网络部分与主机部分分开的代码)不正确或网卡配置错误或电缆系统有问题。
ping 网关IP--这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够作出应答。
ping 远程IP--如果收到4个应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问Internet(但不排除ISP的DNS会有问题)。
ping localhost--localhost是个作系统的网络保留名,它是127.0.0.1的别名,每太计算机都应该能够将该名字转换成该地址。如果没有做到这一带内,则表示主机文件(/Windows/host)中存在问题。
ping www.yahoo.com--对这个域名执行Pin ... 地址,通常是通过DNS 服务器 如果这里出现故障,则表示DNS服务器的IP地址配置不正确或DNS服务器有故障(对于拨号上网用户,某些ISP已经不需要设置DNS服务器了)。顺便说一句:你也可以利用该命令实现域名对IP地址的转换功能。
��如果上面所列出的所有Ping命令都能正常运行,那么你对你的计算机进行本地和远程通信的功能基本上就可以放心了。但是,这些命令的成功并不表示你所有的网络配置都没有问题,例如,某些子网掩码错误就可能无法用这些方法检测到。
Ping命令的常用参数选项
ping IP -t--连续对IP地址执行Ping命令,直到被用户以Ctrl+C中断。
ping IP -l 2000--指定Ping命令中的数据长度为2000字节,而不是缺省的32字节。
ping IP -n--执行特定次数的Ping命令。
Netstat ��Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
如果你的计算机有时候接受到的数据报会导致出错数据删除或故障,你不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么你就应该使用Netstat查一查为什么会出现这些情况了。
---------------------
ping的几个常见用法
用了这么久的ping命令,这是我第一次把相关的经验总结写出来,希望大家喜欢。
先来说说ping的工作原理:
ping的过程实际上就是一个发送icmp echo请求的过程,发送该数据包到被ping 的一方,要求对方响应并回答该数据包,对方收到后,当然就老老实实地答复你了,也许大家奇怪,为什么从ping的结果中会得到ip地址,这是因为,对方做出的icmp响应并不能简单地用icmp进行封包就进行传输,而是要经过ip协议进行封装并传输的,学过tcp/ip的人都知道,在ip协议对数据包进行封装的时候,会自动将目的地址和源地址写进包头,这样一来,在回应的信息中我们就可以看到对方的ip地址了 。
一个ping的返回结果:
c:\>ping python
pinging python [192.168.0.2] with 32 bytes of data:
reply from 192.168.0.2: bytes=32 time<10ms ttl=255
reply from 192.168.0.2: bytes=32 time<10ms ttl=255
reply from 192.168.0.2: bytes=32 time<10ms ttl=255
reply from 192.168.0.2: bytes=32 time<10ms ttl=255
ping statistics for 192.168.0.2:
packets: sent = 4, received = 4, lost = 0 (0% loss),
approximate round trip times in milli-seconds:
minimum = 0ms, maximum = 0ms, average = 0ms
从上面这个结果中我们除了获得ip地址,还可以获得ttl(time to life,生命周期),ttl是每经过一个路由器就会被减一的一个值,通过ttl的值我们可以简单地判断对方的操作系统和经过的路由器的个数。
默认情况下ttl=128为windows,而ttl=255为unix
接下来看一下ping的几个参数(这里针对几个比较有用的讲一讲):
options:
-t 加上该参数,就是不断地ping对方,直到按ctrl+c结束
-a 这个参数是解析主机名到ip地址,如下例:
c:\>ping -a 192.168.0.2 -n 1
pinging python [192.168.0.2] with 32 bytes of data:
reply from 192.168.0.2: bytes=32 time<10ms ttl=255
ping statistics for 192.168.0.2:
packets: sent = 1, received = 1, lost = 0 (0% loss),
approximate round trip times in milli-seconds:
minimum = 0ms, maximum = 0ms, average = 0ms
注意看这一行“pinging python [192.168.0.2] with 32 bytes of data:”得到主机名python
注意:这个参数只有在局域网内才起作用的
-n count 这个参数可以定制数据echo请求数据包的发送个数,例如上面,我使用-n 1
-l size 该参数定制发送数据包的大小,windows中最大为65500,命令格式:ping ip -l 65500
默认发送的数据包大小为32bytes
-f 在网络上传输数据的时候,当数据包的大小超过网络的允许大小的时候,就要进行分段, 然而,该参数的作用就是不允许发送的数据包分段。建议不要使用这个,因为,如果不了 解网络对数据包大小的要求的话,设置该位可能会导致数据无法传输,下面两个结果大家 可以比较一下:
例1:
c:\>ping 192.168.0.1 -l 64 -n 1 -f
pinging 192.168.0.1 with 64 bytes of data:
reply from 192.168.0.1: bytes=64 time<10ms ttl=128
ping statistics for 192.168.0.1:
packets: sent = 1, received = 1, lost = 0 (0% loss),
approximate round trip times in milli-seconds:
minimum = 0ms, maximum = 0ms, average = 0ms
例2:
c:\>ping 192.168.0.1 -l 1500 -n 1 -f
pinging 192.168.0.1 with 1500 bytes of data:
packet needs to be fragmented but df set.(这句话的意思就是,网络要求分段,而该数据中的分段位又被 设置为不允许分段,这就导致数据无法传送)
ping statistics for 192.168.0.1:
packets: sent = 1, received = 0, lost = 1 (100% loss),
approximate round trip times in milli-seconds:
minimum = 0ms, maximum = 0ms, average = 0ms
大家有兴趣可以试试,这样多试几次可以试出在你的网络中数据包每段大概被分为多大(不过很辛苦哦)。
-i ttl 这是用来设置生命周期(ttl)的,没什么好说的吧,如果不懂的再问吧
-v tos 设置tos(服务类型)的,对此不多阐述,因为关于tos虽然见的不多,但是,其实是有很 多东西值得讲的,如果多说就说不完了,而且也不好叙述,所以大家看一下相关书籍了解 一下,关于这方面有不懂的再提问吧。
-r count 这个参数很有意思,有点类似tracert了,作用就是记录经过的路由器,拿个例子来:
c:\>ping 192.168.0.1 -r 1 -n 1
pinging 192.168.0.1 with 32 bytes of data:
reply from 192.168.0.1: bytes=32 time<10ms ttl=128
route: 192.168.0.1
ping statistics for 192.168.0.1:
packets: sent = 1, received = 1, lost = 0 (0% loss),
approximate round trip times in milli-seconds:
minimum = 0ms, maximum = 0ms, average = 0ms
注意这一行“route: 192.168.0.1”这就是经过的路由器,因为我这里只有两台计算机,没有路由器,所以记录下来的就是默认路由了(也就是被ping主机本身)。大家可以这样做:ping http://www.sina.com.cn -r 9
会记录经过的9部路由器的地址哦 ……
注意:-r参数后面的值最小为1,最大为9,也就是说,最多只能记录9台(这就不如tracert命令了)。
-w timeout 这个就是用来设置超时的。
c:\>ping 192.168.0.1 -w 1 -n 1
pinging 192.168.0.1 with 32 bytes of data:
reply from 192.168.0.1: bytes=32 time<10ms ttl=128
ping statistics for 192.168.0.1:
packets: sent = 1, received = 1, lost = 0 (0% loss),
approximate round trip times in milli-seconds:
minimum = 0ms, maximum = 0ms, average = 0ms
这个没有什么好说的吧,如果感觉线路不怎么样,传输速度比较慢,那么,把这个值设置得大一些。
注意:该值后面的timeout的单位是毫秒(ms)
死亡之ping (ping of death)
1. 由于在早期的阶段,路由器对包的最大尺寸都有限制,许多操作系统对TCP/IP栈的实现在ICMP包上都是规定64KB,并且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区,当产生畸形的,声称自己的尺寸超过ICMP上限的包也就是加载的尺寸超过64K上限时,就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使接受方当机。
防范措施:
现在所有的标准TCP/IP实现都已实现对付超大尺寸的包,并且大多数防火墙能够自动过滤这些攻击,包括:从windows98之后的windows,NT(service pack 3之后),linux、Solaris、和Mac OS都具有抵抗一般ping of death攻击的能力。此外,对防火墙进行配置,阻断ICMP以及任何未知协议,都能防止此类攻击。
Ⅲ python 如何检查端口是否是被占用
可以尝试用socket去连接相应的端口'成功表明这个端口开放,可能被占用
Ⅳ 如何用python方法检测UDP端口
本文实例讲述了python检测远程udp端口是否打开的方法。分享给大家供大家参考。具体实现方法如下:
复制代码代码如下:
import socket
import threading
import time
import struct
import Queue
queue = Queue.Queue()
def udp_sender(ip,port):
try:
ADDR = (ip,port)
sock_udp = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock_udp.sendto("abcd...",ADDR)
sock_udp.close()
except:
pass
def icmp_receiver(ip,port):
icmp = socket.getprotobyname("icmp")
try:
sock_icmp = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
except socket.error, (errno, msg):
if errno == 1:
# Operation not permitted
msg = msg + (
" - Note that ICMP messages can only be sent from processes"
" running as root."
)
raise socket.error(msg)
raise # raise the original error
sock_icmp.settimeout(3)
try:
recPacket,addr = sock_icmp.recvfrom(64)
except:
queue.put(True)
return
icmpHeader = recPacket[20:28]
icmpPort = int(recPacket.encode('hex')[100:104],16)
head_type, code, checksum, packetID, sequence = struct.unpack(
"bbHHh", icmpHeader
)
sock_icmp.close()
if code == 3 and icmpPort == port and addr[0] == ip:
queue.put(False)
return
def checker_udp(ip,port):
thread_udp = threading.Thread(target=udp_sender,args=(ip,port))
thread_icmp = threading.Thread(target=icmp_receiver,args=(ip,port))
thread_udp.daemon= True
thread_icmp.daemon = True
thread_icmp.start()
time.sleep(0.1)
thread_udp.start()
thread_icmp.join()
thread_udp.join()
return queue.get(False)
if __name__ == '__main__':
import sys
print checker_udp(sys.argv[1],int(sys.argv[2]))
希望本文所述对大家的Python程序设计有所帮助。
Ⅳ Python 实现端口扫描
一、常见端口扫描的原理
0、秘密扫描
秘密扫描是一种不被审计工具所检测的扫描技术。
它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己。
秘密扫描能躲避IDS、防火墙、包过滤器和日志审计,从而获取目标端口的开放或关闭的信息。由于没有包含TCP 3次握手协议的任何部分,所以无法被记录下来,比半连接扫描更为隐蔽。
但是这种扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包。现有的秘密扫描有TCP FIN扫描、TCP ACK扫描、NULL扫描、XMAS扫描和SYN/ACK扫描等。
1、Connect()扫描
此扫描试图与每一个TCP端口进行“三次握手”通信。如果能够成功建立接连,则证明端口开发,否则为关闭。准确度很高,但是最容易被防火墙和IDS检测到,并且在目标主机的日志中会记录大量的连接请求以及错误信息。
TCP connect端口扫描服务端与客户端建立连接成功(目标端口开放)的过程:
① Client端发送SYN;
② Server端返回SYN/ACK,表明端口开放;
③ Client端返回ACK,表明连接已建立;
④ Client端主动断开连接。
建立连接成功(目标端口开放)
TCP connect端口扫描服务端与客户端未建立连接成功(目标端口关闭)过程:
① Client端发送SYN;
② Server端返回RST/ACK,表明端口未开放。
优点:实现简单,对操作者的权限没有严格要求(有些类型的端口扫描需要操作者具有root权限),系统中的任何用户都有权力使用这个调用,而且如果想要得到从目标端口返回banners信息,也只能采用这一方法。
另一优点是扫描速度快。如果对每个目标端口以线性的方式,使用单独的connect()调用,可以通过同时打开多个套接字,从而加速扫描。
缺点:是会在目标主机的日志记录中留下痕迹,易被发现,并且数据包会被过滤掉。目标主机的logs文件会显示一连串的连接和连接出错的服务信息,并且能很快地使它关闭。
2、SYN扫描
扫描器向目标主机的一个端口发送请求连接的SYN包,扫描器在收到SYN/ACK后,不是发送的ACK应答而是发送RST包请求断开连接。这样,三次握手就没有完成,无法建立正常的TCP连接,因此,这次扫描就不会被记录到系统日志中。这种扫描技术一般不会在目标主机上留下扫描痕迹。但是,这种扫描需要有root权限。
·端口开放:(1)Client发送SYN;(2)Server端发送SYN/ACK;(3)Client发送RST断开(只需要前两步就可以判断端口开放)
·端口关闭:(1)Client发送SYN;(2)Server端回复RST(表示端口关闭)
优点:SYN扫描要比TCP Connect()扫描隐蔽一些,SYN仅仅需要发送初始的SYN数据包给目标主机,如果端口开放,则相应SYN-ACK数据包;如果关闭,则响应RST数据包;
3、NULL扫描
反向扫描—-原理是将一个没有设置任何标志位的数据包发送给TCP端口,在正常的通信中至少要设置一个标志位,根据FRC 793的要求,在端口关闭的情况下,若收到一个没有设置标志位的数据字段,那么主机应该舍弃这个分段,并发送一个RST数据包,否则不会响应发起扫描的客户端计算机。也就是说,如果TCP端口处于关闭则响应一个RST数据包,若处于开放则无相应。但是应该知道理由NULL扫描要求所有的主机都符合RFC 793规定,但是windows系统主机不遵从RFC 793标准,且只要收到没有设置任何标志位的数据包时,不管端口是处于开放还是关闭都响应一个RST数据包。但是基于Unix(*nix,如Linux)遵从RFC 793标准,所以可以用NULL扫描。 经过上面的分析,我们知道NULL可以辨别某台主机运行的操作系统是什么操作系统。
端口开放:Client发送Null,server没有响应
端口关闭:(1)Client发送NUll;(2)Server回复RST
说明:Null扫描和前面的TCP Connect()和SYN的判断条件正好相反。在前两种扫描中,有响应数据包的表示端口开放,但在NUll扫描中,收到响应数据包表示端口关闭。反向扫描比前两种隐蔽性高些,当精确度也相对低一些。
用途:判断是否为Windows系统还是Linux。
4、FIN扫描
与NULL有点类似,只是FIN为指示TCP会话结束,在FIN扫描中一个设置了FIN位的数据包被发送后,若响应RST数据包,则表示端口关闭,没有响应则表示开放。此类扫描同样不能准确判断windows系统上端口开发情况。
·端口开放:发送FIN,没有响应
·端口关闭:(1)发送FIN;(2)回复RST
5、ACK扫描
扫描主机向目标主机发送ACK数据包。根据返回的RST数据包有两种方法可以得到端口的信息。方法一是: 若返回的RST数据包的TTL值小于或等于64,则端口开放,反之端口关闭。
6、Xmas-Tree扫描
通过发送带有下列标志位的tcp数据包。
·URG:指示数据时紧急数据,应立即处理。
·PSH:强制将数据压入缓冲区。
·FIN:在结束TCP会话时使用。
正常情况下,三个标志位不能被同时设置,但在此种扫描中可以用来判断哪些端口关闭还是开放,与上面的反向扫描情况相同,依然不能判断windows平台上的端口。
·端口开放:发送URG/PSH/FIN,没有响应
·端口关闭:(1)发送URG/PSH/FIN,没有响应;(2)响应RST
XMAS扫描原理和NULL扫描的类似,将TCP数据包中的ACK、FIN、RST、SYN、URG、PSH标志位置1后发送给目标主机。在目标端口开放的情况下,目标主机将不返回任何信息。
7、Dump扫描
也被称为Idle扫描或反向扫描,在扫描主机时应用了第三方僵尸计算机扫描。由僵尸主机向目标主机发送SYN包。目标主机端口开发时回应SYN|ACK,关闭时返回RST,僵尸主机对SYN|ACK回应RST,对RST不做回应。从僵尸主机上进行扫描时,进行的是一个从本地计算机到僵尸主机的、连续的ping操作。查看僵尸主机返回的Echo响应的ID字段,能确定目标主机上哪些端口是开放的还是关闭的。
二、Python 代码实现
1、利用Python的Socket包中的connect方法,直接对目标IP和端口进行连接并且尝试返回结果,而无需自己构建SYN包。
2、对IP端口进行多线程扫描,注意的是不同的电脑不同的CPU每次最多创建的线程是不一样的,如果创建过多可能会报错,需要根据自己电脑情况修改每次扫描的个数或者将seelp的时间加长都可以。
看完了吗?感觉动手操作一下把!
python学习网,免费的在线学习python平台,欢迎关注!
本文转自:https://www.jianshu.com/p/243bb7cfc40f
Ⅵ python怎样获取连接的IP的设备信息
以前是有这样的工具,它会通过常用协议去刺探设备类型。比如windows的版本,计算机名等。现在不知道还有没有这样的工具,搜索一下看。
哦。这个应该相当容易了。因为相机是专业设备。所以通常会有一个控制协议。因为是专业的,所以这个socket应该是加密的。 你只需要连接上后,随便发一个命令,如果被断开。很可能就是这个相机了。
另外相机通常都是有MAC地址的。如果你发现它在你预计的MAC地址范围内,也可以知道是它。 相机是专业抓拍的。通常不会放在互联网上,应该是局域网。你可以排除局域网上的其它计算机,自然了也就知道哪些是相机了。
这些都不是难题。你首先扫描所有的IP地址。再扫描它们的端口数量。如果端口数量多通常是计算机,如果端口只有1-2个就是专业设备。扫描不到的,应该就是计算机啦。
试试,并不难。