Удаленный вызов процедур Python (без удаленной части) - PullRequest
4 голосов
/ 21 января 2011

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

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

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

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

# 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 ]

3 голосов
/ 22 января 2011

После моего комментария мне было интересно посмотреть, возможно ли это, поэтому я попытался соединить это вместе: 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()
2 голосов
/ 22 января 2011

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

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

0 голосов
/ 21 января 2011

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

...