我在我的本地电脑上使用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,但文件未提取它似乎已损坏。 你们可以告诉我,如果我做错了吗
答案 0 :(得分:0)
我认为您使用header('Content-Encoding: gzip');
可能会更好,然后使用您正在使用的内容编码。
当我尝试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
选项。
您的代码可以清理很多。
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 )
可以