Intereting Posts
Библиотека SHA-512 для PHP Сравнение даты PHP с полем даты MySQL Как я могу заставить свой PHP-скрипт работать в определенное время каждый день? Запрос SOAP с атрибутом Как установить обычную общую сумму перед оформлением заказа в magento? Что заменить mysql_result для MySQLi как я могу использовать preg_match с буквенно-цифровым и уникодным приемом? Как конвертировать «Y / m / dh: i A» формат даты и времени в метку времени Итерируемые объекты и тип массива намекают? php zipArchive распаковать только определенные расширения База данных MySQL не может запускаться на XAMPP для Mac Это самый эффективный способ получить и удалить первую строку в файле? Как получить параметр и значения строки запроса с помощью javascript (JQuery)? Медленные ответы с использованием API-интерфейса Asana Класс Doctrine \ Common \ Collections \ ArrayCollection не является допустимым сущностью или отображенным суперклассом

php ssh2_exec не выполняет команду su

Мне очень весело с ssh2 для php. (!)

Я тестирую ssh-ing в localhost (работает ubuntu). Мне удалось подключиться и пройти аутентификацию с моим именем пользователя (не root), а некоторые команды (например, «ls» возвращают некоторую информацию, которая является многообещающей.

То, что я хочу сделать дальше, это выдать команду «su», а затем указать пароль root.

Я не получаю сообщение об ошибке, и возвращается ресурс, но в потоке нет данных. (Я вроде как ожидаю приглашение «Пароль:»). Я не могу аутентифицироваться напрямую с помощью пароля root, потому что это отключено для ssh.

Есть ли причина, по которой «su» вернется с некоторым текстом, как вы думаете?

Должен ли я ожидать ответ «Пароль:»?

Вот мой код:

function changeServerPassword( $ip, $port, $sshUser, $sshPassword, $rootPassword, $newRootPassword, $newSSHPassword = false) { // login to server using $sshUser and $sshPassword // su as root and enter $rootPassword // if any of the above steps fail, return with appropriate error message if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist"); // log in // Do I have to make sure that port is a number? if(!($con = ssh2_connect($ip, $port))){ echo "fail: unable to establish connection\n"; } else { // try to authenticate with username root, password secretpassword if(!ssh2_auth_password($con, $sshUser, $sshPassword)) { echo "fail: unable to authenticate\n"; } else { // alright, we're in! echo "okay: logged in...<br />"; // if (!($stream = ssh2_exec($con, "su"))) { echo "fail: unable to execute command\n"; } else { echo $stream."<br />"; // collect returning data from command stream_set_blocking($stream, true); echo "after stream_set_blocking<br />"; $data = ""; while ($buf = fread($stream,4096)) { $data .= $buf; } echo "data len: " . strlen($data) . "<br />"; echo $data."<br />"; fclose($stream); } } } } 

заимствован из http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/ уважения.

Выход, который я получаю:

 okay: logged in... Resource id #3 after stream_set_blocking data len: 0 

Заранее благодарю за любую помощь 🙂

Джо

Вместо этого вы должны попробовать последнюю версию phpclib версии SVN – чистую реализацию PHP SSH . Вот как вы справитесь с этим:

 <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('localhost', 22); $ssh->login('username', 'password'); $ssh->read('[prompt]'); $ssh->write("su - user\n"); $ssh->read('Password:'); $ssh->write("Password\n"); echo $ssh->read('[prompt]'); ?> в <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('localhost', 22); $ssh->login('username', 'password'); $ssh->read('[prompt]'); $ssh->write("su - user\n"); $ssh->read('Password:'); $ssh->write("Password\n"); echo $ssh->read('[prompt]'); ?> 

Возможно, попробуйте что-то вроде bash -c su или su root и bash -c "su root" ?

Все, что вам нужно сделать, это добавить пароль суперпользователя в момент выполнения команды su. Вы можете внести следующие изменения в свой код.

 $cmd = "su"; $cmd = "echo '" . $sshPassword . "' | sudo -S " . $cmd; if (!($stream = ssh2_exec($con, $cmd))) { ... }