一、scp 命令简介

Linux scp 命令用于 Linux 之间复制文件和目录。

scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。

scp 详细命令可参考 https://www.runoob.com/linux/linux-comm-scp.html

二、简单测试 scp 命令
1、启动 ssh 服务

①、使用 ss -lnt 查看 ssh 服务是否启动,如下我指定的 10022 已经启动,默认端口是 22
在这里插入图片描述
②、如果没有启动,使用如下命令启动

systemctl start sshd

③、如果没有安装使用如下命令安装,

sudo yum install sshd 
或
sudo yum install openssh-server
3、scp 命令格式
scp local_file remote_username@remote_ip:remote_folder 
或者 
scp local_file remote_username@remote_ip:remote_file 
或者 
scp local_file remote_ip:remote_folder 
或者 
scp local_file remote_ip:remote_file 
  • 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;
  • 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;
2、运行 scp 命令

命令说明 -p 指定目的主机端口号,默认 22 可不用指定,-r 递归复制整个目录

scp -P 10022 -r /opt/docker/mysql/backup/2021-08-12_01\:00\:01/ root@22.22.22.22:/opt/docker/mysql/backup/

输入密码即可拷贝成功
在这里插入图片描述
但是每次都需要手动输入密码,则不能加入到我们的脚本中,使用 scp 免密码传输文件

三、scp 免密码传输文件

以下以 A 服务器 和 B 服务器说明,将 A 服务器文件拷贝到 B 服务器

①、 A 服务器生成公钥私钥,一路回车就可以,需要定制可自行修改

ssh-keygen -t rsa

生成之后,多了两个文件,id_rsa 私钥,id_rsa.pub 公钥
在这里插入图片描述
②、将 A 服务器的公钥追加到 B 服务器的 /root/.ssh/authorized_keys 认证文件中,没有该文件则新建
复制 A 服务器 /root/.ssh/id_rsa.pub 公钥
在这里插入图片描述
追加到 B 服务器/root/.ssh/authorized_keys 认证文件
在这里插入图片描述
③、A 服务器运行免密登陆 scp 命令
在这里插入图片描述
④、B 服务器查看,远程备份成功
在这里插入图片描述
以上就是 scp 传输文件到另一台服务器的简单使用

四、docker 备份 MySQL 到另一台服务器

下面内容接另一篇博客 备份 MySQL 三种方法备份 MySQL 数据库(含docker)

将上面的 scp 命令添加到 docker mysql 备份的脚本中即可(A 服务器)

#!/bin/bash
dateBackup=$(date +%Y-%m-%d_%H:%M:%S)
dir=/opt/docker/mysql/backup/${dateBackup}
# 宿主机新建目录,通过挂载会自动添加到容器
if [ ! -d "${dir}"]
then
		mkdir ${dir}
		echo "创建文件夹 ${dir} 成功" >> ${dir}/error.log
else
		echo "创建文件夹 ${dir} 失败,文件夹已存在" >> ${dir}/error.log
dbNames=(student teacher car dog cat)
for dbName in ${dbNames[@]}
do
		echo "-----------------> 备份 ${dbName} 数据库 <-----------------" >> ${dir}/error.log
        docker exec -i 642c89599d9b sh -c "mysqldump -ubackup -pAdmin@123 -h127.0.0.1 -P32773 ${dbName} 1>> /opt/backup/${dateBackup}/${dbName}.sql 2>> /opt/backup/${dateBackup}/error.log"
        gzip ${dir}/${dbName}.sql
done
# -e 开启转义字符
echo -e "\n------------------------> scp 22.22.22.22 <---------------------------"  >> ${dir}/error.log
# 将该服务器 mysql 备份文件复制到 22.22.22.22:10022 服务器的 /opt/docker/mysql/backup/ 目录下
# script 用于录制会话过程(类似记录日志)
script -a -q ${dir}/error.log -c "scp -P 10022 -r ${dir} root@22.22.22.22:/opt/docker/mysql/backup/"

echo -e " \n ----------------> 删除过期文件 <---------------------------" >> ${dir}/error.log
# 判断文件夹数量是否大于7,防止程序意外停止,定时任务删除所有备份
dirCount=`ls -l /opt/docker/mysql/backup/|grep "^d"|wc -l`
if [ ${dirCount} -gt 7 ]
then
	# 删除超过七天的带"_"的目录
	find /opt/docker/mysql/backup/ -mtime +6 -name "*_*" -exec rm -rf {} \;
	echo -e " 删除过期文件成功" >> ${dir}/error.log
else 
	echo "删除过期文件失败,文件数量小于 7" >> ${dir}/error.log
fi

script 参数说明
在这里插入图片描述
B 服务器定时删除备份过来的文件,可以添加一个定时任务,使用 crontab -e 命令,在文件中追加

0 1 * * * /opt/docker/mysql/backup/del_backup.sh

添加 /opt/docker/mysql/backup/del_backup.sh 脚本文件

dateDel=$(date +%Y-%m-%d_%H:%M:%S)
# 判断文件夹数量是否大于7,防止程序意外停止,定时任务删除所有备份
dirCount=`ls -l /opt/docker/mysql/backup/|grep "^d"|wc -l`
if [ ${dirCount} -gt 7 ]
then
	# 删除超过七天的带"_"的目录
	find /opt/docker/mysql/backup/ -mtime +6 -name "*_*" -exec rm -rf {} \;
	echo -e "  ${dateDel}   删除过期文件成功" >>/opt/docker/mysql/backup/del.log
else 
	echo " ${dateDel}   删除过期文件失败,文件数量小于 7" >> /opt/docker/mysql/backup/del.log
fi

以上就是利用 scp 传输 docker 备份 mysql 数据的所有内容。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐