我正在编写一个cake-shell脚本,它通过ssh连接到服务器,然后转储一些mysql表。
这部分都没问题,并且创建了转储;但是因为我想从中收集转储的主机不止一个,所以文件名中必须有主机。
在这里,奇怪的事情(甚至我的同事和教师都无法解释......)发生了:
有一个名称为$ host的变量,它包含主机的url,这应该是文件名前缀... 但是在GetDump()的第二次调用中......这个变量是空的。
这是我的代码:
use Cake\Console\Shell;
class DatabaseBackupShell extends Shell
{
private $ssh_connection = null;
private $host = null;
public function getOptionParser()
{
$parser = parent::getOptionParser();
return $parser;
}
public function main()
{
$this->host = 'canopus.uberspace.de';
$this->connect($this->host,'22','tsuki','~/.ssh/id_rsa.pub','~/.ssh/id_rsaNOPASSWORD');
$databases = ['tsuki_testdatenbank','tsuki'];
foreach ($databases as $database) {
$this->getDump($database);
}
}
public function connect($ssh_host, $ssh_port, $ssh_auth_user, $ssh_auth_public_key, $ssh_auth_private_key)
{
$this->ssh_connection = ssh2_connect($ssh_host, $ssh_port);
ssh2_auth_pubkey_file($this->ssh_connection, $ssh_auth_user, $ssh_auth_public_key, $ssh_auth_private_key);
echo 'Connected to server '.$ssh_host.' on port '.$ssh_port.' as '.$ssh_auth_user."\n";
}
public function getDump($database)
{
$command = sprintf('mysqldump --add-drop-table --databases %1$s > ~/meep/%2$s__%1$s__%3$s;', $database, $this->host, date("Y-m-d"));
ssh2_exec($this->ssh_connection, $command);
echo $command . "\n";
}
}
这是输出: bin / cake database_backup
Welcome to CakePHP v3.3.8 Console
---------------------------------------------------------------
App : src
Path: /var/www/html/cake-cli/src/
PHP : 7.0.8-0ubuntu0.16.04.3
---------------------------------------------------------------
Connected to server canopus.uberspace.de on port 22 as tsuki
mysqldump --add-drop-table --databases tsuki_testdatenbank > ~/meep/canopus.uberspace.de__tsuki_testdatenbank__2016-11-21;
mysqldump --add-drop-table --databases tsuki > ~/meep/__tsuki__2016-11-21;
如您所见,主机(canopus.uberspace.de)在第二次调用中不存在。 即使我在$ command的分配之前直接重新分配$ host ...它在第二次调用时仍然是空的。
P.S。:ssh2的库通过Linux Mint 18 64bit上的“apt-get install php-ssh2”安装