Эмуляции командной строки в PHP в браузере
Я рассматриваю идею браузерной PHP IDE и интересуюсь возможностью эмуляции командной строки через браузер, но я недостаточно знаком с инструментами разработки для CLI, чтобы знать, если это что-то, что можно сделать легко или вообще. Я хотел бы провести еще одно расследование, но пока не смог найти на него много ресурсов.
с высокого уровня мой первый инстинкт-настроить текстовый ввод, который будет подавать команды на PHP скрипт через AJAX и возвращает любой вывод на страницу. Я не достаточно знаком с CLI, чтобы знать, как взаимодействовать с ним в этом контексте.
Мне не нужен фактический код, хотя это тоже было бы полезно, но я ищу больше функций, классов или API, которые я должен исследовать дальше. В идеале я бы предпочел что-то запеченное в PHP (предположим, PHP 5.3), а не стороннюю библиотеку. Как бы вы справились с этим? Существуют ли какие-либо ресурсы или проекты, которые я должен знать о?
редактировать: прецедентом для этого будет localhost или сервер разработки, а не общедоступный сайт.
4 ответов
вызовите эту функцию через RPC или прямой пост из javascript, который делает вещи в этом порядке:
- напишите PHP-код в файл (со случайным именем) в папке (со случайным именем), где он будет сидеть один, выполнять, а затем будет удален в конце выполнения.
- текущий процесс PHP будет не запустить код в этом файле. Вместо этого он должен иметь разрешения exec (safe_mode off).
exec('php -c /path/to/security_tight/php.ini')
(см. php -?) - поймать любую выход и отправить его обратно в браузер. Вы защищены от любых странных ошибок. Вместо exec я рекомендую
popen
таким образом, вы можете убить процесс и вручную контролировать тайм-аут ожидания его завершения (в случае, если вы убьете этот процесс, вы можете легко отправить обратно ошибку в браузер);
вам нужна слабая / нормальная безопасность (такая же, как и весь бэкэнд IDE) для нормального процесса PHP, который запускается при вызове через браузер.
вам нужны строгие и параноидальные безопасность для php.процесс ini и php, который запускает временный скрипт (продолжайте и даже отделите его на другой машине, у которой нет доступа к сети/интернету и ее состояние возвращается на завод каждый час, чтобы быть уверенным).
не используйте eval()
, он не подходит для этого сценария. Злоумышленник может выскочить в ваше приложение и использовать ваши текущие разрешения и состояние переменных против вас.
базовая версия будет
- вы скрипты выводит форму с вводом строки
- действие формы указывает на ваш скрипт
- скрипт принимает ввод в форму и передает его eval
- передать любой вывод из eval в браузер
- снова вывести форму
проблема в том, что определенные функции и переменные теряются между каждым запросом.
вы могли бы добавить каждый строка, введенная в сеанс. Скажем
$inputline = $_GET['line'];
$_SESSION['script'] .= $inputline . PHP_EOL;
eval($_SESSION['script'];
таким образом, на каждом сеансе выполняется полный PHP-скрипт (и, конечно же, вы получите полный вывод).
другой вариант - создать какой-то демон (в основном экземпляр php -a
call), который работает на сервере в фоновом режиме и получает ваш ввод из браузера и передает вывод.
вы можете подключить этот демон к двум устройствам FIFO (одно для ввода и одно для выход) и общаться через простой fopen
.
для каждого пользователя, использующего ваш скрипт, должен быть создан новый процесс демона.
Излишне говорить, что важно защитить свой скрипт от жестокого обращения.
недавно я прочитал о интерпретаторе PHP, написанном на Javascript php.js, чтобы вы могли писать и выполнять PHP-код, используя только свой браузер. Я не уверен, что это то, что вам нужно в конце концов, но это звучит интересно.
мы протестировали некоторые продукты в моем университете для ssh-доступа к нашим лабораторным серверам и использовали некоторые из Web-SSH-Tools - они в основном делают именно то, что вы хотите. The Ракушка-В-Коробке - проект может быть привязан к любому интерпретатору, который вам нравится, и при желании может использоваться с интерактивным php-интерпретатором (на демо-странице они использовали базовый интерпретатор). Проект может служить основой для истинной PHP-IDE. Эти имеют преимущество мочь взаимодействовать с любой консольный редактор (например, vi, emacs или nano), а также возможность давать административные команды (например, создание папок, изменение владельцев или ACLs или перезагрузка службы).
Mozilla также имеет полнофункциональную WEBBASED IDE под названием Беспин, который также очень расширяемый и настраиваемый.
Как вы заявили, что страница не для общественности, Вы, конечно, должны защитить страницу с аутентификацией и SSL для борьбы сеанса.