Вопрос по ssh, pipe, php, proc-open – взаимодействие proc_open

2

Вот что я пытаюсь достичь: открыть оболочку (korn или bash, это не имеет значения), из этой оболочки я хочу открыть ssh-соединение (ssh [email protected]). В какой-то момент может случиться так, что мне будет предложено ввести пароль, или меня спросят, уверен ли я, что хочу подключиться (неправильные ключи).

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

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

<code>$desc = array(array('pipe','r'),array('pipe','w'));//used in all example code
$p = proc_open('ssh [email protected]',$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
</code>

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

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

Pseudo-terminal will not be allocated because stdin is not a terminal.

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

Далее: я думал омой первый ТАК вопрос и решил, что было бы неплохо сначала открыть оболочку bash / ksh:

<code>$p = proc_open('bash',$desc,$pipes);
</code>

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

<code>$p=proc_open('bash && ssh [email protected]',$desc,$pipes);
</code>

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

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 133693440 bytes)

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

<code>#!/path/to/bin/php -n
<?php
    $p = proc_open('bash && ssh [email protected]',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);
?>
</code>

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

Ваш Ответ

1   ответ
1

Before anyone asks: yes, I am aware there is a plugin for ssh2 exec calls, but the servers I'm working on don't support it, and are unlikely to do so.

На самом деле их два. Модуль 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');
?>
Была сделка, сделанная три дня назад для его репозитория SVN, и автор вчера сделал сообщение, помогающее кому-то. Я думаю, что целью библиотеки является совместимость с PHP4 и PHP5. Использование private / public вместо var делает код только PHP5, но на самом деле многое не добавляет imho.
Спасибо ... глупо с моей стороны не тратить 5 минут больше на проверку sourceforge. Я все еще немного волнуюсь по поводу последовательных звонков, хотя ... но, эй, я доберусь до этого. еще раз спасибо Elias Van Ootegem
Попробуйте $ ssh-> gt; read () и $ ssh-> gt; write (). Вот пример того, как сделать это с помощью sudo:phpseclib.sourceforge.net/documentation/net.html#net_ssh_sudo
Спасибо, интересная библиотека, хотя мне интересно: она все еще поддерживается? Судя по коду, я бы сказал, что он написан с учетом PHP4, а первой паре посещений Google уже более года ... Тем не менее, я попробую. Если это работает, это работает, и я сообщу вам Elias Van Ootegem
Извините, хотя эта библиотека хороша, взаимодействие с процессами на удаленном хосте все еще не слишком хорошо, не так ли?$ssh->exec('su'); например, зависнет, потому что я не могу найти способ передать пароль. Elias Van Ootegem

Похожие вопросы