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 ,用别人的机器也报