web-dev-qa-db-fra.com

python bind socket.error: [Errno 13] Autorisation refusée

J'ai un script python qui récupère les paquets d'une machine distante et les écrit (os.write (self.tun_fd.fileno (), '' .join (packet))) sur une interface tun gr3:

Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
inet addr:10.0.0.6  P-t-P:10.0.0.8  Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
RX packets:61 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500 
RX bytes:5124 (5.0 KiB)  TX bytes:0 (0.0 b)

Je souhaite recevoir ces paquets via un script pong séparé comme suit:

import threading, os, sys, fcntl, struct, socket
from fcntl import ioctl
from packet import Packet

Host = '10.0.0.6'
PORT = 111
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((Host, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    else: print data    
    conn.sendall(data)
conn.close()

J'ai eu cette erreur:

s.bind((Host, PORT))
File "<string>", line 1, in bind
socket.error: [Errno 13] Permission denied
15
NELOUNI

Vous ne pouvez pas vous lier à des numéros de port inférieurs à 1024 en tant qu'utilisateur non privilégié.

Vous devez donc:

  • Utilisez un numéro de port supérieur à 1024 (recommandé)
  • Ou exécutez le script en tant qu'utilisateur privilégié

Solution plus dure, mais plus sécurisée s'il est vraiment nécessaire d'accepter à partir de 111:

  • Exécutez le en tant que non privilégié sur un port supérieur et transférez le port 111 en externe.
41
utdemir