Удаленный вызов процедур Python (без удаленной части)

У меня есть сервер Python, который не работает от имени root, который выходит за рамки приложения, которое я разрабатываю. Однако есть некоторые функции приложения, которые требуют доступа к сокетам RAW, что означает привилегии root.

Очевидно, что я не хочу запускать главный сервер как root, поэтому мое решение заключается в создании сценария процесса или командной строки, который выполняется как root, обеспечивающий защищенный доступ к указанным функциям.

Однако я хочу отложить связь stdin / stdout и использовать стиль взаимодействия RPC, такой как Pyro . Но это предоставляет интерфейс RPC всем, у кого есть сетевой доступ к машине, тогда как я знаю, что процесс, вызывающий методы RPC, будет другим процессом на том же компьютере.

Разве нет какого-то стандарта вызова процедуры межпроцессного процесса, который можно использовать в аналогичной (только для локальной машины)? Я полагаю, что сервер делает что-то вроде этого:

# Server not running as root pythonically, returned, values = other_process_running_as_root.some_method() 

И процесс, выполняемый как root, выставляет метод:

 # Daemon running as root @expose_this_method def some_method(): # Play with RAW sockets return pythonically, returned, values 

Возможно ли подобное?

3 Solutions collect form web for “Удаленный вызов процедур Python (без удаленной части)”

Следуя моему замечанию, мне было интересно узнать, возможно ли это, поэтому я решил собрать это вместе: https://github.com/takowl/ZeroRPC

Имейте в виду, что это сбрасывается вместе через час или около того, поэтому он почти наверняка уступает любому серьезному решению (например, любые ошибки на стороне сервера будут разбивать его …). Но он работает так, как вы предполагали:

Сервер:

 rpcserver = zerorpc.Server("ipc://myrpc.ipc") @rpcserver.expose def product(a, b): return a * b rpcserver.run() 

Клиент:

 rpcclient = zerorpc.Client("ipc://myrpc.ipc") print(rpcclient.product(5, 7)) rpcclient._stopserver() 

Это непростая задача. Вы должны иметь возможность получить то, что хотите от любого механизма RPC, который может использовать сокеты Unix, или использовать обычные сокеты TCP, но только принимать соединения из интерфейса loopback (слушать 127.0.0.1).

Многопроцессорная библиотека в стандартной библиотеке Python также поддерживает локальный IPC. http://docs.python.org/library/multiprocessing.html#module-multiprocessing.connection

Pyro имеет ряд функций безопасности, специально предназначенных для ограничения доступа к интерфейсу RPC. Это слишком большая работа, чтобы использовать ее?

  • Какой модуль RPC следует использовать для реализации RCP в Python и возможность изменить метод подключения позже?
  • Python - лучший язык программирования в мире.