Comments 69
Putty для в конец обленившихся.
+5
А если ситуация поворачивается к вам 5 точкой?
— Вы отвлеклись по личным делам (кино, клуб, диснейленд)
— Вам позвонили «Есть кое-какие проблемы»
— Под рукой только телефон…
Портить себе время отдыха, лететь домой? или потратить 2-5 минут на выполнение экстренных действий пусть даже и через неудобную клавиатуру?
— Вы отвлеклись по личным делам (кино, клуб, диснейленд)
— Вам позвонили «Есть кое-какие проблемы»
— Под рукой только телефон…
Портить себе время отдыха, лететь домой? или потратить 2-5 минут на выполнение экстренных действий пусть даже и через неудобную клавиатуру?
+1
Ладно телефон, даже если у человека есть только хромбук… ;)
0
Представляете? Есть нищие админы...)
+2
Я на M55 по Midpssh сидел в шелле и использовал mysql на серваке. Но такой вариант тоже удобен. Я хотел написать ssh клиент на сайте, возможно ли это сделать безопасно для всех?
+1
Даже если вы для моего демо-скрипта поставите защиту в виде обычного HTTP-пароля (например с паролем в .htpasswd) это уже будет более-менее :). А если пропустите это через SSL, то получите что-то близкое к SSH по защищенности.
0
не не, мне надо в сервис сделать так чтобы народ мог записывать свои ssh данные серваков, компов и т.д. а потом или в консоли сидеть одним тапом через сайт или через мобильное приложение с синхронизацией работы между ними или получать также доступ к файлам на ssh в один тап.
0
Милое дело брутфорсить эти .htpasswd. Ограничения на число попыток почти нигде нет.
0
В Хромбуке есть SSH. :)
0
Я лично достану свой андроид, в котром есть ssh клиент
+1
А, и еще — народ.диск не самое лучшее место для хранения исходников.
даю подсказку: Github, googleCode, sourceforge.
Апплодисментов не надо, всегда ваш К.О.
даю подсказку: Github, googleCode, sourceforge.
Апплодисментов не надо, всегда ваш К.О.
-7
Это простое демо, я выложу на гитхаб, когда эмулятор будет в нормальном виде, не волнуйтесь :).
+3
Если будете развивать, возможно имеет смысл что-то почерпнуть из phpshell.sourceforge.net/
0
Не хочу быть грубым, но…
Если выполнить команду вроде
$p = proc_open(
$command,
array(1 => array('pipe', 'w'),
2 => array('pipe', 'w')),
$io
);
/* Read output sent to stdout. */
while (!feof($io[1])) {
$line=fgets($io[1]);
if (function_exists('mb_convert_encoding')) {
/* (hopefully) fixes a strange "htmlspecialchars(): Invalid multibyte sequence in argument" error */
$line = mb_convert_encoding($line, 'UTF-8', 'UTF-8');
}
$_SESSION['output'] .= htmlspecialchars($line, ENT_COMPAT, 'UTF-8');
}
/* Read output sent to stderr. */
while (!feof($io[2])) {
$line=fgets($io[2]);
if (function_exists('mb_convert_encoding')) {
/* (hopefully) fixes a strange "htmlspecialchars(): Invalid multibyte sequence in argument" error */
$line = mb_convert_encoding($line, 'UTF-8', 'UTF-8');
}
$_SESSION['output'] .= htmlspecialchars($line, ENT_COMPAT, 'UTF-8');
}
fclose($io[1]);
fclose($io[2]);
proc_close($p);
Если выполнить команду вроде
cat somefile >/dev/stderr
при размере файла somefile больше, скажем, 8 Кб (размер системного буфера I/O), возникнет deadlock и команда никогда не выполнится. Я уж не говорю о том, что человек использует proc_open и вообще игнорирует stdin (нулевой дескриптор). В случае запуска того же vi или любой другой программы, которая что-нибудь выводит пользователю и спрашивает что-нибудь у пользователя, результат выполнения непредсказуем. +1
а зачем вам нужен терминал на пхп??
+2
ssh может не быть, заказчик мог забыть или не знать пароль от него, всякое быть может, а что-то нужно сделать прямо сейчас и сразу, вообщем штука может быть полезной.
-1
Вообще, я делал эмулятор терминала в качестве дополнения к своему файловому менеджеру (тоже на PHP). Отдельно стоящий эмулятор терминала не столь полезен, я согласен. С другой стороны, PHP есть почти везде, поэтому какой-нибудь простенький терминал иметь под рукой, как мне кажется, всегда удобно.
0
у меня на хостинге компилиться не захотело :(
pt.c:7:18: error: util.h: No such file or directory pt.c: In function 'main': pt.c:20: error: storage size of 'winsz' isn't known
pt.c:7:18: error: util.h: No such file or directory pt.c: In function 'main': pt.c:20: error: storage size of 'winsz' isn't known
0
Главное вовремя остановиться, а то начнете оконные приложения на PHP ещё делать
0
Чтобы залить на сторонний сайт )
+7
Наличие сишного файла затрудняет немного, но идея удачная, да.
0
Я уже попробовал c Opera.Mini. Полет нормальный! теперь не нужно мучатся со всякими там ssh-онлайн терминалами с кучей ограничений, капчей и рекламой…
+3
очевидно чтобы выполнить нечто вроде
зачем же еще. Сложно предположить что будет какое-то более практическое применение этому творчеству (с учетом мега-дыр в безопасности которое это творение открывает).
$ php -r "echo 'Hello World';"
зачем же еще. Сложно предположить что будет какое-то более практическое применение этому творчеству (с учетом мега-дыр в безопасности которое это творение открывает).
0
0
Спасибо!
0
СПАСИБО!!!
Возведу у себя на сервере, хоть что-то будет пробиваться сквозь корпоративный прокси…
Возведу у себя на сервере, хоть что-то будет пробиваться сквозь корпоративный прокси…
0
Linux, Mac OS X на стороне сервера (на *BSD не проверял, возможно, требуются доработки)
Mac OS же BSD-based и многие пакеты в ней именно BSD-шные.
0
Хм. Чего то с nginx постоянные Gateway Timeout. Что не так делаю?
0
У вас flush() не работает, как надо (то есть, у вас Apache за nginx с буферизацией вывода) — я это описывал в требованиях :). При желании можно переписать скрипт на long polling и таких проблем не будет.
0
У меня Апача вообще нету
0
В любом случае, дело в том, что flush() не работает. В принципе, он и не сможет никак работать в случае с nginx как FastCGI (или Apache), разве что если вы для соответствующего URL уменьшите размер всех буферов до минимума, скажем, до 10 байт.
0
Хреново, чёрт :( Уменьшение буферов выдаёт 502 ошибку (ему буферов не хватает на заголовки даж), так что не вариант…
0
Сколько там по умолчанию буфер вывода в nginx :)? 8 Кб? Можете добавить перед каждым вызовом flush() вывод комментария (или просто пробелов) такой длиной, чтобы оно как раз эти 8 Кб заполняло. Вы получите очень большой оверхед по трафику, но это должно работать
0
Увы, не помогло. После таймаута или переполнения буфферов он просто кидает на браузер всё что в буфферах и закрывает соединение.
0
Оказывается, эту проблему кто-то уже решал до этого:
stackoverflow.com/questions/4870697/php-flush-that-works-even-in-nginx
Там внизу есть очень полный совет, как заставить flush() работать даже в nginx
stackoverflow.com/questions/4870697/php-flush-that-works-even-in-nginx
Там внизу есть очень полный совет, как заставить flush() работать даже в nginx
+1
Вы про Final Solution?
0
Да
+1
Ого, оно действительно запахало.
0
Я полагаю, это достигается ценой огромного оверхеда по трафику, что, впрочем, должно регулироваться настройкой nginx.
0
О да, оверхед там опупенный. На каждую «альтернативу» flush()-а по 64 килобайта уходит
0
Ойойой, причём при выходе со страницы процесс то теперь не завершается, остаётся в памяти висеть… Чёрт. Плохо. Очень плохо. Мда, терь понятно почему с php терминалами так туго )
0
На самом деле, это не проблема PHP, а проблема моей реализации: я не слежу за состоянием процесса вообще, хотя мог бы. Это именно «демо» того, как можно это написать, нежели полная настоящая реализация, о чём, вроде как, я уже говорил :).
Если бы вы реализовывали то же самое на каком-нибудь mod_python, вас бы ждали те же самые подводные камни, только в python есть встроенная поддержка псевдотерминалов, поэтому отдельные утилиты на Си не требуются.
Если бы вы реализовывали то же самое на каком-нибудь mod_python, вас бы ждали те же самые подводные камни, только в python есть встроенная поддержка псевдотерминалов, поэтому отдельные утилиты на Си не требуются.
0
Да дело не в этом, а в том, что фактически то без своеобразного «демона» реализовать терминал не выйдет. В данном случае «демоном» выступает simple-script.php, поскольку он из-за цикла не завершается, flush-ом передавая результаты. Это имеет определённую логику, но всё ж несколько досадно )
0
Ну почему же, можно, к примеру, добавить какой-нибудь setInterval, который бы раз в 10 секунд «стучался» до сервера и говорил ему, что всё ок. Если в течение 30 секунд не было ни одного такого запроса, значит вкладку закрыли и процесс нужно завершить. В том-то и прикол, что демон у нас уже есть — это веб-сервер, и других не требуется :)
0
Ну как. Изначально запущенный скрипт ДОЛЖЕН оставаться запущенным. В смысле нельзя сделать так, чтоб мы взяли, загрузили — и ВСЕ ресурсы затраченные на загрузку консоли освободились. На каждую команду, скажем, опять таки скрипт запускается — аяксом, ещё чем-либо, неважно — но после чего опять таки ВСЕ ресурсы высвободились бы. Нет, первоначальный php скрипт останется запущенным в любом случае и будет принимать запросы (через тот же пайп файл) от других скриптов — своего рода демон.
Фактически в данном случае первично запущенный php скрипт выполняет роль своеобразного screen-а.
Фактически в данном случае первично запущенный php скрипт выполняет роль своеобразного screen-а.
0
Да, в этом была основная идея, собственно :)
0
Кстати, если интересно, вот мои костыли для nginx-а (в том числе приделал завершение скрипта по таймауту и «пихание» его — путём автопосылки каждые 30 секунд ctrl+c :D)
pastebin.com/aBnFfTgC
Вообще, по хорошему, надо создавать два пайпа — один для передачи непосредственно команд в консоль, а второй — «контролирующий». И делать всё на аяксе, а не через flush.
И ещё — nano надо сказать оч плохо себя ведёт в этой консоли… Но тут видимо уже как то надо править C файл.
pastebin.com/aBnFfTgC
Вообще, по хорошему, надо создавать два пайпа — один для передачи непосредственно команд в консоль, а второй — «контролирующий». И делать всё на аяксе, а не через flush.
И ещё — nano надо сказать оч плохо себя ведёт в этой консоли… Но тут видимо уже как то надо править C файл.
0
Я думаю, что nano и mc себя «плохо ведут» потому, что стрелочки не обрабатываются корректно по какой-то причине (С-файл тут не причём, как мне кажется). Ну и die(), вроде как, это не совсем корректный способ завершить скрипт, хотя, может быть, это и сработает.
На самом деле тут безусловно должно быть больше управляющих пайпов, чем один, и сама утилита для работы с псевдотерминалом тоже должна быть более продвинутой — в данный момент я полностью игнорирую все возможности по работе с терминалами (кроме задания высоты/ширины), которые поддерживаются в этой подсистеме.
Тут много чего нужно сделать, чтобы из этого «демо» получился полноценный терминал, поэтому я и решил дать людям идею, как это можно сделать и показать, что не всё так страшно :)
На самом деле тут безусловно должно быть больше управляющих пайпов, чем один, и сама утилита для работы с псевдотерминалом тоже должна быть более продвинутой — в данный момент я полностью игнорирую все возможности по работе с терминалами (кроме задания высоты/ширины), которые поддерживаются в этой подсистеме.
Тут много чего нужно сделать, чтобы из этого «демо» получился полноценный терминал, поэтому я и решил дать людям идею, как это можно сделать и показать, что не всё так страшно :)
0
Ну почему, die вполне корректно завершает скрипт. Другое дело, что exit считается семантически более верным, но реально они синонимы друг дружки.
0
pastebin.com/xYtYq4R2
Ещё чутка доработал, в частности для Chrome-а, который на бекграундной вкладке обрабатывает setInterval раз в секунду, из-за чего счётчик таймаутный не считался корректно и соединение сбрасывалось. Опять таки для nginx. Опять таки кучи костылей.
Ещё чутка доработал, в частности для Chrome-а, который на бекграундной вкладке обрабатывает setInterval раз в секунду, из-за чего счётчик таймаутный не считался корректно и соединение сбрасывалось. Опять таки для nginx. Опять таки кучи костылей.
0
Ну а вот и версия с двумя пайпами — один контролирующий (пока что он только keep alive запускает), второй — посылает команды в консоль:
simple-shell.php:
pastebin.com/xd7en1WU
send-cmd.php:
pastebin.com/GduraX2h
Адский говнокод, но пашет))
simple-shell.php:
pastebin.com/xd7en1WU
send-cmd.php:
pastebin.com/GduraX2h
Адский говнокод, но пашет))
0
Интересное решение. Вот бы одним файлом такой терминальчик :)
0
Вы на github.com разместили проект терминала? Можно ссылку?
И можно ссылку на псевдотерминал expect?
И можно ссылку на псевдотерминал expect?
0
Почитайте комментарии выше, в них содержится ответ на вопрос по поводу гитхаба. А expect это просто внешняя утилита, ее нужно ставить отдельно, все зависит от дистрибутива
0
Я прочитал сообщение «выложу на гитхаб, когда эмулятор будет в нормальном виде». Подумал что за три года уже много написано и хотел зайти в ваш репозиторий. Разработка остановлена? Я бы непрочь продолжить разработку (для своей программы нужен этот эмулятор).
То что expect внешняя утилита я понял. Вы про эту утилиту: www.nist.gov/el/msid/expect.cfm?
То что expect внешняя утилита я понял. Вы про эту утилиту: www.nist.gov/el/msid/expect.cfm?
0
А, ну я сделал вместо PHP на Go: github.com/YuriyNasretdinov/WebTerm
Да, похоже на правду
То что expect внешняя утилита я понял. Вы про эту утилиту: www.nist.gov/el/msid/expect.cfm?
Да, похоже на правду
0
Sign up to leave a comment.
Пишем простенький веб-эмулятор терминала на PHP