#python #sockets #client-server
#python #сокеты #клиент-сервер
Вопрос:
итак, я изучаю сокеты, в частности клиент-серверные сети, и у меня возникает вопрос: можно ли отправить функцию через сокеты?
Я знаю, что вы могли бы сделать что-то вроде этого:
#class containing function, called printing_class
print.py
class printing_class(self):
def print(self):
print("hello world")
#server.py
from print import printing_class
print = printing_class(self)
server.send(print) #pseudocode for send statement, sending print object
#client.py
print = client.receive() #pseudo code for print and receive
print.print() # by doing this, prints out hello world
Отправив объект, я мог бы получить доступ к его методам, а затем распечатать его.
Однако мне было интересно, есть ли способ сделать это так:
#server.py
server.send(print("hello world"))
#client.py
client.receive() # when receiving from server, automatically prints it
Можно ли отправить функцию печати через сокеты, и когда клиент ее получит, она автоматически ее распечатает?
Комментарии:
1. Все возможно . Простого способа сделать это нет, и этого никогда не следует делать. Но это возможно, и сервер, который позволил бы это, имел бы серьезную брешь в безопасности и заслуживает уничтожения хакерами 😉
2. О, когда вы так говорите, я действительно понимаю последствия этого сейчас, спасибо за объяснение!
3. FluidLight доказал, что я ошибался в ответе. На самом деле это просто сделать. Что касается безопасности, вы можете (и должны) добавить уровень безопасности, запрещающий кому-либо доступ к серверу…
Ответ №1:
Это может быть достигнуто с помощью библиотеки под названием RPyC.
- Запустите прилагаемый
rpyc_classic.py
скрипт для простого сервера (только для тестирования). - Подключитесь к нему с помощью клиента и отправьте код python, который вы хотите выполнить.
Пример:
import rpyc
c = rpyc.classic.connect("localhost") # connect
c.execute("print('hi there')") # print "hi there" on the host
Одной из многих особенностей rpyc является то, что вы можете ограничить, какие функции (или вы можете определить их самостоятельно) должны выполняться, чтобы не вызывать дыр в безопасности.
Комментарии:
1. Спасибо! Это единственный способ сделать это, или вы можете сделать это без библиотеки?
2. Более простым способом было бы отправить ваш код python на сервер и использовать exec / eval для его выполнения. Но я бы настоятельно не рекомендовал из-за очевидных рисков для безопасности.