Мне очень весело с 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))) { ... }