2014-09-20 2 views
0

Я использую PHPSeclib для доступа к серверу с Докку-альт установлены:Использование phpseclib с оболочкой на заказ оболочки

http://dokku-alt.github.io/how-it-works.html

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

$ssh=$this->connect(); 
    echo trim($ssh->exec("version"); 

Это эквивалентно

ssh [email protected] version 

и работает, как ожидалось. Однако, если я попытаюсь выполнить команду, которая ожидает, что я отправлю данные через STDIN, возникнет проблема. Согласно документации Net_SSH2, мне нужно указать write данные в поток SSH вместо использования exec(). К сожалению, мой следующий пример не работает, потому что пользовательские оболочки не принимает никаких аргументов и отвечает странице справки:

$ssh=$this->connect(); 
    $ssh->write("mysql mariadb:console myapp newdb\n"); 
    $ssh->write("show tables\n"); 
    $ssh->read('[prompt]'); 

Результатом этого является идентичным

ssh [email protected] 

, который просто реагирует с помощью страницы.

Как я могу объединить функциональность «exec» и все еще иметь возможность записывать данные? Что-то вроде этого также не работает:

$ssh=$this->connect(); 
    $ssh->exec("mysql mariadb:console myapp newdb"); 
    $ssh->write("show tables\n"); 
    $ssh->read('[prompt]'); 

Спасибо.

ответ

0

Я думаю, что режим PTY - это то, что вы ищете? например.

$ssh->enablePTY(); 
$ssh->exec('mysql mariadb:console myapp newdb'); 
echo $ssh->read('mysql>'); 
$ssh->write("show tables\n"); 
echo $ssh->read('mysql>'); 

Подробнее:

http://phpseclib.sourceforge.net/ssh/pty.html

+1

здорово! Это сработало по мере необходимости, хотя я пропустил первый read(), а последний read() не имел аргументов. – romaninsh

Смежные вопросы