python绑定套接字。错误:[Errno 13]权限被拒绝

python绑定套接字。错误:[Errno 13]权限被拒绝,python,tunnel,Python,Tunnel,我有一个python脚本,它从远程机器获取数据包并编写它们 (os.write(self.tun_fd.fileno(),''.join(packet)))到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

我有一个python脚本,它从远程机器获取数据包并编写它们 (os.write(self.tun_fd.fileno(),''.join(packet)))到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)
我希望通过单独的pong脚本接收这些数据包,如下所示:

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
s.bind((主机、端口))
文件“”,第1行,处于绑定状态
socket.error:[Errno 13]权限被拒绝

您不能作为非特权用户绑定到低于1024的端口号

因此,你应该:

  • 使用大于1024的端口号(推荐)
  • 或者以特权用户身份运行脚本
如果确实需要接受来自111的解决方案,则更难,但更安全:

  • 在较高的端口上以非特权方式运行,并将端口111转发到外部
虽然不是在原始问题中,但只想将其扩展到本地进程间通信的情况,即
AF\u UNIX
。如图7所示:

在Linux实现中,路径名套接字尊重 他们所在的目录。如果 进程在上没有写入和搜索(执行)权限 在其中创建套接字的目录

在Linux上,连接到流套接字对象需要写入 对该套接字的许可;向数据报套接字发送数据报 同样,需要对该套接字具有写权限。POSIX不能使 关于权限对套接字文件的影响的任何语句, 在某些系统(例如,较旧的BSD)上,套接字权限是 忽略。便携式程序不应依赖此功能来执行以下操作: 安全


因此,如果在unix套接字的
bind()
上获得
PermissionError:[Errno 13]权限被拒绝,请查看套接字目录上的权限。

您有什么问题?这一切似乎都是正常的,也是意料之中的。。。你想知道什么?(111是一个特权端口。)我认为这是一个非常好的问题,有完整的代码和错误消息。只是有些事他/她不知道。如果我们假设OP应该什么都知道,那就没有了。我想知道python在哪个端口上写入gr3 tun接口,以便使用pong脚本来监听它。os.write(self.tun_fd.fileno(),''.join(packet))没有指定端口Thank you utdemir,但是我怎么知道我的脚本在哪个端口发送这些数据包,因为我知道他正在写入tun接口gr3,但我不知道在哪个端口。实际上,我不知道如何使用tun接口,这就是
s.bind
错误的答案和解决方案。如果您使用的是Linux服务器,只需将sudo放在命令之前,就可以为我节省大量时间