LINUX.ORG.RU

Как произвести изменение и выполнение скрипта 'на лету' (без сохранения изменений на ФС)

 


0

1

Здравствуйте

Есть устройство Ubiquiti Bullet M5 с системой AirOS (я предполагаю что на базе openWRT).

XM.v5.5.8# uname -a
Linux Bullet M5 2.6.32.54 #1 Wed Feb 5 18:25:32 EET 2014 mips unknown
Мне необходимо выполнить cgi скрипт через SSH, например, этот (/usr/www/survey.json.cgi), внутри он содержит:
XM.v5.5.8# cat /usr/www/survey.json.cgi
#!/sbin/cgi
<?
include("lib/settings.inc");
if (strlen($iface) == 0) {
        $iface = $wlan_iface;
}
PassThru("iwlist " + EscapeShellCmd($iface) + " scan | " + 
$cmd_scanparser);
>
При этом заменить $wlan_iface на другое значение, например lo. И при этом не сохранять изменённый скрипт. Т.е всё выполнить 'на лету': взять содержимое оригинального скрипта, подправить и выполнить.

Пока что я действую так, на примере данного скрипта:

1) Копирую скрипт в /tmp:

XM.v5.5.8# cp /usr/www/survey.json.cgi /tmp/pseudo_survey.json.cgi
2) Заменяю значения и также приходится менять 'include' пути:
XM.v5.5.8# sed -i 's%lib/settings.inc%/usr/www/lib/settings.inc%g' /tmp/pseudo_survey.json.cgi
XM.v5.5.8# sed -i 's%$wlan_iface%lo%g' /tmp/pseudo_survey.json.cgi
3) Запускаю изменённый скрипт:
XM.v5.5.8# /tmp/pseudo_survey.json.cgi

Мне же необходимо, чтобы без сохранения в /tmp.

1) Я пробовал сохранять всё в переменную:

IFS=""
script=$(sed 's%$wlan_iface%lo%g' /usr/www/survey.json.cgi)
2) И затем как нибудь запустить результат по типу:
/sbin/cgi $script 
(при этом выводит Segmentation fault)

3)Также пытался:

sed 's%$wlan_iface%lo%g' /usr/www/survey.json.cgi | cgi
(при этом выводит: <html><head><title>PHP/FI</title></head><body><h1>PHP/FI Version 2.0.1<....) Но это не то, что ожидается...

Вообщем не могу сообразить как 'на лету' изменить и запустить cgi (без сохранения изменений на файловую систему). Может быть подскажете чего-нибудь (если вообще такое возможно) ?

C Уважением Павел...



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

Если тебя не учили пользоваться pastebin, то хотя бы тег code осиль.

dvrts ★★★
()

Возможно суть в Segmentation fault.

Поэксперементировав, пришёл к выводу (возможно ошибочному), что Linux не может выполнить переменную как cgi-скрипт.

1) Я перенёс код скрипта в переменную:

IFS=""
script=$(cat /usr/www/survey.json.cgi)

2) Затем попытался выполнить эту переменную как cgi-скрипт (внутри визуально код идентичен скрипту /usr/www/survey.json.cgi на ФС):

/sbin/cgi $script
Segmentation fault

Это заканчивается Segmentation fault...

Мб у кого-нибудь есть мысли по этому поводу (мб там изменить рабочую директорию или ещё какие тонкости Linux) в данном контексте (со скриптом и переменной) или то, что я делаю невозможно впринципе (система не может организовать это на лету в памяти и выдаёт Segmentation fault) ?

С Уважением, Павел...

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

Сдается мне, тебе надо просто выполнить

% iwlist lo scan | $cmd_scanparser

- это собственно то, что и делает скрипт. $cmd_scanparser заменить на значение переменной из кода. Или самому распарсить вывод iwlist как надо.

anonymous
()
Ответ на: комментарий от anonymous

Благодарю за сообщение,

Да, согласен с вами - это вариант, я думал об этом. Но суть в том, что я пытаюсь подыскать некий простой (для себя) абстрактный механизм вызова скриптов с необходимыми параметрами. Скрипты разнообразные и разбираться в них занимает много времени у меня (специфика Linux начинается - не силён в Linux). Я просто взаимодействую с устройством (AirOS) из абстрактного уровня C#-приложения (некоторая простая, необходимая логика). Сначала делал по HTTP(S)-GET/POST параметры, затем также полез через SSH (с теми же скриптами работать) - копировал их в /tmp, изменял, запускал.

SSH меня устроило, но подумал, как-то это не оптимально копировать и изменять на ФС (не оптимальный подход), ищу способ изменять, запускать на лету (возможно это и не реализуемо в данном контексте, как я пытаюсь)...

Но, всё же, полностью согласен с вашим подходом, думаю это «Linux-True» подход (оптимальный), но у меня он вызовет большие расходы времени, нежели, если я найду абстрактный механизм взаимодействия со скриптами.

В любом случае, спасибо за ваш совет, я теперь всё болше думаю о том, что придётся вникать глубже, чем просто вызов CGI.

С Благодарностью Павел...

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

Немножко не в тему, но на вскидку, так умеет: erlang, forth, lisp, asm ;)

Можно файлики держать в памяти также.

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