使用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中的面向对象编程详解(下)
Apr 13 Python
Python变量作用范围实例分析
Jul 07 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
Python Socket使用实例
Dec 18 Python
解决pycharm运行出错,代码正确结果不显示的问题
Nov 30 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
Python应用领域和就业形势分析总结
May 14 Python
python分割一个文本为多个文本的方法
Jul 22 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
Django如何批量创建Model
Sep 01 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
深入PHP autoload机制的详解
2013/06/09 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
python搜索指定目录的方法
2015/04/29 Python
用python写测试数据文件过程解析
2019/09/25 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
应聘编辑职位自荐信范文
2014/01/05 职场文书
服务口号大全
2014/06/11 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
六一儿童节标语
2014/10/08 职场文书
文明班级申报材料
2014/12/24 职场文书
校长一岗双责责任书
2015/05/09 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript