1. ホーム
  2. python

[解決済み] python bind socket.error: [Errno 13] パーミッションが拒否されました

2022-02-08 11:56:38

質問

リモートマシンからパケットを取得し、それを書き込むpythonスクリプトがあります。 (os.write(self.tun_fd.fileno(), ''.join(packet))) をチューンインターフェース 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)

そのパケットを以下のように別のポンスクリプトで受信したいと思います。

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()

私はこのエラーを得た。

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

解決方法は?

非特権ユーザーで1024より小さいポート番号にバインドできません。

だから、あなたはどちらかでなければなりません。

  • 1024以上のポート番号を使用する(推奨)
  • または特権ユーザーでスクリプトを実行する

111から受け入れることが本当に必要な場合は、より困難ですが、より安全なソリューションです。

  • より高いポートで非特権として実行し、ポート111を外部に転送する。