使用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代码解决RenderView窗口not found问题
Aug 28 Python
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
在pycharm中显示python画的图方法
Aug 31 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
Python爬虫如何破解JS加密的Cookie
Nov 19 Python
在终端启动Python时报错的解决方案
Nov 20 Python
python库sklearn常用操作
Aug 23 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
如何给phpadmin一个保护
2006/10/09 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
php7性能提升的原因详解
2019/10/13 PHP
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
Python md5与sha1加密算法用法分析
2017/07/14 Python
django的csrf实现过程详解
2019/07/26 Python
QML使用Python的函数过程解析
2019/09/26 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
pytorch实现查看当前学习率
2020/06/24 Python
python实现简单遗传算法
2020/09/18 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
八一建军节演讲稿
2014/09/10 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记