![使用 SSH 中的 Bash 脚本在新服务器上自动从旧服务器传输文件](https://linux22.com/image/1154993/%E4%BD%BF%E7%94%A8%20SSH%20%E4%B8%AD%E7%9A%84%20Bash%20%E8%84%9A%E6%9C%AC%E5%9C%A8%E6%96%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E8%87%AA%E5%8A%A8%E4%BB%8E%E6%97%A7%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BC%A0%E8%BE%93%E6%96%87%E4%BB%B6.png)
如何使用 SSH 连接到远程主机并创建一个 Bash 脚本以将所有文件和文件夹从旧服务器复制到新服务器进行每天备份?
答案1
设置基于密钥的 ssh 身份验证
首先,你需要生成一个 ssh 密钥。在你连接的机器上,运行:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vidarlo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vidarlo/.ssh/id_rsa.
Your public key has been saved in /home/vidarlo/.ssh/id_rsa.
The key fingerprint is:
SHA256:/jxfxiWiao0m7YG9MiHgXBFKoo7kJcgTOrPtAZNtpVg [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|..E o. |
|=B.+. |
|@==. . |
|=O= . |
|o=oo S . . .|
| .o.. .+ . o o |
| . ..o+o. + |
| + =*o o |
| B+ oo. |
+----[SHA256]-----+
[~]$
询问时只需按回车键即可;默认位置且无需密码即可。
这将生成一个私钥和公钥。下一步是将公钥复制到远程服务器,以便可以使用。ssh-copy-id
可用于此目的:
$ ssh-copy-id user@host
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/vidarlo/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@host's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user@host'"
and check to make sure that only the key(s) you wanted were added.
此时您应该能够运行ssh user@host
,并且无需输入密码即可登录。
备份作业
你想要一个简单的 scp。这很糟糕,原因如下:
- 您不会获得任何历史记录。如果文件被错误地覆盖,并且您在下一次备份作业之前没有发现它,scp 将很乐意覆盖内容。
- 你必须每晚复制所有内容。
- 您没有收到状态报告。
- 如果备份作业没有及时完成,则可能会有两个备份作业写入相同的内容。
但无论如何。只要您了解注意事项,就可以做到这一点。使用crontab -e
编辑用户 crontab。插入如下一行:
0 5 * * * /usr/bin/scp "/path/to/backup" "user@remote:/path/to/store/backups"
此命令将在每晚 05:00 运行。您可以根据需要更改此设置。字段说明如下:
- 分钟,0-60。0 表示在 xx:00 运行,* 表示运行每一个分钟
- 小时,0-23。02 表示 02:xx。* 表示每小时。
- 每月日期,1-31。* 表示每天。
- 月份,1-12。* 表示每月
- 星期几,1-7。