使用Python测试Ping主机IP和某端口是否开放的实例


Posted in Python onDecember 17, 2019

使用Python方法

比用各种命令方便,可以设置超时时间,到底通不通,端口是否开放一眼能看出来。

命令和返回

完整权限,可以ping通,端口开放,结果如下:

使用Python测试Ping主机IP和某端口是否开放的实例

无root权限(省略了ping),端口开放,结果如下:

使用Python测试Ping主机IP和某端口是否开放的实例

完整权限,可以ping通,远端端口关闭,结果如下:

使用Python测试Ping主机IP和某端口是否开放的实例

完整权限,可以ping通,本地端口关闭,结果如下:

使用Python测试Ping主机IP和某端口是否开放的实例

完整权限,不能ping通(端口自然也无法访问),结果如下:

使用Python测试Ping主机IP和某端口是否开放的实例

pnp.py代码

#!/usr/bin/python
#name pnp.py
#ping and port
#coding:utf-8

import os, sys, socket, struct, select, time
ICMP_ECHO_REQUEST = 8 # Seems to be the same on Solaris.
socket.setdefaulttimeout(4)

#first argument
host=sys.argv[1]

#second argument
port=int(sys.argv[2])

#socket try connect

def PortOpen(ip,port):
 print( '\033[1m*Port\033[0m %s:%d' %(ip,port)),
 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

 try:
  s.connect((ip,port))
  s.shutdown(2)
  print( '\033[1;32m.... is OK.\033[0m' ) 
  return True

 except socket.timeout:
  print( '\033[1;33m.... is down or network time out!!!\033[0m' ) 
  return False
  			
 except:

  print( '\033[1;31m.... is down!!!\033[0m' ) 
  return False

def checksum(source_string):
 """
 I'm not too confident that this is right but testing seems
 to suggest that it gives the same answers as in_cksum in ping.c
 """
 sum = 0
 countTo = (len(source_string)/2)*2
 count = 0
 while count<countTo:
 thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])
 sum = sum + thisVal
 sum = sum & 0xffffffff # Necessary?
 count = count + 2
 if countTo<len(source_string):
 sum = sum + ord(source_string[len(source_string) - 1])
 sum = sum & 0xffffffff # Necessary?
 sum = (sum >> 16) + (sum & 0xffff)
 sum = sum + (sum >> 16)
 answer = ~sum
 answer = answer & 0xffff
 # Swap bytes. Bugger me if I know why.
 answer = answer >> 8 | (answer << 8 & 0xff00)
 return answer
def receive_one_ping(my_socket, ID, timeout):
 """
 receive the ping from the socket.
 """
 timeLeft = timeout
 while True:
 startedSelect = time.time()
 whatReady = select.select([my_socket], [], [], timeLeft)
 howLongInSelect = (time.time() - startedSelect)
 if whatReady[0] == []: # Timeout
  return
 timeReceived = time.time()
 recPacket, addr = my_socket.recvfrom(1024)
 icmpHeader = recPacket[20:28]
 type, code, checksum, packetID, sequence = struct.unpack(
  "bbHHh", icmpHeader
 )
 if packetID == ID:
  bytesInDouble = struct.calcsize("d")
  timeSent = struct.unpack("d", recPacket[28:28 + bytesInDouble])[0]
  return timeReceived - timeSent
 timeLeft = timeLeft - howLongInSelect
 if timeLeft <= 0:
  return
def send_one_ping(my_socket, dest_addr, ID):
 """
 Send one ping to the given >dest_addr<.
 """
 dest_addr = socket.gethostbyname(dest_addr)
 # Header is type (8), code (8), checksum (16), id (16), sequence (16)
 my_checksum = 0
 # Make a dummy heder with a 0 checksum.
 header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, my_checksum, ID, 1) 
 #a1 = struct.unpack("bbHHh",header) #my test
 bytesInDouble = struct.calcsize("d")
 data = (192 - bytesInDouble) * "Q"
 data = struct.pack("d", time.time()) + data
 # Calculate the checksum on the data and the dummy header.
 my_checksum = checksum(header + data)
 # Now that we have the right checksum, we put that in. It's just easier
 # to make up a new header than to stuff it into the dummy.
 header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, socket.htons(my_checksum), ID, 1)
 packet = header + data
 my_socket.sendto(packet, (dest_addr, 1)) # Don't know about the 1
def do_one(dest_addr, timeout):
 """
 Returns either the delay (in seconds) or none on timeout.
 """
 delay=None
 icmp = socket.getprotobyname("icmp")
 try:
 my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
 my_ID = os.getpid() & 0xFFFF
 send_one_ping(my_socket, dest_addr, my_ID)
 delay = receive_one_ping(my_socket, my_ID, timeout)
 my_socket.close()
 except socket.error, (errno, msg):
 if errno == 1:
  # Operation not permitted
  msg = msg + (
  " - not root."
  )
  raise socket.error(msg)
 #raise # raise the original error
 return delay
def verbose_ping(dest_addr, timeout = 2, count = 100):
 """
 Send >count< ping to >dest_addr< with the given >timeout< and display
 the result.
 """
 for i in xrange(count):
 print "\033[1m*Ping\033[0m %s ..." % dest_addr,
 try:
  delay = do_one(dest_addr, timeout)
 except socket.error, e:
  print "\033[1;31m... failed. (%s)" % e
  break
 if delay == None:
  print "\033[1;31m... failed. (timeout within %ssec.)\033[0m" % timeout
 else:
  delay = delay * 1000
  print "\033[1;32m... get ping in %0.4fms\033[0m" % delay

if __name__ == '__main__':
 if os.geteuid() == 0:
 verbose_ping(host,2,3)
 else:
 	print "\033[1m*Ping\033[0m test must be sudo or root..."
 PortOpen(host,port)
 print( 'Job finished.')

使用命令方法

使用命令ping就不说了,端口可以用下面的命令。

当时目前telnet基本不用,可能没有telnet客户端了。

测试通常连接不上会等很久,端口连上了也需要通过反馈内容自行判断。

telnet

telnet ip port
$telnet 192.168.234.1
Trying 192.168.234.1...
Connected to 192.168.234.1.
Escape character is '^]'.
......

wget

wget ip:port
$wget 192.168.234.1:21
--2019-03-22 15:42:27-- http://192.168.234.1:21/
正在连接 192.168.234.1:21... 已连接。
已发出 HTTP 请求,正在等待回应... 200 没有 HTTP 头,尝试 HTTP/0.9
长度:未指定
正在保存至: “index.html”
......

SSH

ssh -v ip -p port
$ssh -v 192.168.234.1 -p 21
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to 192.168.234.1 [192.168.234.1] port 21.
debug1: Connection established.
......

curl

culr ip:port
$curl 192.168.234.1:21
220 Serv-U FTP Server v15.1 ready...
530 Not logged in.
......

以上这篇使用Python测试Ping主机IP和某端口是否开放的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用win32com库播放mp3文件的方法
May 30 Python
使用python遍历指定城市的一周气温
Mar 31 Python
python中logging库的使用总结
Oct 18 Python
Python实现一个简单的验证码程序
Nov 03 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
Python面向对象程序设计示例小结
Jan 30 Python
Pytorch转tflite方式
May 25 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
Jun 03 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
Jun 17 Python
python list的index()和find()的实现
Nov 16 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 Python
基于Django实现日志记录报错信息
Dec 17 #Python
python实现12306登录并保存cookie的方法示例
Dec 17 #Python
Django多进程滚动日志问题解决方案
Dec 17 #Python
python django中8000端口被占用的解决
Dec 17 #Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 #Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 #Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 #Python
You might like
dedecms模板标签代码官方参考
2007/03/17 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
设定php简写功能的方法
2019/11/28 PHP
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
大学系主任推荐信范文
2013/12/24 职场文书
政府信息公开实施方案
2014/05/09 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
如何撰写创业策划书
2019/06/27 职场文书