python绑定socket.error:[Errno 13]权限被拒绝

Posted

技术标签:

【中文标题】python绑定socket.error:[Errno 13]权限被拒绝【英文标题】:python bind socket.error: [Errno 13] Permission denied 【发布时间】:2014-07-22 23:04:18 【问题描述】:

我有一个 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

【问题讨论】:

你有什么问题?这似乎很正常和意料之中......你想知道什么? (111 是一个特权端口。) 我认为这是一个非常好的问题,包含完整的代码和错误消息。只是有些事情他/她不知道。如果我们假设 OP 应该知道一切,那么就不会有 SO。 我想知道我的 python 在哪个端口上写入 gr3 tun 接口,以便使用 pong 脚本收听它。 os.write(self.tun_fd.fileno(), ''.join(packet)) 没有指定端口 【参考方案1】:

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

所以你应该:

使用大于 1024 的端口号(推荐) 或以特权用户身份运行脚本

如果确实需要从 111 接受,则更难但更安全的解决方案:

在更高的端口上以非特权身份运行,并将端口 111 转发到外部。

【讨论】:

谢谢 utdemir 但我怎么知道我的脚本在哪个端口发送这些数据包,因为我知道他正在写入 tun 接口 gr3 但我不知道在哪个端口。 其实我不知道怎么用tun接口,这只是s.bind报错的答案和解决办法。 你今天为我节省了很多时间 如果你使用的是 Linux 服务器,只需在命令前加上 sudo【参考方案2】:

虽然不是在原来的问题中,只是想将其扩展为unix sockets的情况,用于本地进程间通信,即AF_UNIX。如man unix 7

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

在 Linux 上,连接到流套接字对象需要写入 对该套接字的许可;将数据报发送到数据报套接字 同样需要对该套接字的写权限。 POSIX 不做 关于权限对套接字文件的影响的任何声明, 在某些系统(例如,较旧的 BSD)上,套接字权限是 忽略。便携式程序不应依赖此功能 安全。

因此,如果在 bind() 上为 unix 套接字获取 PermissionError: [Errno 13] Permission denied,请查看套接字目录的权限。

【讨论】:

以上是关于python绑定socket.error:[Errno 13]权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

socket.error:[errno 99] 无法在 python 中分配请求的地址和命名空间

python socket.error: [Errno 10061]

python socket.error: [Errno 10054] 解决方法

Python 处理 socket.error:[Errno 104] 连接由对等方重置

python发邮脚本运行每次都报socket.error: [Errno 110] Connection timed out ,用别人的机器也报

Python rpyc“socket.error:[Errno 113]没有到主机的路由”