LINUX.ORG.RU

Выполнение произвольного кода в Ruby


0

1

Добрый день, помогите мне со следующим вопросом:

Есть ли возможность в Ruby выполнить произвольный код?

или же может я не правильно задаю архитектуру программы?

у меня есть один головной скрипт, который генерит вторичный, в первом скрипте у меня есть

Hash {"условие1"=>"Код1", "условие2"=>"Код2", ... , "условиеN"=>"КодN"}
Второй скрипт выполняет какой-то код по условию. Есть вариант нафигарить кучу def с уникальным и идентификатором и запускать их по условию, либо заставить ruby выполнять самому свой код из кэша hash[«условиеN»]. Как можно реализовать такую схему?



Последнее исправление: Bobrius (всего исправлений: 1)

Мне кажется, что функции придумали как раз для этого, а ты предлагаешь черт-те что.

S-Mage ★★
()
Ответ на: комментарий от S-Mage

в моем случае это будет правильней использовать, как мне кажется.

Первый скрипт - помощник формирования 2-го скрипта и если я буду генирить тысячи функций, а пользователь будет использовать только одну с парой строчкой кода, по времени будет совсем непродуктивно

Bobrius
() автор топика

И кстати, очень похоже на программу с опциями. Так что посмотри на optionParser еще. И ни в коем случае не делай так, как ты написал в ОП-посте, но интерпретатор руби на руби - eval.

S-Mage ★★
()

1.9.3p392 :001 > cmd = «ls /»

=> «ls /»

1.9.3p392 :003 > `#{cmd}`

=> «bin\nboot\ncdrom\ndev\netc\nhome\ninitrd.img\ninitrd.img.old\nlib\nlib64\nlost+found\nmedia\nmnt\nnonexistent\nopt\nproc\nroot\nrun\nsbin\nselinux\nsrv\nsys\ntmp\nusr\nvar\nvmlinuz\nvmlinuz.old\n»

1.9.3p392 :005 > %x[#{cmd}] => «bin\nboot\ncdrom\ndev\netc\nhome\ninitrd.img\ninitrd.img.old\nlib\nlib64\nlost+found\nmedia\nmnt\nnonexistent\nopt\nproc\nroot\nrun\nsbin\nselinux\nsrv\nsys\ntmp\nusr\nvar\nvmlinuz\nvmlinuz.old\n»

Вот только, где гарантия, что в твоей строке не будет rm -rf?

Alve ★★★★★
()
Ответ на: комментарий от S-Mage

Ты когда-нибудь работал с 1С? система похожа. Упрощенным и ограниченным языком описываются объекты и дальше с ними идет работа в самой программе.

То есть в первом скрипте формируем псевдо язык:

таблица = создать таблицу
таблица.при_нажатии_кнопки_записать("p 'сейчас запишем' \n таблица.call_write() ")

а второй скрипт уже должен знать, что при выполнении таблица.записать() (уже по нажатию кнопки) у нас должен вызываться код «p 'сейчас запишем' \n таблица.call_write() »

Надеюсь я все правильно описал и не запутал тебя)

Bobrius
() автор топика
Ответ на: комментарий от encyrtid

ага, именно eval и хотел, но понимаю что с таким инструментом надо быть осторожно, чтоб не уйти в спагетти код

Bobrius
() автор топика
Ответ на: комментарий от S-Mage

так вот объектов таблица может быть около 100000 и у каждого сотни действий. И делать для каждого объекта каждое действие достаточно ресурсоемкое, если будет использоваться около 0.01% действий

Bobrius
() автор топика

Решето!

Заголовок звучит как новость об свеженайденной уязвимости в Ruby

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.