Уведомления

Группа в Telegram: @pythonsu

#1 Май 1, 2014 02:08:20

BossBox
Зарегистрирован: 2014-02-23
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

py.user.next
чтобы выполнить скрипт, достаточно его импортироватьt1.py

Нужно выполнить без сохранения на компьютере, загрузить и выполнить.

Офлайн

#2 Май 1, 2014 03:43:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

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



Отредактировано py.user.next (Май 1, 2014 03:49:17)

Офлайн

#3 Май 1, 2014 09:20:58

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

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')

Отредактировано sanodin (Май 1, 2014 11:08:31)

Офлайн

#4 Май 1, 2014 11:26:11

BossBox
Зарегистрирован: 2014-02-23
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

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'

Отредактировано BossBox (Май 1, 2014 15:26:40)

Офлайн

#5 Май 1, 2014 12:07:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

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



Отредактировано py.user.next (Май 1, 2014 12:12:15)

Офлайн

#6 Май 1, 2014 12:29:18

BossBox
Зарегистрирован: 2014-02-23
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

Да попробовал по вашему примеру, в логе все отобразилось, спасибо.

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

Отредактировано BossBox (Май 1, 2014 12:45:07)

Офлайн

#7 Май 1, 2014 12:46:57

BossBox
Зарегистрирован: 2014-02-23
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

sanodin

В логе пусто было. Я написал скрипт который я запускал, если там все верно написано, то он не запустил server.pyc

Офлайн

#8 Май 1, 2014 12:59:13

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

Этот код запустил 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
хотя особой разницы я не заметил, но модули дополнительно я не вызывал, как этого требовалось в предыдущем коде

Отредактировано sanodin (Май 1, 2014 14:24:54)

Офлайн

#9 Май 1, 2014 18:13:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

если закомментировать 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 не импортируется, тот не должен сработать



Офлайн

#10 Май 1, 2014 18:56:51

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Подгрузить другой скрипт с сервера и выполнить внутри

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

Отредактировано sanodin (Май 1, 2014 20:49:05)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version