我在特殊情况下运行的软件将作为具有root权限的守护程序运行。该软件还将有API,以便普通用户可以访问它,而无需“sudo”每次(API是只读的,只能从本地主机访问)。在
然后浪费一个TCP端口和一个将来可能会被遗忘的随机数TCP端口,我更喜欢使用UNIX套接字,因为它将在Linux上运行。在
我正在使用asyncio模块启动unix_server方法,但在unix socket文件权限方面遇到了问题,因为软件以root权限启动。套接字文件具有“srwxr-xr-x root”权限,除非使用“sudo”,否则我无法连接到此文件。在
我检查start_unix_服务器没有任何更改权限的选项,但有接受socket对象的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)