Pull to refresh

Comments 69

А если ситуация поворачивается к вам 5 точкой?
— Вы отвлеклись по личным делам (кино, клуб, диснейленд)
— Вам позвонили «Есть кое-какие проблемы»
— Под рукой только телефон…

Портить себе время отдыха, лететь домой? или потратить 2-5 минут на выполнение экстренных действий пусть даже и через неудобную клавиатуру?
Ладно телефон, даже если у человека есть только хромбук… ;)
Представляете? Есть нищие админы...)
Я на M55 по Midpssh сидел в шелле и использовал mysql на серваке. Но такой вариант тоже удобен. Я хотел написать ssh клиент на сайте, возможно ли это сделать безопасно для всех?
Даже если вы для моего демо-скрипта поставите защиту в виде обычного HTTP-пароля (например с паролем в .htpasswd) это уже будет более-менее :). А если пропустите это через SSL, то получите что-то близкое к SSH по защищенности.
не не, мне надо в сервис сделать так чтобы народ мог записывать свои ssh данные серваков, компов и т.д. а потом или в консоли сидеть одним тапом через сайт или через мобильное приложение с синхронизацией работы между ними или получать также доступ к файлам на ssh в один тап.
Если так, то замените запуск bash на запуск ssh с нужными вам параметрами и подправьте send-cmd.php, чтобы она чуть более безопасно работала :). По идее, этого должно быть достаточно для начала
Милое дело брутфорсить эти .htpasswd. Ограничения на число попыток почти нигде нет.
В Хромбуке есть SSH. :)
Я лично достану свой андроид, в котром есть ssh клиент
А, и еще — народ.диск не самое лучшее место для хранения исходников.
даю подсказку: Github, googleCode, sourceforge.

Апплодисментов не надо, всегда ваш К.О.
Это простое демо, я выложу на гитхаб, когда эмулятор будет в нормальном виде, не волнуйтесь :).
Не хочу быть грубым, но…

$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 или любой другой программы, которая что-нибудь выводит пользователю и спрашивает что-нибудь у пользователя, результат выполнения непредсказуем.
ssh может не быть, заказчик мог забыть или не знать пароль от него, всякое быть может, а что-то нужно сделать прямо сейчас и сразу, вообщем штука может быть полезной.
Вообще, я делал эмулятор терминала в качестве дополнения к своему файловому менеджеру (тоже на PHP). Отдельно стоящий эмулятор терминала не столь полезен, я согласен. С другой стороны, PHP есть почти везде, поэтому какой-нибудь простенький терминал иметь под рукой, как мне кажется, всегда удобно.
у меня на хостинге компилиться не захотело :(
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
Ну, утилита для псевдотерминала не является обязательной для работы, и на FreeBSD я не тестировал, возможно там тоже по-другому называется заголовочный файл для forkpty(). Если у вас Linux, то нужно компилировать следующей строчкой:
cc -D__LINUX__ pt.c -o pt -lutil
Главное вовремя остановиться, а то начнете оконные приложения на PHP ещё делать
Чтобы залить на сторонний сайт )
Наличие сишного файла затрудняет немного, но идея удачная, да.
Эта утилита не обязательна для работы веб-шелла (и шелл будет работать без неё), она просто позволяет «нативно» запускать большинство утилит, таких как top, которые в противном случае зачастую отказываются запускаться, ссылаясь на то, что это не терминал.
Я уже попробовал c Opera.Mini. Полет нормальный! теперь не нужно мучатся со всякими там ssh-онлайн терминалами с кучей ограничений, капчей и рекламой…
Я бы побоялся онлайн ssh-терминала, тем более с рекламой:)
иногда ситуация ставит в тупик… =( ничего уже тут не поделаешь
угу… я его дом труба шатал, теперь по крайней мере))
очевидно чтобы выполнить нечто вроде

$ php -r "echo 'Hello World';"

зачем же еще. Сложно предположить что будет какое-то более практическое применение этому творчеству (с учетом мега-дыр в безопасности которое это творение открывает).
СПАСИБО!!!

Возведу у себя на сервере, хоть что-то будет пробиваться сквозь корпоративный прокси…
Linux, Mac OS X на стороне сервера (на *BSD не проверял, возможно, требуются доработки)

Mac OS же BSD-based и многие пакеты в ней именно BSD-шные.
Я использовал нестандартную функцию forkpty, которая определяется в различных заголовочных файлах в Linux, FreeBSD и Mac OS X, как оказалось :)
Хм. Чего то с nginx постоянные Gateway Timeout. Что не так делаю?
У вас flush() не работает, как надо (то есть, у вас Apache за nginx с буферизацией вывода) — я это описывал в требованиях :). При желании можно переписать скрипт на long polling и таких проблем не будет.
У меня Апача вообще нету
В любом случае, дело в том, что flush() не работает. В принципе, он и не сможет никак работать в случае с nginx как FastCGI (или Apache), разве что если вы для соответствующего URL уменьшите размер всех буферов до минимума, скажем, до 10 байт.
Хреново, чёрт :( Уменьшение буферов выдаёт 502 ошибку (ему буферов не хватает на заголовки даж), так что не вариант…
Сколько там по умолчанию буфер вывода в nginx :)? 8 Кб? Можете добавить перед каждым вызовом flush() вывод комментария (или просто пробелов) такой длиной, чтобы оно как раз эти 8 Кб заполняло. Вы получите очень большой оверхед по трафику, но это должно работать
Увы, не помогло. После таймаута или переполнения буфферов он просто кидает на браузер всё что в буфферах и закрывает соединение.
Ого, оно действительно запахало.
Я полагаю, это достигается ценой огромного оверхеда по трафику, что, впрочем, должно регулироваться настройкой nginx.
О да, оверхед там опупенный. На каждую «альтернативу» flush()-а по 64 килобайта уходит
Ойойой, причём при выходе со страницы процесс то теперь не завершается, остаётся в памяти висеть… Чёрт. Плохо. Очень плохо. Мда, терь понятно почему с php терминалами так туго )
На самом деле, это не проблема PHP, а проблема моей реализации: я не слежу за состоянием процесса вообще, хотя мог бы. Это именно «демо» того, как можно это написать, нежели полная настоящая реализация, о чём, вроде как, я уже говорил :).
Если бы вы реализовывали то же самое на каком-нибудь mod_python, вас бы ждали те же самые подводные камни, только в python есть встроенная поддержка псевдотерминалов, поэтому отдельные утилиты на Си не требуются.
Да дело не в этом, а в том, что фактически то без своеобразного «демона» реализовать терминал не выйдет. В данном случае «демоном» выступает simple-script.php, поскольку он из-за цикла не завершается, flush-ом передавая результаты. Это имеет определённую логику, но всё ж несколько досадно )
Ну почему же, можно, к примеру, добавить какой-нибудь setInterval, который бы раз в 10 секунд «стучался» до сервера и говорил ему, что всё ок. Если в течение 30 секунд не было ни одного такого запроса, значит вкладку закрыли и процесс нужно завершить. В том-то и прикол, что демон у нас уже есть — это веб-сервер, и других не требуется :)
Ну как. Изначально запущенный скрипт ДОЛЖЕН оставаться запущенным. В смысле нельзя сделать так, чтоб мы взяли, загрузили — и ВСЕ ресурсы затраченные на загрузку консоли освободились. На каждую команду, скажем, опять таки скрипт запускается — аяксом, ещё чем-либо, неважно — но после чего опять таки ВСЕ ресурсы высвободились бы. Нет, первоначальный php скрипт останется запущенным в любом случае и будет принимать запросы (через тот же пайп файл) от других скриптов — своего рода демон.

Фактически в данном случае первично запущенный php скрипт выполняет роль своеобразного screen-а.
Да, в этом была основная идея, собственно :)
Кстати, если интересно, вот мои костыли для nginx-а (в том числе приделал завершение скрипта по таймауту и «пихание» его — путём автопосылки каждые 30 секунд ctrl+c :D)

pastebin.com/aBnFfTgC

Вообще, по хорошему, надо создавать два пайпа — один для передачи непосредственно команд в консоль, а второй — «контролирующий». И делать всё на аяксе, а не через flush.

И ещё — nano надо сказать оч плохо себя ведёт в этой консоли… Но тут видимо уже как то надо править C файл.
Я думаю, что nano и mc себя «плохо ведут» потому, что стрелочки не обрабатываются корректно по какой-то причине (С-файл тут не причём, как мне кажется). Ну и die(), вроде как, это не совсем корректный способ завершить скрипт, хотя, может быть, это и сработает.

На самом деле тут безусловно должно быть больше управляющих пайпов, чем один, и сама утилита для работы с псевдотерминалом тоже должна быть более продвинутой — в данный момент я полностью игнорирую все возможности по работе с терминалами (кроме задания высоты/ширины), которые поддерживаются в этой подсистеме.

Тут много чего нужно сделать, чтобы из этого «демо» получился полноценный терминал, поэтому я и решил дать людям идею, как это можно сделать и показать, что не всё так страшно :)
Ну почему, die вполне корректно завершает скрипт. Другое дело, что exit считается семантически более верным, но реально они синонимы друг дружки.
pastebin.com/xYtYq4R2

Ещё чутка доработал, в частности для Chrome-а, который на бекграундной вкладке обрабатывает setInterval раз в секунду, из-за чего счётчик таймаутный не считался корректно и соединение сбрасывалось. Опять таки для nginx. Опять таки кучи костылей.
Ну а вот и версия с двумя пайпами — один контролирующий (пока что он только keep alive запускает), второй — посылает команды в консоль:

simple-shell.php:
pastebin.com/xd7en1WU

send-cmd.php:
pastebin.com/GduraX2h

Адский говнокод, но пашет))
В огнелисе адски тормозит, ну тут вообще переделывать над многое.
Статья про внедрение на сайт уязвимости. Надо только вместо Terminal хотя бы Terminal by somebody version 1.3 так гораздо проще вычислять по запросу intitle: в гугле сказочных программистов. Ну и для поддержания темы дам интересную ссылку (для тех кто знает что делает!).
Интересное решение. Вот бы одним файлом такой терминальчик :)
Рома, ты ведь понимаешь, что никаких проблем с тем, чтобы объединить это всё в один файл, нет :)
UFO just landed and posted this here
Вы на github.com разместили проект терминала? Можно ссылку?
И можно ссылку на псевдотерминал expect?
Почитайте комментарии выше, в них содержится ответ на вопрос по поводу гитхаба. А expect это просто внешняя утилита, ее нужно ставить отдельно, все зависит от дистрибутива
Я прочитал сообщение «выложу на гитхаб, когда эмулятор будет в нормальном виде». Подумал что за три года уже много написано и хотел зайти в ваш репозиторий. Разработка остановлена? Я бы непрочь продолжить разработку (для своей программы нужен этот эмулятор).

То что expect внешняя утилита я понял. Вы про эту утилиту: www.nist.gov/el/msid/expect.cfm?
Sign up to leave a comment.

Articles