绑定套接字时权限被拒绝

时间:2012-09-16 01:33:50

标签: python linux sockets

再次来自Running Python server forever。我 将我的文件上传到服务器,但我明白了:

Traceback (most recent call last):
  File "./application", line 42, in <module>
    s.bind((TCP_IP, TCP_PORT))
  File "<string>", line 1, in bind
socket.error: [Errno 13] Permission denied

供您参考,代码在这里:

...

TCP_IP = ''
TCP_PORT = 9090
BUFFER_SIZE = 256

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
while True:
    conn, addr = s.accept()
    ClientThread(conn, addr).start()

当套接字绑定到端口9090(或任何其他端口)时,它只返回此异常。我不需要root,因为port > 1024

我应该改变什么?是TCP_IP还是TCP_PORT中的问题?

〜可能有

3 个答案:

答案 0 :(得分:1)

尝试使用'0.0.0.0'作为绑定地址。在Linux中,这意味着所有接口。

TCP_IP = '0.0.0.0'

确保SELinux被禁用。

答案 1 :(得分:0)

将主机设置为“None”,使其正确绑定到所有适配器接口。

host = None
s.bind((host, TCP_PORT));

参考:http://docs.python.org/library/socket.html

答案 2 :(得分:0)

我建议进一步隔离问题,这意味着你想要使用“应该也能工作”但不是你的代码的东西来重现这个问题。

例如,尝试一个固定(已知工作)HTTP脚本服务器,并观察如果它也失败,那么问题与您发布的Python代码无关。这将使您走上正确的道路......权限。

仅供参考 - 在EC2上我不认为你以root身份登录 - 我的EC2不支持root(它是Ubuntu)。相反,你“sudo”运行命令,同时以你的身份登录。我没有被提示输入sudo密码(尽管有人可能已经在我之前配置了,通过向我的/ etc / sudoers用户或组添加NOPASSWORD = ALL)。

我对EC2的了解是,您在操作系统本身以及Amazon EC2控制面板中都拥有防火墙和权限,并且您可以轻松地遇到权限问题并浪费时间查找错误的位置。

无论如何,确认它的权限不是您的Python代码,然后将此问题带到EC2论坛以获得最佳结果。