我有两台计算机,一台本地计算机,一台远程计算机。我想通过 ssh 使用 tar 命令备份远程服务器,但将 tar 文件保存在本地计算机上。可以吗?
答案1
以下是我所做的两个示例:一个用于文件,一个用于 MySQL。两者都是拉取解决方案;您的本地计算机登录到远程计算机并检索文件。但是,本地计算机会告诉远程计算机准备存档。
设置与背景
我使用 crontab 和无密码身份验证通过 ssh 在远程计算机上存档和 gzip,然后通过 ssh 将 gzip 的输出定向到本地计算机。确保 crontab 和无密码认证已设置。我还准备了一些清理的单行代码。
这样做的好处是可以最高效地利用带宽。缺点是资源占用较高,不过在现代硬件上,除非处理的文件非常大,否则我怀疑这无关紧要。
备份文件和目录
这可能是你关心的部分。告诉 ssh 执行 tar 并通过管道传输到 gzip远程机器让 gzip 将压缩文件写入标准输出(c
标志),并将输出定向到当地的机器。
00 00 * * * /usr/bin/ssh login@host "sudo tar -cf - -C /path/to/directory/to/backup/ file_to_back_up | gzip -9c" > /file/on/local/machine/BackUp_$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).tar.gz
重要提示:file_to_back_up
是您实际备份的文件;它可以是文件或目录。它也可以是一系列文件:file1.txt、file2.php 等。
该9
标志是最大 gzip 压缩。
标志-cf -
和参数创建一个新的存档并将数据吐出到标准输出。-C
标志告诉 tar 从当前目录以外的其他目录开始。file_to_back_up 可以是文件或目录。这样可以将许多无关的相对路径排除在存档之外。如果您想备份主目录中的某些内容,我想您可以省略,-C /path/to/directory/to/backup/
因为 ssh 默认会将您登录到主目录中。
date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A
将生成一个时间戳,例如2015-03-19-08h58m09s_Thursday
crontab 列00 00 * * *
基本上意味着每天的午夜。
备份 MySQL 数据库
与上述类似。需要注意的是,您需要确保您的 mysql 访问也可以无密码;安全的方法是使用 .cnf 文件。如果您不使用 MySQL,请跳过此部分,但此概念可以延续到其他工具。
30 0,13 * * * /usr/bin/ssh [email protected] "mysqldump --defaults-file=.my.database.cnf -uroot databasename | gzip -9c" > /path/to/databasebackup_$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).sql.gz
.cnf 文件包含登录凭据,因此您无需通过 shell 传递它们,ps
其他用户也可以看到它们。它应该包含:
[client] user=mysqluser password=yourpassword host=localhost
根据您的设置,您可能需要为不同的项目/数据库设置一组文件。如果没有,则默认使用 .my.cnf。
安全性:您可能希望chmod 600 *.cnf
只有所有者可以读取和写入此文件。
清理
我倾向于使用该命令自动删除超过五天的备份find
,除非它们落在星期五。我归档星期五的时间更长。这就是为什么我在文件名中包含星期几的原因。
答案2
是的,以下是一些例子:
tar cvjf - * | ssh user@host "(cd /desired/path; tar xjf -)"
tar cvzf - dir/ | ssh user@host "cat > /backup/dir.tar.gz"
tar cvzf - dir/ | ssh user@host "dd of=/backup/dir.tar.gz"
ssh user@host "cat /backup/dir.tar.gz" | tar xvzf -
tar cvjf - * | ssh root@host "(cd /desired/path; tar xjf - )"
备份远程计算机并将 tar 保存在本地计算机上
ssh user@host "(cd /desired/path; tar cvzf - *)" > /path/to/backup.tar.gz