宝塔备份后scp拉不到文件主因是权限和路径错误:需确认备份路径(/www/backup/site/或/database/)、用root或有/www读权的用户执行,或改用宝塔“远程下载”功能。

宝塔面板备份后,scp 拉不到文件?权限和路径得对上
宝塔打包的备份默认放在 /www/backup/site/ 或 /www/backup/database/,但新服务器上用 scp 拉取时经常报 “No such file” 或 “Permission denied”,根本不是网络问题,而是路径没进对、用户没切对。
- 老服务器执行备份后,先用
ls -l /www/backup/site/确认压缩包完整生成(大小非 0,且无.lock文件残留) -
scp必须用 root 用户或有/www读权限的用户执行,普通用户默认无权读取该目录 - 别直接
scp root@old-ip:/www/backup/site/example.zip ./—— 如果新服务器没开 root 登录,得先su -切过去再拉,或改用宝塔自带的「远程下载」功能绕过权限问题 - 宝塔 8.x 后默认关闭 root SSH 密码登录,若用密钥登录,确保
~/.ssh/id_rsa权限是600,否则scp静默失败
用宝塔「远程下载」比 scp 更稳,但 URL 必须可直连
宝塔后台的「远程下载」本质是让新服务器主动 wget,避开了 SSH 权限和本地 shell 环境问题,但前提是老服务器上的备份包能被公网(或内网)直接访问。
- 老服务器需临时启用 Web 访问:把
/www/backup/site/下的 zip 包软链到/www/server/nginx/html/backup/,并确保 Nginx 配置允许该目录autoindex on - URL 示例:
http://old-ip/backup/example_20240510.zip,粘贴进宝塔「远程下载」框时,必须带http://前缀,漏了就卡在“正在获取文件信息” - 如果老服务器在 NAT 内网(如家用宽带),无法暴露 IP,这条路走不通,得退回
scp或改用 rsync + 密钥免密 - 下载中途断掉不会自动续传,宝塔不支持
wget -c,大站建议先screen+wget -c手动下完再导入
还原网站时,database 和 site 备份不能混着解压
宝塔的站点备份分两部分:网站文件(site)和数据库(database),它们的解压路径、导入方式、权限要求完全不同,混在一起操作会导致 502 或连接不上数据库。
- 网站文件备份解压后,要手动
chown -R www:www /www/wwwroot/example.com,否则 Nginx 无法读取 - 数据库备份是
.sql文件,不能直接丢进 phpMyAdmin —— 宝塔还原页里选「从备份恢复」才走校验逻辑;如果手动mysql -u root example ,记得先 <code>CREATE DATABASE example CHARACTER SET utf8mb4; - 数据库名、用户名、密码要和原站一致,否则网站配置里的
DB_HOST、DB_NAME等字段不用改,但宝塔后台的数据库列表里必须存在同名库和同名用户,并已授权 - SSL 证书不会随站点备份打包,得单独导出
/www/server/panel/vhost/cert/example.com/下的fullchain.pem和privkey.pem,再在新站 SSL 设置里「上传证书」
迁移后首页正常但后台 500?检查 user.ini 和 .user.ini 的继承关系
尤其 WordPress 或 ThinkPHP 类程序,迁移到新服务器后前台能打开,后台点开就 500,大概率是宝塔的防跨站设置没同步过去 —— 老站可能关了,新站默认开着。
- 进新服务器的网站根目录,运行
ls -la | grep user.ini,确认是否存在.user.ini(注意前面的点) - 如果存在,用
cat .user.ini查看内容,常见项如open_basedir=/www/wwwroot/example.com/:/tmp/:/proc/,若路径写死了老服务器的绝对路径,必须改成新路径 - 也可以直接删掉
.user.ini,然后在宝塔网站设置 → 「PHP 设置」→ 「防跨站开放」里手动关闭,比改文件更直观 - 关闭后记得重启 PHP 进程:
service php-fpm-81 reload(版本号按实际填),只重载 Nginx 不生效
.user.ini、数据库字符集、以及宝塔自身对 open_basedir 的默认策略都可能变,得一个个核对,不能只信「备份还原」那一个按钮。










