Полезняшки. PHPShell - скрипт php, позволяющий выполнять на веб-сервере shell-команды

October 30, 2007

Недавно на необъятных просторах Интернета я натолкнулся на упоминание о “PHP Shell”. Пару лет назад мне эта утилита очень помогла и я сейчас хочу отдать своеобразный долг ее разработчику Martin Geisler (http://mgeisler.net/).

Каково назначение “PHP Shell”? Я полагаю, что каждый “продвинутый” веб-программист, не говоря тем более о сисадминах, сталкивался и использовал SSH. SSH позволяет нам получить удаленный доступ к серверу и выполнять на нем shell-команды (ну там всякие команды типа ходить по каталогам туда-сюда, вверх-вниз, перемещать, удалять и копировать файлы, запускать сценарии и всякие хитроумные утилитки), как будто бы провод к вашему монитору от системного блока удлинился до невероятных размеров и дошел, аж, до сервера хостера. Надо сказать, что возможно через ssh туннелировать и X-графику, изображение рабочего стола, показывая запущенные оконные приложения, но это явно не для веб-серверов.

Одним словом, в тех случаях, когда средства ftp, или панель управления сайтом (от вашего хостера) не справляются и вам нужна непредусмотренная функция, то вам на выручку придет SSH. В идеальном случае на вашем хостинге есть поддержка ssh и после заключения договора вам пришлют учетные данные для доступа. Затем вы скачиваете putty (самый лучший в мире ssh-клиент доступен по адресу http://www.chiark.greenend.org.uk/~sgtatham/putty/) и, вооружившись учебником по linux-командам, начинаете вредить и разрушать сервер экспериментировать. Самое простое применение – это работа с архивами. Вместо того, чтобы загружать множество мелких файлов с сервера к себе или обратно (как же это долго и утомительно), вы можете создать архив, загрузить его на сервер (скажи спасибо, поддержке ftp-докачки) и распаковать его там используя команду tar (http://linuxportal.vrn.ru/index.php?title=Основные_команды_Linux). Верен и обратный подход. Неплохой способ сэкономить немножко трафика и времени при переносе сайта с хостинга “A” на хостинг “B” это выполнить архивирование собственно документов сайта, а затем с помощью wget или ftp соединиться с удаленной машиной и начать переливать данные без промежуточного выкачивания информации на свою локальную машину. По правде говоря, благодаря FXP – классной технологии позволяющей двум ftp-серверам разговаривать напрямую - (http://ru.wikipedia.org/wiki/FXP) такая хитрость может и не пригодится – но все же. Были случаи, когда мне приходилось создавать dump или восстанавливать из dump-а огромные по размеру базы данных (несколько сотен мегабайт). Естественно, что в этом случае использовать старый добрый phpmyadmin (также являющийся частью джентльменского набора хостера) не возможно. По правде говоря, есть замечательная утилита Sypex Dumper Lite (http://sypex.net/products/dumper/), которая умеет работать с БД гораздо быстрее и стабильнее, и почти всегда она мне помогала. А когда не помогала Sypex Dumper Lite последней инстанцией был прямой доступ к функция shell на удаленной машине. Тогда я запускал mysql клиент или mysqldump и оно работало. Если сфера применения ssh для развертывания и обслуживания веб-приложений вас заинтересовала то можете почитать еще немножко тут http://www.host.ru/support/articles/unix-shell.html

Одним словом, если у вас на хостинге нет SSH, то “что не ладно в датском королевстве”. Минус в том, зачастую SSH по умолчанию на вашем “свежем” сайте отключен, и требуется некоторое время поругаться со службой поддержки, чтобы ssh заработал. Именно так и случилось в тот далекий зимний вечер. Мне нужно было срочно перенести сайт с одной машины на другую, в ходе чего возникли проблемы, и я привычно потянулся к ярлыку putty на рабочем столе, дабы посмотреть что там “внутри” у пациента. Упс..., а поддержка ssh не активирована. Как быть? Если вы достаточно искушены в программировании на каком-то там языке, то не составит сложности написать небольшой скрипт реализующий нужную задачу. Я же открыв google и, пробежавшись по паре ссылок, нашел упоминание о PHP Shell. Одним словом, домой я ушел вовремя.

По правде говоря, мне очень повезло, что хватило тех урезанных возможностей работы с shell, которые предоставила мне PHP Shell - все же это его имитация.

В основе своей PHP Shell использует функцию php - proc_open. Эта функция запускает некоторую команду и открывает потоки ввода-вывода для того чтобы ввести некоторую информацию в приложение (имитируя ручной ввод как бы на клавиатуре) и вывести результаты работы (если вы знаете что такое pipes то речь как раз про них). По сути, функция proc_open является улучшенной и дополненной версией функций exec или system. Те, правда только запускали программу, и не давали возможность взаимодействовать с ней, вы должны были сразу в параметрах командной строки указать все необходимые для работы команды данные. proc_open позволяет создать pipes связанные с вашим php-скиптом, и соответсвенно вы можете имитировать ввод данных в программу и читать результаты ее работы.

Для любителей бесплатных хостингов сразу скажу:

НЕТ, С ПОМОЩЬЮ PHP Shell ВЫ НЕ СМОЖЕТЕ ПОЛУЧИТЬ ДОСТУП К SSH

Дело в том, для бесплатных или очень дешевых хостингов привычно запускать php в режиме safe_mode. В нем отключен ряд функций, в том числе и proc_open.

НЕТ, С ПОМОЩЬЮ PHPSHELL ВЫ НЕ СМОЖЕТЕ РАБОТАТЬ С ИНТЕРАКТИВНЫМИ ПРОГРАММАМИ

Сама суть веб говорит нам, что не возможно запустить на удаленном сервере некоторую программку, которая бы продолжала работу и позволяла бы нам вводить и выводить данные в течении нескольких отдельных http-запросов.

НЕТ, ВЫ НЕ МОЖЕТЕ ПОЛУЧИТЬ ДОСТУП КО ВСЕМ ПРОГРАММАМ, ФАЙЛАМ И ПАПКАМ НА СЕРВЕРЕ

Скрипт работает либо от имени apache и тогда его возможности ограничены лишь тем, что в правах делать учетная запись apache. Либо как вариант если на хостинге используется suexec (http://en.wikipedia.org/wiki/SuEXEC), то ваши права будут совпадать с правами учетной записи от которой идет запуск php-скрипта.

Предположим, что это вас не остановило, и вы загрузили и распаковали архив на своем сервере в папку, скажем, phpshell. Если ввести в адресную строку браузера “как-то-называется-ваш-сайт/phpshell/phpshell.php” то вас попросят представиться, ввести имя и пароль – разумеется это не те учетные данные которые вы получили от вашего хостера (см. рис. 1).



Так что вам нужно настроить права доступа: кто может получить доступ к shell через эту утилиту. Для этого в файле config.php найдите секцию users и добавьте в нее имя пользователя и пароль в следующем виде:
 vasyano=secret
Если вас смущает то что пароль задан в открытом виде то воспользовавшись файлом pwhash.php вы можете узнать свертку md5 пароля и в файле config.php будет храниться именно он (см. рис. 2).



Теперь делаем повторную попытку входа и попадаем в окно, где в нижней части окна вводим команду, жмем “запуск” а затем результат ее выполнения отображается в центре окна страницы (см. рис. 3).



На этом все, может и вам phpshell как-нибудь поможет.