Intereting Posts
Как создать файл CSV с помощью PHP (и загрузить его) Как собрать фрагменты HTML в DOMDocument? Сертификат peer не может быть аутентифицирован с помощью известных сертификатов CA с использованием расширения PHP OAuth есть ли способ отлаживать HTTP-запрос через приложение Android в eclipse? PDO извлекает один столбец из таблицы в одномерный массив Как использовать глобальный тип пространства имен, намекающий внутри класса с именами в PHP 5.3+? Проверьте, имеют ли два массива одинаковые значения Команда exec () не работает Изменение функций сериализации в PHP для Memcached Должен ли я использовать подготовленные инструкции для MySQL в PHP PERFORMANCE-WISE? Могу ли я безопасно хранить имя пользователя и пароль в переменных сеанса PHP? Как получить определенное значение из моей базы данных с помощью PHP Ошибка PHP APC Загрузка apc.so Автоматическое обновление таблицы Html каждые x секунд Не удается установить date.timezone В файле php.ini

взаимодействие proc_open

Вот что я пытаюсь достичь: откройте оболочку (korn или bash, не имеет значения), из этой оболочки, я хочу открыть ssh-соединение ( ssh user@host ). В какой-то момент это, скорее всего, произойдет. Мне будет предложено ввести пароль, или меня могут спросить, действительно ли я хочу подключиться (оскорбительные клавиши).

Прежде чем кто-нибудь спросит: да, я знаю, что есть плагин для вызовов exec ssh2, но серверы, над которыми я работаю, не поддерживают его, и вряд ли это сделают.

Вот что я пробовал до сих пор:

 $desc = array(array('pipe','r'),array('pipe','w'));//used in all example code $p = proc_open('ssh user@host',$desc,$pipes); if(!is_resource($p)){ die('@!#$%');}//will omit this line from now on sleep(1);//omitting this,too but it's there every time I need it 

Затем я попытался прочитать вывод консоли ( stream_get_contents($pipes[1]) ), чтобы увидеть, что мне нужно передать дальше (с паролем, да или возвратом 'connection failed: '.stream_get_contents($pipes[1]) и proc_close $ p ,

Это дало мне следующую ошибку:

Псевдотерминал не будет выделен, потому что stdin не является терминалом.

Итак, я, хотя ssh был вызван в контексте php:// io-stream, кажется правдоподобным объяснением вышеприведенной ошибки.

Далее: Я, хотя о моем первом SO-вопросе и решил, что было бы неплохо открыть оболочку bash / ksh:

 $p = proc_open('bash',$desc,$pipes); 

И возьмите это оттуда, но я получил то же самое сообщение об ошибке, только на этот раз сценарий остановился, но ssh действительно запустился. Поэтому я получил надежду, потом почувствовал себя глупо и, в конце концов, отчаянно:

 $p=proc_open('bash && ssh user@host',$desc,$pipes); 

После нескольких секунд ожидания, я получил следующую ошибку:

PHP Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан (пытался выделить 133693440 байт)

Вызов Stack продолжает поднимать строку stream_get_contents, даже в моей последней отчаянной попытке:

 #!/path/to/bin/php -n <?php $p = proc_open('bash && ssh user@host',array(array('pipe','r'),array('pipe','w')),$ps); if (!is_resource($p)) { die('FFS'); } usleep(10); fwrite($ps[0],'yes'."\n"); fflush($ps[0]); usleep(20); fwrite($ps[0],'password'."\n"); fflush($ps[0]); usleep(20); fwrite($ps[0],'whoami'."\n"); fflush($ps[0]); usleep(2); $msg = stream_get_contents($ps[1]); fwrite($ps[0],'exit'."\n"); fclose($ps[0]); fclose($ps[1]); proc_close($p); ?> 

Я знаю, это беспорядок, много fflush и избыточности, но дело в том, что я знаю, что это соединение сначала подскажет мне оскорбительные ключи, а затем спросит пароль. Мое предположение – поток в $ pipes [1] содержит ssh-соединение, поэтому он является огромным. то, что мне нужно, это труба внутри трубы … это даже возможно? Мне, должно быть, что-то не хватает, что хорошего в трубе, если это невозможно … Моя догадка заключается в том, что команда proc_open неверна для начала (ошибка: Broken pipe). Но я действительно не вижу другого пути вокруг первой ошибки … никаких мыслей? Или последующие вопросы, если вышеупомянутый разглагольствование не совсем ясен (чего, вероятно, нет).

Прежде чем кто-нибудь спросит: да, я знаю, что есть плагин для вызовов exec ssh2, но серверы, над которыми я работаю, не поддерживают его, и вряд ли это сделают.

На самом деле их два. Модуль PECL, который является PITA, который большинство серверов не установлено в любом случае, и phpseclib, чистая реализация PHP SSH2 . Пример его использования:

 <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('www.domain.tld'); if (!$ssh->login('username', 'password')) { exit('Login Failed'); } echo $ssh->exec('pwd'); echo $ssh->exec('ls -la'); ?> в <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('www.domain.tld'); if (!$ssh->login('username', 'password')) { exit('Login Failed'); } echo $ssh->exec('pwd'); echo $ssh->exec('ls -la'); ?>