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、现在每次都打包下载,后续可能数据量会很大,需要改为增量备份。

THE END

标签: 虚拟网络 Windows

本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。


相关文章