目录
- 说明
- 准备
- 实现结果
- 步骤
- 生成RSA公钥和私钥
- 查看密钥生成结果
- 将公钥传输到目标服务器
- 额外内容
- 自动备份文件脚本
- 定时删除备份文件
说明
日常工作中常常会使用到ssh 的scp命令进行文件传输。有时候甚至使用自定义的脚本配合定时任务来对文件进行异地备份,那么此时就需要免密传输来使脚本自己运行并备份。
准备
序号 | 服务器ip | 说明 |
---|---|---|
1 | 192.168.0.100 | 此服务器为源地址 |
2 | 192.168.0.200 | 此服务器为目标地址 |
实现结果
使用crontab定时执行自定义的脚本,将服务器192.168.0.100的文件免密传输到192.168.0.200指定位置中。
步骤
生成RSA公钥和私钥
使用root登录192.168.0.100 后。执行以下命令生成rsa公钥和私钥.(三次回车)
ssh-keygen -t rsa
查看密钥生成结果
密钥生成完成后,回在**/root/.ssh**下得到密钥相关的文件,可以使用以下命令进行查看
ls -l /root/.ssh
如下图,红色为生成的公钥(id_rsa.pub)和私钥(id_rsa)文件
将公钥传输到目标服务器
使用scp将公钥文件id_rsa.pub传输到 192.168.0.200 目标服务器的 /root/.ssh目录下 。并重命名为authorized_keys
注意:scp登录的目标服务器的用户也是root。
scp id_rsa.pub root@192.168.0.200:/root/.ssh/authorized_keys
到此,已经可以在 192.168.0.100 中使用scp 命令无密传输文件到 192.168.0.200 中。
额外内容
以下脚本可以配合crontab来设置定时任务执行。
crontab -e
推荐使用 crontab生成网站 来配置时间
# 配置定时任务,指定时间执行指定脚本
* * * * * sh 脚本路径
自动备份文件脚本
#!/bin/bash
echo "自动异地备份开始"# 本地服务器存放文件地址,即192.168.0.100文件存放地址
backUpPath=/extend1/backup# 备份到的目标服务器
tagServerIp=192.168.0.200# 192.168.0.200存放备份文件地址
bakUpTo200SavePath=/dBackUpecho "将逻辑备份文件和日志异地备份到${tagServerIp}的目录${bakUpTo200SavePath}上"cd ${backUpPath}dateToday=$(date +%Y-%m-%d)echo "今日时间:${dateToday}"# 循环指定传输的文件,
# "dbfull_${dateToday}.db" 表示:文件名称为 dbfull_年-月-日.db 格式的文件
for item in $(find ${backUpPath} -maxdepth 1 -type f -name "dbfull_${dateToday}.db" );doecho "传输文件:${item}"scp ${item} root@${tagServerIp}:${bakUpTo200SavePath}
done
定时删除备份文件
#!/bin/bash# 删除指定天数前的备份数据
delDayNumber=14backUpSavePath=/dBackUp
echo"备份存放路径:${backUpSavePath}"# 当前时间
current_date=$(date +%Y-%m-%d)# 指定天数的日期
target_date=$(date -d "$current_date -${delDayNumber} day" +%Y-%m-%d)echo"当前时间为:${current_date},删除${delDayNumber}天前的备份,删除日期为${target_date}前的备份"# 目标日期时间戳
target_date_timeStamp=$(date -d "$target_date" +%s)# 查找删除的文件
# "dbfull_${dateToday}.db" 表示:文件名称为 dbfull_年-月-日.db 格式的文件 和 dbfull_年-月-日.log 格式的文件
for i in $(find ${backUpSavePath} -maxdepth 1 -type f \( -name "dbfull_*.db" -o -name "dbfull_*.log" \) ) ;do# echo "${i}"if [[ $i =~ ([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) ]]; then# 匹配到文件中的日期year=${BASH_REMATCH[1]}month=${BASH_REMATCH[2]}day=${BASH_REMATCH[3]}file_date=${year}-${month}-${day}# 文件日期时间戳file_date_timestamp=$(date -d "${file_date}" +%s)if [ ${target_date_timeStamp} -gt ${file_date_timestamp} ] ;then#echo "${target_date}大于${file_date}" # 在删除的范围内echo "删除${i}"rm ${i}continueelif [ ${target_date_timeStamp} -eq ${file_date_timestamp} ];then#echo "${target_date}}等于${file_date}"# 在删除的范围内echo "删除${i}"rm ${i}continueelse#echo "${target_date}小于${file_date}"# 不在删除的范围内continuefifi
done