спасибо за сообщение. Я использую PostgreSQL
вместо MySQL
, поэтому внес некоторые корректировки. Некоторые из них могут иметь отношение к MySQL
.
1) когда shell_exec'ing, перенаправить вывод на /dev/null
и запустить в фоновом режиме. Также порты изменились с 3306/3307
на 5432/5433
shell_exec("ssh -i {$config['rsa']} {$config['remote_username']}@{$config['remote_ip']} -L5433:{$config['host']}:5432 -N > /dev/null &")
2) FarAwayPostgres.php
следующего
<?php
App::uses('Postgres', 'Model/Datasource/Database');
class FarAwayPostgres extends Postgres {
public $description = "Postgres over SSH";
protected $_baseConfig = array(
'persistent' => true,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'cake',
'port' => '5432',
'rsa' => '',
'remote_username' => '',
'remote_ip' => '',
'sslmode' => 'allow',
'schema' => 'public',
'flags' => array()
);
protected $_connection = null;
protected $_useAlias = true;
public function connect() {
$config = $this->config;
$this->connected = false;
$flags = $config['flags'] + array(
PDO::ATTR_PERSISTENT => $config['persistent'],
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
try {
if (empty($config['unix_socket'])) {
$dsn = "pgsql:host={$config['host']};port={$config['port']};dbname={$config['database']};sslmode={$config['sslmode']}";
} else {
$dsn = "pgsql:unix_socket={$config['unix_socket']};dbname={$config['database']}";
}
$this->_connection = new PDO($dsn, $config['login'], $config['password'], $flags);
$this->connected = true;
} catch (PDOException $e) {
$cmd="ssh -i {$config['rsa']} {$config['remote_username']}@{$config['remote_ip']} -L5433:{$config['host']}:5432 -N > /dev/null &";
shell_exec($cmd);
sleep(3);
}
try {
if (empty($config['unix_socket'])) {
$dsn = "pgsql:host={$config['host']};port={$config['port']};dbname={$config['database']};sslmode={$config['sslmode']}";
} else {
$dsn = "pgsql:unix_socket={$config['unix_socket']};dbname={$config['database']}";
}
$this->_connection = new PDO($dsn, $config['login'], $config['password'], $flags);
$this->connected = true;
} catch (PDOException $e) {
throw new MissingConnectionException(array(
'class' => get_class($this),
'message' => $e->getMessage()
));
}
return $this->connected;
}
}
Обратите внимание, как три второго сон был вставлен так, что попытка подключения к базе данных ожидает SSH, чтобы закончить.
Наконец, database.php
:
<?php
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'Database/FarAwayPostgres',
'persistent' => false,
'host' => 'localhost',
'port' => '5433',
'login' => 'postgres',
'password' => '',
'database' => 'remote_db',
'rsa' => '/var/www/.ssh/id_rsa',
'remote_username' => 'root',
'remote_ip' => 'remote_server',
'prefix' => '',
'encoding' => 'utf8',
);
Закрытый ключ id_rsa
сидит в домашней директории Apache и может быть прочитан Apache.
Теперь, наконец, перед использованием, выполните следующие действия:
su -m apache
ssh -i /var/www/.ssh/id_rsa [email protected]_server
для обновления known_hosts
.