使用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 19 Python
Python列表解析配合if else的方法
Jun 23 Python
Python实现简单的用户交互方法详解
Sep 25 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
Python 实现将某一列设置为str类型
Jul 14 Python
Python基于字典实现switch case函数调用
Jul 22 Python
浅谈python锁与死锁问题
Aug 14 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
Python图像处理之图像拼接
Apr 28 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 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
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP分页类集锦
2014/11/18 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
JavaScript 原型链学习总结
2010/10/29 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
vue实现循环切换动画
2018/10/17 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
Vue中props的详解
2019/05/16 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
17个Python小技巧分享
2015/01/23 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
判断网页编码的方法python版
2016/08/12 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
python实现彩色图转换成灰度图
2019/01/15 Python
Python中extend和append的区别讲解
2019/01/24 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
物流管理毕业生自荐信范文
2014/03/15 职场文书
拉拉队口号
2014/06/16 职场文书
内科护士节演讲稿
2014/09/11 职场文书
2014年团支书工作总结
2014/11/14 职场文书
同乡会致辞
2015/07/30 职场文书
python OpenCV学习笔记
2021/03/31 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python