ICMP pinger application in Python - error: operation not permitted?

Braithe Warnock

I am trying to run this ICMP pinger application (Python 2.7). It is giving me this error message.

Traceback (most recent call last): line 125, in ping("www.poly.edu") line 120, in ping delay = doOnePing(dest, timeout) line 104, in doOnePing raise socket.error(msg) error: Operation not permitted

I am not sure what is wrong. Is there something wrong with the code? Or is the code correct and the function is not permitted for other reason?

from socket import *
import os
import sys
import struct
import time
import select
import binascii
import socket

ICMP_ECHO_REQUEST = 8
timeRTT = []
packageSent =0;
packageRev = 0;

def checksum(str):
    csum = 0
    countTo = (len(str) / 2) * 2
    count = 0
    while count < countTo:
        thisVal = ord(str[count+1]) * 256 + ord(str[count])
        csum = csum + thisVal
        csum = csum & 0xffffffffL
        count = count + 2
    if countTo < len(str):
        csum = csum + ord(str[len(str) - 1])
        csum = csum & 0xffffffffL
    csum = (csum >> 16) + (csum & 0xffff)
    csum = csum + (csum >> 16)
    answer = ~csum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer

def receiveOnePing(mySocket, ID, timeout, destAddr):
    global packageRev,timeRTT
    timeLeft = timeout
    while 1:
        startedSelect = time.time()
        whatReady = select.select([mySocket], [], [], timeLeft)
        howLongInSelect = (time.time() - startedSelect)
        if whatReady[0] == []: # Timeout
            return "0: Destination Network Unreachable,"
        timeReceived = time.time()
        recPacket, addr = mySocket.recvfrom(1024)

    #Fill in start
        #Fetch the ICMP header from the IP packet
        icmpHeader = recPacket[20:28]
        requestType, code, revChecksum, revId, revSequence = struct.unpack('bbHHh',icmpHeader)
        if ID == revId:
            bytesInDouble = struct.calcsize('d')
            #struct.calcsize(fmt) Return the size of the struct (and hence of the string) corresponding to the given format.
        #struct.unpack(fmt, buffer[, offset=0]) Unpack the buffer according to the given format. The result is a tuple even if it contains exactly one item. The buffer must contain at least the amount of data required by the format (len(buffer[offset:]) must be at least calcsize(fmt)).
            timeData = struct.unpack('d',recPacket[28:28 + bytesInDouble])[0] 
            timeRTT.append(timeReceived - timeData)
            packageRev += 1
            return timeReceived - timeData
        else:
            return "ID does not match"
        #Fill in end

        timeLeft = timeLeft - howLongInSelect
        if timeLeft <= 0:
            return "1: Request timed out."

def sendOnePing(mySocket, destAddr, ID):
    global packageSent
    # Header is type (8), code (8), checksum (16), id (16), sequence (16)

    myChecksum = 0
    # Make a dummy header with a 0 checksum.
    # struct -- Interpret strings as packed binary data
    header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, myChecksum, ID, 1)
    data = struct.pack("d", time.time())
    # Calculate the checksum on the data and the dummy header.
    myChecksum = checksum(header + data)

    # Get the right checksum, and put in the header
    if sys.platform == 'darwin':
        myChecksum = socket.htons(myChecksum) & 0xffff
        #Convert 16-bit integers from host to network byte order.
    else:
        myChecksum = socket.htons(myChecksum)

    header = struct.pack("bbHHh", ICMP_ECHO_REQUEST, 0, myChecksum, ID, 1)
    packet = header + data

    mySocket.sendto(packet, (destAddr, 1))
    packageSent += 1
    # AF_INET address must be tuple, not str
    #Both LISTS and TUPLES consist of a number of objects
    #which can be referenced by their position number within the object

def doOnePing(destAddr, timeout):
    icmp = socket.getprotobyname("icmp")
    #SOCK_RAW is a powerful socket type. For more details see:http://sock-raw.org/papers/sock_raw

    #Fill in start
    #Create Socket here
    try:
        mySocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
    except socket.error, (errno, msg):
        if errno == 1:
            raise socket.error(msg)
    #Fill in end

    myID = os.getpid() & 0xFFFF  #Return the current process i
    sendOnePing(mySocket, destAddr, myID)
    delay = receiveOnePing(mySocket, myID, timeout, destAddr)
    mySocket.close()
    return delay

def ping(host, timeout=1):
    #timeout=1 means: If one second goes by without a reply from the server,
    dest = socket.gethostbyname(host)
    print "Pinging " + dest + " using Python:"
    print ""
    #Send ping requests to a server separated by approximately one second
    while 1 :
        delay = doOnePing(dest, timeout)
        print "RTT:",delay
        time.sleep(1)# one second
    return delay

ping("www.poly.edu")
mdadm

To use raw_sockets Python needs to run as root. If you run the script via sudo (assuming Linux/UNIX), then it should work. If using windows, run Python as an administrator.

For what it is worth, your code works just fine for me when I ran it as root on a CentOS 6.5 VM.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

ICMP pinger application in Python - error: operation not permitted?

From Dev

Installing rails error: Operation not permitted

From Dev

Installing rails error: Operation not permitted

From Dev

Vagrant Up Error Operation not permitted

From Dev

Bower: Error: EPERM: operation not permitted

From Dev

Cordova error building - EPERM, operation not permitted

From Dev

PhoneGap Error: EPERM: Operation not permitted (windows 10)

From Dev

Operation not permitted error when deleting as root

From Dev

Error: 'Operation not permitted' from both insmod and modprobe

From Dev

Operation not permitted

From Dev

Python - Cannot install requests[security]: Operation not permitted

From Java

warning: Error disabling address space randomization: Operation not permitted

From Java

How to fix "mbind: Operation not permitted" in mysql error log

From Dev

Golang: AppEngine throws operation not permitted error on Get call

From Dev

OSError: [Error 1] Operation not permitted shutil.move

From Dev

rails - paperclip error Errno::EPERM (Operation not permitted @ unlink_internal

From Dev

XDP program ip link error: Prog section rejected: Operation not permitted

From Dev

Rust error "PermissionDenied: Operation Not Permitted" when creating pnet datalink channel

From Dev

Error while trying to start PostgreSQL installed via Homebrew: "Operation not permitted"

From Dev

Git clone: error: chmod on <ntfs mount> failed: Operation not permitted

From Dev

rails - paperclip error Errno::EPERM (Operation not permitted @ unlink_internal

From Dev

guestmount inside a lxd container gives an "Operation not permitted" error

From Dev

Operation not permitted error while trying to install pip modules

From Dev

deleting node_modules, get error EPERM operation not permitted

From Dev

Reject TCP SYN with ICMP error messages in python

From Java

'Operation Not Permitted' on Mac Terminal when trying to install python packages

From Dev

Docker & nginx operation not permitted

From Dev

npm "operation not permitted"

From Dev

React Native Operation Not Permitted

Related Related

  1. 1

    ICMP pinger application in Python - error: operation not permitted?

  2. 2

    Installing rails error: Operation not permitted

  3. 3

    Installing rails error: Operation not permitted

  4. 4

    Vagrant Up Error Operation not permitted

  5. 5

    Bower: Error: EPERM: operation not permitted

  6. 6

    Cordova error building - EPERM, operation not permitted

  7. 7

    PhoneGap Error: EPERM: Operation not permitted (windows 10)

  8. 8

    Operation not permitted error when deleting as root

  9. 9

    Error: 'Operation not permitted' from both insmod and modprobe

  10. 10

    Operation not permitted

  11. 11

    Python - Cannot install requests[security]: Operation not permitted

  12. 12

    warning: Error disabling address space randomization: Operation not permitted

  13. 13

    How to fix "mbind: Operation not permitted" in mysql error log

  14. 14

    Golang: AppEngine throws operation not permitted error on Get call

  15. 15

    OSError: [Error 1] Operation not permitted shutil.move

  16. 16

    rails - paperclip error Errno::EPERM (Operation not permitted @ unlink_internal

  17. 17

    XDP program ip link error: Prog section rejected: Operation not permitted

  18. 18

    Rust error "PermissionDenied: Operation Not Permitted" when creating pnet datalink channel

  19. 19

    Error while trying to start PostgreSQL installed via Homebrew: "Operation not permitted"

  20. 20

    Git clone: error: chmod on <ntfs mount> failed: Operation not permitted

  21. 21

    rails - paperclip error Errno::EPERM (Operation not permitted @ unlink_internal

  22. 22

    guestmount inside a lxd container gives an "Operation not permitted" error

  23. 23

    Operation not permitted error while trying to install pip modules

  24. 24

    deleting node_modules, get error EPERM operation not permitted

  25. 25

    Reject TCP SYN with ICMP error messages in python

  26. 26

    'Operation Not Permitted' on Mac Terminal when trying to install python packages

  27. 27

    Docker & nginx operation not permitted

  28. 28

    npm "operation not permitted"

  29. 29

    React Native Operation Not Permitted

HotTag

Archive