sudo с libssh2

<?php
$ssh = ssh2_connect('domain.tld'); 
ssh2_auth_password($ssh, 'username', 'password');

$shell = ssh2_shell($ssh);
echo fread($shell, 1024*1024);
fwrite($shell, "sudo ls -la\n");
$output = fread($shell, 1024*1024);
echo $output;
if (preg_match('#[pP]assword[^:]*:#', $output)) {
    fwrite($shell, "password\n");
    echo fread($shell, 1024*1024);
}

Все, что делает, это отображает баннер и подсказку. На самом деле он не дает мне вывода команды ls -la. На phpseclib все работает нормально.

Любые идеи?


person Community    schedule 13.01.2013    source источник
comment
Что вы пробовали для отладки? Например, вы проверяли, спрашивается ли пароль?   -  person kokx    schedule 14.01.2013
comment
да. Мое собственное тестирование подтверждает то, что говорится в документации по sudo. Вы вводите пароль, и он кешируется на некоторое время (5 минут). Вот почему я выгружаю вывод в строку. Я вывожу строку, и если она запрашивает пароль, я предоставляю ей пароль и снова запрашиваю вывод. И это не работает. Прекрасно работает с phpseclib - альтернативной библиотекой SSH2, как отмечалось в моем исходном сообщении.   -  person    schedule 14.01.2013


Ответы (1)


Я написал оболочку SSH (https://github.com/bubba-h57/PHP-SSH2), чтобы облегчить выполнение многих моих собственных сценариев PHP, которые требуют подключения по SSH к удаленным серверам, и довольно часто сталкиваюсь с этой проблемой.

Я решил это с помощью этого заклинания:

echo <password> | sudo -S <command>

Что для вас может выглядеть так:

fwrite($shell, "echo $mySudoPassword | sudo -S ls -la\n");

Я просто передаю пароль каждый раз, когда использую sudo, независимо от того, нужен он мне или нет.

Используя мою собственную оболочку, это выглядит так:

require_once 'SSH2.php';
// Test Unix
$username = 'someuser';
$password = 'somepwd';
$host = 'somenixhost.com';
$port = 22;
$ssh2 = new My_SSH2($host, $port);
$ssh2->authPassword( $username, $password);
$ssh2->setPrompt(':~#'); // Set initial expected prompt
$ssh2->openShell();
$ssh2->setPrompt("MYCUSTOMSSHPROMPT> "); // Create a unique, easily found prompt
$ssh2->exec("PS1='MYCUSTOMSSHPROMPT> '"); // Execute the command.
echo $ssh2->exec('cd /var/www') . "\n";   // Change directories.
echo $ssh2->exec("echo $password | sudo -S ls -la\n") . "\n"; // Print LS
echo "\n===================Begin History=============\n";
echo $ssh2->getHistory();
$ssh2->disconnect();
echo "\n===================end=============\n";
exit;
person bubba    schedule 27.03.2013
comment
Хммм - не думал о выходе. Я предполагаю, что меня больше интересует, хотя это не хитрые уловки, которые можно сделать в оболочке - меня больше интересует, как libssh2 можно использовать для взаимодействия с подсказками, не относящимися к оболочке. Может быть, лучший пример - passwd. Вам будет предложено трижды. Один раз для текущего pw и два раза для нового. Я не думаю, что ты сможешь втянуться в это. Конечно, поскольку я предложил награду за вопрос, который мне не принадлежит, и поскольку мне, вероятно, придется сильно отредактировать исходный вопрос, чтобы лучше отразить то, что я хочу знать ... да ладно :( - person neubert; 28.03.2013
comment
И тут я подумал, что выиграю легкую награду! ;-) В общем, PHP / libssh2 просто не будет хорошо взаимодействовать с подсказками, не относящимися к оболочке, и я не нашел никаких способов сделать то, что вы, кажется, просите, без умных трюков, которые можно было бы сделать в оболочке. В примере с passwd я бы использовал libssh2 для передачи ожидаемого сценария на удаленный хост, затем выполнял сценарий и затем удалял сценарий. - person bubba; 28.03.2013
comment
Ну, я думаю, ты все равно можешь выиграть, лол. У нас есть несколько дней, чтобы разобраться в этом, лол. И я думаю, что использовать phpseclib достаточно просто, но я пытаюсь понять, можно ли это сделать с помощью libssh2, чтобы лучше сравнить / сопоставить их. - person neubert; 28.03.2013