分类 神木 下的文章

之前一直都是使用scp远程拷贝文件,最大的麻烦在于它每次都是全量拷贝。没有使用rsync的原因是,这货在windows没有什么免费开源又原生的安装包——基于Cygwin的不算。

考虑到如今Docker镜像已经是大家的标配了,我们可以直接在本地构建一个工具箱镜像,然后在工具箱容器内跑rsync

FROM debian:latest

RUN apt-get update
RUN apt-get upgrade
RUN apt-get install -y openssh-client
RUN apt-get install -y wget curl git 
RUN apt-get install -y rsync

ENTRYPOINT [ "/bin/bash" ]

构建工具箱镜像,这个镜像是未来我们手头随时可用的百宝箱:

docker build -t newbiebox:0.1.0 .  

powershell中挂载本地.ssh目录,运行一个用完即删的容器:

docker run --rm --name newbiebox -it `
    -v C:/Users/stdunit/.ssh:/root/.ssh `
    -v C:\Users\stdunit\Desktop:/Desktop `
    newbiebox:0.1.0

这里挂载本地.ssh目录是因为rsync远程拷贝是基于ssh的,为了在容器内免密码登录远程服务器,需要把本地宿主上的.ssh私钥和密钥拷贝暴露给我们的容器。

如果是第一次挂载.ssh,可能需要修复一下这个目录下的读写权限——在windows下我们通常意识不到这个问题,但是Linux对权限检查比较严格。在容器内运行如下命令:

chmod 700 /root/.ssh             # 只有用户有访问权限
chmod 600 /root/.ssh/id_rsa      # 只有用户有读写权限
chmod 644 /root/.ssh/id_rsa.pub  # 让其他人可以读取
chmod 644 /root/.ssh/config      # 便客户端能读取配置文件

然后在容器内,使用rsync进行远程拷贝:

rsync -avz /Desktop/test-rsync/ username@remote-server:/dst/test-r

如果远程ssh的端口被改了,可以使用 -e "ssh -p 端口号"的形式:

rsync -e "ssh -p PORT" -avz /Desktop/test-rsync/ username@remote-server:/dst/test-r

上面的这两条指令是把本地文件同步到远程服务器,通过对调源路径和目标路径,可以实现把远程服务器的文件同步到本地:

rsync -e "ssh -p PORT" -avz user@remote-server:/path-to-backup /Desktop/backup/