PHP: ssh2: Как подключиться ко второму серверу ssh

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

Итак, мои шаги:

ssh [email protected]

тогда при подключении в serverdomain1 я делаю в терминале:

ssh [email protected]

в php я пытался использовать ssh2_exec (‘ssh serverdomain2.com’); но нет результатов. Затем я попробовал также ss2_tunnel ($ соединение, …). но ничего не получалось.

Это не работает:

$ssh = ssh2_connect('serverdomain1.com', 22);
if (ssh2_auth_password($ssh, $user,$pass)) {
$stream = ssh_exec($ssh, "ssh serverdomain2.com");

stream_set_blocking($stream, true);
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
echo stream_get_contents($stream_out);    // <== doesn't work!!!
}

Это также не работает:

$ssh = ssh2_connect('serverdomain1.com', 22);
if (ssh2_auth_password($ssh, $user,$pass)) {
$tunnel = ssh2_tunnel($ssh, 'serverdomain2.com', 22);

if (!$tunnel) {
echo('no tunnel<br/>');
}
else {
fwrite($tunnel, "echo 1\n");
while (!feof($tunnel)) {
echo fgets($tunnel, 128);
}
}
}

Результат эха для туннеля:
«SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.4 Несоответствие протокола.»

Как я могу сделать это с SSH2 из PHP?

2

Решение

Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash через SSH, если это необходимо. Получи это здесь: https://github.com/merlinthemagic/MTS

Проект позволяет вам отскакивать от сервера к серверу, используя ssh.

После загрузки вы просто используете следующий код:

//first you get a shell on the first server:
$shellObj = \MTS\Factories::getDevices()->getRemoteHost('ip_address1')->setConnectionDetail('username1', 'password1')->getShell();

//then build on that first shell, the following way.
\MTS\Factories::getDevices()->getRemoteHost('ip_address2')->setConnectionDetail('username2', 'password2')->getShell($shellObj);//any command executed on the shell will run only on the second host you connected to.
$return1  = $shellObj->exeCmd("hostname");
echo $return1;//hostname of the second host you connected to

//

1

Другие решения

  1. Убедитесь, что на вашем сервере установлены библиотеки RSSH, PECL, SSH2
  2. Вы можете проверить это с помощью phpinfo

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

<?php
$host = 'SERVER_HOST_ADDR';
$port = SERVER_PORT;
$username = 'SERVER_USERNAME';
$password = 'SERVER_PASSWORD';
$remoteDir = './home/'; //DIR_PATH
$localDir = '/var/www/html/';        //LOCAL_DIR_PATH

// Make our connection
$connection = ssh2_connect($host);

// Authenticate
if (!ssh2_auth_password($connection, $username, $password)) {
throw new Exception('Unable to connect.');
}

// Create our SFTP resource
if (!$sftp = ssh2_sftp($connection)) {
throw new Exception('Unable to create SFTP connection.');
}

/**
* Now that we have our SFTP resource, we can open a directory resource
* to get us a list of files. Here we will use the $sftp resource in
* our address string as I previously mentioned since our ssh2://
* protocol allows it.
*/
$files = array();
$dirHandle = opendir("ssh2.sftp://$sftp/$remoteDir");

// Properly scan through the directory for files, ignoring directory indexes (. & ..)
while (false !== ($file = readdir($dirHandle))) {
if ($file != '.' && $file != '..') {
$files[] = $file;
}
}
echo "<pre>";print_r($files);
?>
0

По вопросам рекламы [email protected]