Windows中SSH上运行Rsync

雲文 雲文

rsync 是非常好用的同步工具,尤其是增量同步的功能,每次只同步被修改过的文件,其余保持不变的文件,不用同步剩下大量的时间和带宽。可以直接使用rsync设置服务器来进行同步。也可以借助rsync的rsh/ssh特征直接在rsh/ssh层进行通讯和文件同步,避免新开rsync服务导致的风险。

但是如果rsync用于windows和Linux之间同步的话,因为rsync依赖rsh或者ssh(windows上常见的是plink)这样的工具链,而windows平台中直接使用他俩的话,会出现“invalid handle” 错误。

原因在于rsync和plin之间是用标准IO来进行进程间通讯,这是linux上常见的IPC方式,但是这个方式在windows上,支持的并不完善,导致标准IO sdtin和sdtout不可用的错误。出现文件句柄不可用的问题。

不过这个时候cygnative 出场了,他用原生win32API封装出来stdin和stdout的句柄调用,这样可以让两者之间协同工作。

而rsync则利用其--rsh/-e参数先调用cygnative这个封装器,然后封装器再调用plink,这样就完美的解决了windwos上面的工具链不兼容问题。

软件工程中,经常发生这样的事情,为了解决一个兼容性问题,引入一个新的兼容层,同时引入了一个新的bug层。

这个时候

image-20231024225544333

rsync  -a -p -k -v --chmod=D775,F664 --delete  --exclude  ".git"  --exclude "img_old"  output_prod/  ssh_user@remote_host:/dest_path

修改为:

rsync  -e "cygnative plink.exe " -a -p -k -v --chmod=D775,F664 --delete  --exclude  ".git"  --exclude "img_old"  output_prod/  ssh_user@remote_host:/dest_path

就可以正常工作了。而且因为plink中可以支持密钥验证无密码输入等等putty特征。rsync的密码都不用设置了。