也谈文件夹同步

原创贴。今天有人发布了python版的文件同步,我也分享个powershell版的文件同步。采用了校验码的原理。支持ftp,sftp,webdav,欢迎围观。

前言

1 同步分为文件级别,和块级别。rsync是块级别。

2 如果是基于微软文件共享或samba协议,用robocopy.exe即可文件级别的同步。

3 通过任务计划,实现自动,定时同步。

4 如果是ftp,sftp,用powershell+winscp模块的Sync-WinSCPPath命令,即可实现文件级别同步。原理是校验码,根本无需监视文件。

原理如下:(同步目录就用上面的命令,同步单个文件,就写脚本手动做如下步骤)

4.1本地dir

4.2远程dir

4.3对同一个文件,【$本地目录/a/b/c.txt】和【$远程目录/a/b/c.txt】获取校验码,通过校验码来对比,得知文件是否改变。

4.4同步校验码不同的文件。

5 VSCODE中有个ftp-sync插件,可以实现保存文件时,同步本地文件,到linux服务器上的ftp,sftp。

 

正文

 powershell 传教士 原创 文章 2017-06第一版,2017-11第二版。

 

【简介】
https://winscp.net/eng/docs/lang:chs
winscp是一个免费软件。欢迎捐助作者。

我们使用的是它的库。这个库支持powershell,是win,linux通用的。

我们使用它的原因是,win,linux通用,健壮,免费。
没有暗坑,功能比系统自带的ftp,mput强很多。
有它坐镇win,linux,尽解一切ftp,sftp,webdav(http,https)文件传输。基本不需要其他软件。

 

【系统需求】

 

安装了powershell的linux发行版。

如果你的系统是win7+powershell2.0,即如果没有安装powershell 5.0,就没有Install-Module命令。那么一切都要手动。

1去https://winscp.net,手动下载,相关支持。net的模块dll

2解压后,把”WinSCPnet.dll”,放入powershell2.0的模块目录。

3在ps1脚本中,手动Add-Type -Path “d:\你的路径\WinSCPnet.dll” 而win7 + ps5.0,及以上版本,无需这么麻烦。

 

 

 

问:目前哪些版本linux能安装上powershell?

答:

◦Ubuntu 14.04/16.04/Debian8.x 9.x

◦CentOS 7.x/RHEL 7.x

◦open SUSE 42及以上

◦LINUX docker 容器

◦Arch Linux (archl inux 没有版本号)

◦Linux AppImage 容器(portable application single binary)  https://github.com/probonopd/AppImageKit

 

【安装】

管理员权限的,win、linux版powershell中运行 :

Install-Module winscp

 

【升级】

管理员权限运行 update-Module winscp

 

传教士推荐使用。理由:

1支持ftp,sftp,webdav。

2无需先下载整个文件,winscp模块支持,从ftp服务器上,获取文件的校验码,从而得知是否文件是变化的。

有Get-WinSCPItemChecksum从而可以同步文件。 网页https://winscp.net/eng/docs/protocols的,Checksum calculation 章节,详细说明了这个内容。

3支持命令行显示ftp完成进度,文件权限,文件掩码,传输限速,是否覆盖。文件传输模式(ascii or 二进制)

详见此命令: New-WinSCPTransferOption

 

手册,所有例子在此: https://winscp.net/eng/docs/library_examples

 

【测试通过的脚本例子】ftp(sftp也大同小异)

 

#----------------------------
#用户输入部分
$本地文件_路径 = \'d:\\'
$本地文件_文件名 = \'a1.txt\'
$本地文件_绝对路径名 = join-path -Path $本地文件_路径 -ChildPath $本地文件_文件名

$远程路径 = \'/UPLOAD/\'
$ftp服务器 = \'192.168.1.1\'
$用户名 = \'a\'
$用户密码明文 = \'传教士测试通过-2017-11\' 
#----------------------------
#脚本main
$用户密码密文 = ConvertTo-SecureString $用户密码明文 -AsPlainText -Force
$我的登陆凭据 = New-Object System.Management.Automation.PSCredential ($用户名,$用户密码密文)
$ftp连接参数 = new-WinSCPSessionOption -Protocol Ftp -HostName $ftp服务器  -Credential  $我的登陆凭据
$ftp连接 = new-WinSCPSession -SessionOption $ftp连接参数

$传输参数_二进制 = New-WinSCPTransferOption -TransferMode Binary  
Send-WinSCPItem -WinSCPSession $ftp连接 -LocalPath  $本地文件_绝对路径名  -RemotePath "$远程路径" -TransferOptions $传输参数_二进制
#上传用 Send-WinSCPItem

Receive-WinSCPItem -WinSCPSession $ftp连接 -RemotePath "$远程路径/a2.txt" -LocalPath "d:\j"
#下载用 Receive-WinSCPItem


Remove-WinSCPSession -WinSCPSession $ftp连接  #收工下班

 

 —— sftp例子 ——

$用户名 = \'root\'
$目的ip地址 = \'192.168.1.6\'
$用户密码密文 = ConvertTo-SecureString \'你的密码\' -AsPlainText -Force
$我的登陆凭据 = New-Object System.Management.Automation.PSCredential ($用户名,$用户密码密文)
$sftp连接参数 = New-WinSCPSessionOption -Protocol Sftp -HostName $目的ip地址 -Credential $我的登陆凭据
$指纹 = Get-WinSCPHostKeyFingerprint -SessionOption $sftp连接参数 -Algorithm SHA-256
$sftp连接参数.SshHostKeyFingerprint = $指纹

$连接3 = new-WinSCPSession -SessionOption $sftp连接参数 Invoke-WinSCPCommand -WinSCPSession $连接3 -Command \'ls -l /tmp\'

 

【命令列表】

PS C:\Windows\system32> (get-command -module winscp).name
Close-WinSCPSession
Enter-WinSCPSession
Exit-WinSCPSession
Open-WinSCPSession
ConvertTo-WinSCPEscapedString
Copy-WinSCPItem
Get-WinSCPChildItem
Get-WinSCPHostKeyFingerprint
Get-WinSCPItem
Get-WinSCPItemChecksum
Get-WinSCPSession
#powershell 传教士 原创文章,2017-06第一版。2017-11第二版。2019-05第三版。
Invoke-WinSCPCommand
Move-WinSCPItem
New-WinSCPItem
New-WinSCPItemPermission
New-WinSCPSession
New-WinSCPSessionOption
New-WinSCPTransferOption
New-WinSCPTransferResumeSupport
Receive-WinSCPItem
Remove-WinSCPItem
Remove-WinSCPSession
Rename-WinSCPItem
Send-WinSCPItem
Start-WinSCPConsole
Sync-WinSCPPath
Test-WinSCPPath

 

版权声明:本文为piapia原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/piapia/p/7040149.html