Вот что я пытаюсь достичь: откройте оболочку (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'); ?>