使用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将多个excel表格合并为一个表格
Feb 22 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
python处理“
Jun 10 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
如何使用Python抓取网页tag操作
Feb 14 Python
解决python运行效率不高的问题
Jul 20 Python
python实现每天自动签到领积分的示例代码
Aug 18 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
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
Vue精简版风格概述
2018/01/30 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
[02:43]DOTA2英雄基础教程 半人马战行者
2014/01/13 DOTA
Python文件操作类操作实例详解
2014/07/11 Python
一个超级简单的python web程序
2014/09/11 Python
python元组操作实例解析
2014/09/23 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
python tkinter控件布局项目实例
2019/11/04 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
公民授权委托书范本
2014/09/17 职场文书
小学生作文评语集锦
2014/12/25 职场文书
python中的random模块和相关函数详解
2022/04/22 Python