PowerShell备份远程网站
以下脚本保存成.ps1格式,按照实际修改里面变量。
# 请修改这些变量的值
# 这里填写你网站服务器ip
$IP="111.22.122.248"
$PORT="22"
# 站点名称,用于给网站目录打包后命名
$WEBNAME="www.test.com";
# 这里填写网站程序目录
$WEBDIR="/www/wwwroot/www.test.com"
# 这里填写Mysql数据库的root密码,如果不需要密码请填123456等任意字符
$DBPASS="nm7KYiSPLsPZpjme"
# 这里填写数据库的名称
$DBNAME="wordpress_db"
# 这里填写本地备份目录,例如/root/backup
$BACKUPDIR="D:\backups"
# 保留14天的备份,可以改成30天,200天等
$EXPIRE_DAYS=14
#-------------------------------------
# 以下应该不需要修改了
# 备份目录不存在则新建
if(-Not(Test-Path -Path $BACKUPDIR )){
New-Item -ItemType directory -Path $BACKUPDIR
}
# 准备备份目录
New-Item -ErrorAction Ignore -ItemType directory -Path $BACKUPDIR\db;
New-Item -ErrorAction Ignore -ItemType directory -Path $BACKUPDIR\tar;
New-Item -ErrorAction Ignore -ItemType directory -Path $BACKUPDIR\files;
# 判断目录创建是否成功
if(!(Test-Path -Path $BACKUPDIR\db ) -or !(Test-Path -Path $BACKUPDIR\tar) -or !(Test-Path -Path $BACKUPDIR\files)){
echo "无法创建备份目录";
exit 1;
}
# 在服务器远程备份数据库
$DBFILE=$DBNAME+"-"+((Get-Date).ToString("yyyyMMdd_HHmmss"))+".sql.gz";
echo "数据库备份名:"+$DBFILE;
# 删除已有数据库备份
ssh -p $PORT root@$IP "rm -f ~/$DBNAME*.sql.gz"
# MySql账号密码保存在服务器 /etc/mysql/conf.d/mysqldump.cnf文件中
ssh -p $PORT root@$IP "mysqldump -u root $DBNAME | gzip > ~/$DBFILE";
# 命令行使用明文密码方式会有警告
#ssh -p $PORT root@$IP "mysqldump -u root -p$DBPASS $DBNAME | gzip > ~/$DBFILE";
# 下载远程文件,注意端口-P要大写
scp -P $PORT root@${IP}:~/$DBFILE $BACKUPDIR\db\;
# 删除数据库备份文件
ssh -p $PORT root@$IP "rm -f ~/$DBFILE";
#rm -rf root@${IP}:~/$DBFILE ;# 没搞定端口
# 将网站所在文件夹打包压缩
$ZIP_FILE=$WEBNAME+"-"+((Get-Date).ToString("yyyyMMdd_HHmmss"))+".tar.gz";
ssh -p $PORT root@$IP "tar -zcPvf ~/$ZIP_FILE $WEBDIR";
scp -P $PORT root@${IP}:~/$ZIP_FILE $BACKUPDIR\tar\;
# 删除备份文件
ssh -p $PORT root@$IP "rm -f ~/$ZIP_FILE";
exit 0;
这是从Linux脚本转过来的,有几个问题需要处理:
1、SSH没法在命令行指定密码。
要用公匙登录,在PowerShell下输入:
ssh-keygen -t rsa -b 4096 #备份服务器上生成RSA公钥
然后,突然发现PowerShell识别不了ssh-copy-id,网上搜到的教程,复制下面这段脚本,粘贴到Windows终端,按回车运行即可。
function ssh-copy-id([string]$userAtMachine, $args){
$publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
if (!(Test-Path "$publicKey")){
Write-Error "ERROR: failed to open ID file '$publicKey': No such file"
}
else {
& cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"
}
}
上面这段其实就是,根据ssh-copy-id的执行逻辑来编写的shell脚本。
这样以后,就可以成功使用ssh-copy-id了。然后将公钥传到网站服务器:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@网站服务器ip
2、mysqldump 命令行使用明文密码方式会有警告。
需要把MySql账号密码保存在服务器 /etc/mysql/conf.d/mysqldump.cnf 文件中
[mysqldump]
……
user=root
password=password
3、现在每次都打包下载,后续可能数据量会很大,需要改为增量备份。