Найти - Пользователи
Полная версия: Подгрузить другой скрипт с сервера и выполнить внутри
Начало » Python для новичков » Подгрузить другой скрипт с сервера и выполнить внутри
1 2 3 4 5 6 7
BossBox
py.user.next
чтобы выполнить скрипт, достаточно его импортироватьt1.py

Нужно выполнить без сохранения на компьютере, загрузить и выполнить.
py.user.next
t2.py
#!/usr/bin/env python3
 
import marshal
 
def decode(data):
    return marshal.loads(data[12:])
 
def main():
    fname = 't1.pyc'
    with open(fname, 'rb') as fin:
        exec(decode(fin.read()))
 
if __name__ == '__main__':
    main()

[guest@localhost t]$ ./t2.py
test
[guest@localhost t]$

что значит 12:
4 - признак
4 - время
4 - размер данных

это из Lib/_bootstrap.py

его там, правда, всё равно надо через import проводить, иначе он не импортирует модули, импортируемые в t1.pyc
sanodin
import urllib
import os
import marshal
urllib.URLopener().retrieve('http://gismetsan.appspot.com/get/1', 'e.pyc')
 
b = open('e.pyc', 'rb').read()
c = marshal.loads(b[8:])
exec c
os.remove('e.pyc')
BossBox
P.S. Python 2.7.3 (!!!)

Пробовал вот так, но не работает:

import urllib
import os
import marshal
urllib.URLopener().retrieve('http://185.20.000.000/', 'server.pyc')
 
b = open('server.pyc', 'rb').read()
c = marshal.loads(b[8:])
exec c
os.remove('server.pyc')

Файл на сервере (server.pyc):

print ' This file is load and EXEC'
py.user.next
t1.py
#!/usr/bin/env python
 
import os
 
def f():
    print 'test', os.getcwd()
 
f()

из него сделал t1.pyc, который положил на сервере

t2.py
#!/usr/bin/env python
 
import marshal
import urllib
import os
 
def decode(data):
    return marshal.loads(data[8:])
 
def main():
    fname = 't1.pyc'
    data = urllib.urlopen('http://localhost/%s' % fname)
    code = decode(data.read())
    data.close()
    exec code
 
if __name__ == '__main__':
    main()

[guest@localhost t]$ ./t2.py 
test /home/guest/tmp/tests/py/t
[guest@localhost t]$

если в t2.py os не импортировать, то он не импортирует его в t1.pyc
BossBox
Да попробовал по вашему примеру, в логе все отобразилось, спасибо.

По поводу модулей, исключительно только из t2 будут вызываться? В t1 не получится их импортировать?
BossBox
sanodin

В логе пусто было. Я написал скрипт который я запускал, если там все верно написано, то он не запустил server.pyc
sanodin
Этот код запустил Hello world но код посложней не захотел у меня запустить
#!/usr/bin/env python
 
import marshal
import urllib
import os
 
def decode(data):
    return marshal.loads(data[8:])
 
def main():
    fname = 't1.pyc'
    data = urllib.urlopen('http://localhost/%s' % fname)
    code = decode(data.read())
    data.close()
    exec code
 
if __name__ == '__main__':
    main()
а этот запустил
import urllib
import marshal
data = urllib.urlopen('http://gismetsan.appspot.com/get/1')
b = data.read()
c = marshal.loads(b[8:])
data.close()
exec c
хотя особой разницы я не заметил, но модули дополнительно я не вызывал, как этого требовалось в предыдущем коде
py.user.next
если закомментировать import os в t2.py
[guest@localhost v2]$ ./t2.py 
test
Traceback (most recent call last):
File "./t2.py", line 18, in <module>
main()
File "./t2.py", line 15, in main
exec code
File "t1.py", line 8, in <module>
File "t1.py", line 6, in f
NameError: global name 'os' is not defined
[guest@localhost v2]$
хотя в t1.py os импортируется

sanodin
а этот запустил
значит, либо там (в загружаемом скрипте) модули не используются, либо они уже импортированы

sanodin
но код посложней не захотел у меня запустить
попробуй t1.pyc на сервере разместить и запустить своим кодом
так как os не импортируется, тот не должен сработать
sanodin
http://gismetsan.appspot.com/get/3000001
вот на сервере разместил ваш t1.pyc, только название b.pyc, разницы нет где файл, на локальном или на сервере.
вот код
import urllib
import marshal
data = urllib.urlopen('http://gismetsan.appspot.com/get/3000001')
 
b = data.read()
c = marshal.loads(b[8:])
data.close()
exec c
нормально отработал,

а этот код обязательно надо было модуль os импортировать, и если другой код на сервере лежал как допустим прога с часами написанная с Tkinter http://gismetsan.appspot.com/get/1 , вылазили другие затыки…да и код не мой, ваш, просто под себя переделываю, потому что у меня он не срабатывал. А так самому интересно, почему так получается..
#!/usr/bin/env python
import marshal
import urllib
#import os
 
def decode(data):
    return marshal.loads(data[8:])
 
def main():
    data = urllib.urlopen('http://gismetsan.appspot.com/get/3000001')
    code = decode(data.read())
    data.close()
    exec code
 
if __name__ == '__main__':
    main()
проверил
OS Windows7
Kali Linux
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB