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

时间:2014-06-02 18:40:55

标签: 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 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

2 个答案:

答案 0 :(得分:40)

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

所以你应该:

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

更难,但更安全的解决方案,如果真的有必要接受111:

  • 在较高端口上运行as nonrivileged,并在外部将端口111转发给它。

答案 1 :(得分:0)

尽管不是原来的问题,只是想将其扩展到unix sockets的情况以进行本地进程间通信,即AF_UNIX。如man unix 7所示:

在Linux实现中,路径名套接字遵循以下权限: 它们所在的目录。如果 进程没有对的写入和搜索(执行)权限 创建套接字的目录。

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

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