gpt4 book ai didi

python3 asyncio start_unix_server 权限

转载 作者:行者123 更新时间:2023-12-01 09:03:47 25 4
gpt4 key购买 nike

由于特殊情况我运行的软件将作为具有 root 权限的守护进程运行。该软件还将具有 API,以便普通用户每次都可以访问它而无需“sudo”(API 是只读的,只能从 localhost 访问)。

然后用随机数 TCP 端口浪费一个将来可能会忘记的 TCP 端口,我更喜欢使用 UNIX 套接字,因为它将在 Linux 上运行。

我正在使用 asyncio 模块来 start_unix_server 方法,但我在 Unix 套接字文件权限方面遇到问题,因为软件以 root 权限启动,套接字文件具有“srwxr-xr-x root root”权限除非使用“sudo”,否则我无法连接到该文件。

我检查 start_unix_server 没有任何更改权限的选项,但具有接受套接字对象的 sock 参数。所以这就是我所做的并成功了,但不确定这是否是为了这样做

import socket
import asyncio

async def handler(reader, writer):
message = data.decode()
addr = writer.get_extra_info('peername')
print("Received %r from %r" % (message, addr))

print("Send: %r" % message)
writer.write(data)
await writer.drain()

print("Close the client socket")
writer.close()

socket_file = "/tmp/example-server.socket"
if os.path.exists(socket_file):
os.remove(socket_file)

srv = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
srv.bind(socket_file)

#Here we set the file permission after bind
os.chmod(socket_file, 0o666)

loop = asyncio.get_event_loop()

#Here we pass the socket object to asyncio
asyncio.ensure_future(asyncio.start_unix_server(handler, sock=s))

try:
loop.run_forever()
except:
pass
finally:
loop.close()
os.remove(socket_file)

最佳答案

为了避免创建自己的套接字,您可以使用 start_unix_serverpath 参数(记录在其较低级别的相关 create_unix_server 下):

loop = asyncio.get_event_loop()

socket_file = "/tmp/example-server.socket"
if os.path.exists(socket_file):
os.remove(socket_file)
loop.run_until_complete(
asyncio.start_unix_server(handler, path=socket_file))
os.chmod(socket_file, 0o666)
loop.run_forever()
# ...

另一个选择是使用 umask ,但需要注意的是,umask 会影响进程中的所有线程,因此,如果您有可以创建文件的后台线程,它们可能会受到 umask 更改的影响。

关于python3 asyncio start_unix_server 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com