使用phpseclib将mysql gzipped备份下载到本地系统

时间:2014-10-12 14:30:04

标签: php mysql gzip mysqldump phpseclib

我在我的本地电脑上使用phpseclib从远程服务器下载mysqldummp这是我的代码:

set_include_path( './phpseclib');
require_once 'NET/SSH2.php';
require_once 'NET/SFTP.php';
require_once 'Crypt/RSA.php';
require_once 'Math/BigInteger.php';

$privatekey = file_get_contents('/path/to/.ssh/id_rsa');

$rsa = new Crypt_RSA();
$rsa->setPassword('');

if ($rsa->loadKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1 ) === false) {
exit ("private key loading failed!");

$ssh = new Net_SSH2('example.com');
if (!$ssh->login('root', $rsa)) {
    exit('Login Failed');
}

  ini_set('zlib.output_compression', 'Off'); // tried removing this line too

header("Content-disposition: attachment; filename=sql.tar.gz");
header("Content-Type: text/javascript");
header("Content-Encoding: application/x-gzip");
echo $ssh->exec('mysqldump -uuser -ppass dbname tablename | gzip -9');

当我在我的本地主机上的浏览器中打开此页面时,它提示下载文件sql.tar.gz,但文件未提取它似乎已损坏。 你们可以告诉我,如果我做错了吗

1 个答案:

答案 0 :(得分:0)

  1. 我认为您使用header('Content-Encoding: gzip');可能会更好,然后使用您正在使用的内容编码。

  2. 当我尝试mysqldump -uuser -ppass dbname tablename | gzip -9时,我得到了以下内容:

    gzip: compressed data not written to a terminal. Use -f to force compression.
    For help, type: gzip -h
    mysqldump: Got errno 32 on write
    

    如果删除所有标题并在$ssh->exec()的输出上执行strlen(),你会得到什么?我想知道你回来的东西是否甚至被压缩了。如果没有,那么可以尝试我运行的命令建议的-f选项。

  3. 您的代码可以清理很多。

    set_include_path( './phpseclib');
    require_once 'NET/SSH2.php';
    require_once 'NET/SFTP.php';
    require_once 'Crypt/RSA.php';
    require_once 'Math/BigInteger.php';
    
    $privatekey = file_get_contents('/path/to/.ssh/id_rsa');
    
    $rsa = new Crypt_RSA();
    $rsa->setPassword('');
    
    if ($rsa->loadKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1 ) === false) {
    

    由于NET / SFTP.php包含它,因此不需要包含NET / SSH2.php。此外,包括Math / BigInteger.php是不必要的,因为NET / SSH2.php和Math / BigInteger.php都包含它。

    调用$rsa->setPassword('');也是不必要的,因为(我有80%的信心)默认情况下会假设空密码,而$rsa->loadKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1 )可以