PowerShell远程会话之大文件传输
在运维当中,最经常要碰上文件在各个服务器之间的传输,而使用PowerShell来管理服务器的文件传输同样也有很多种方式,如果仅仅是传输些小文件的话,那么像Scp,Sftp,Copy-Item等等这些都能很轻易的解决问题。
但是,如果要传输的文件很大,好几个G,甚至是好几十个G的情况下,这些工具就显得很吃力了。
最经常碰上的情况是如下这种情况
PCA远程SSH到PCB上,PCB要从Server上面把文件传输回来,在SSH或是PowerShell上面来,这种情况就是多跳远程控制
我们使用远程连接了PCB,在远程PCB中再想进行远程操作,就会提示错误。因为默认的认证信息只会传递一跳。
关于多跳,微软官方文档有给出的解决方案是:https://docs.microsoft.com/en-us/powershell/scripting/learn/remoting/ps-remoting-second-hop?view=powershell-7
多种解决方案的核心点就是需要凭据。
而密码和基于密钥的身份验证之间的双跳最大差异就是:
1、通过密码身份验证打开的远程会话具有附加到它的用户凭据,因此能够作为用户进行出站身份验证。
2、通过基于密钥的身份验证打开的远程会话没有关联的用户凭据,因此不能作为用户进行出站身份验证。这是系统设计的,并且遵循标准 Windows 安全规则。
但是我们在使用OpenSSH的时候,我们有的时候就是只想使用基于密钥的这种认证方式,通过密钥我们又没办法关联用户凭据,那我们又该怎么办呢?
方法一、
那我们就通过Windows的任务计划来实现,通过远程登录到PCB上面之后,通过建立任务计划----》运行任务计划,这样在任务计划里面创建的传输就能达到最大速度。
以下是一个范例,仅供参考:
$PS=New-PSSession -HostName PCB -KeyFilePath d:\id_rsa
$scripts = {
$schaction = New-ScheduledTaskAction -Execute "robocopy" -Argument "\\Server\Share\Test D:\Test\ *.*";
$schtrigger = New-ScheduledTaskTrigger -AtLogOn;
$schUser = (Get-CimInstance -ClassName win32_ComputerSystem).UserName;
Register-ScheduledTask -TaskName "copy" -Trigger $schtrigger -User $schUser -Action $schaction;
Start-ScheduledTask -TaskName "copy";
}
Invoke-Command -Session $PS -ScriptBlock $scripts
这段代码的意思就是PCB从Server服务器上面的Share\Test文件夹下载到D盘目录下的Test下面,其实通过这个简单的范例可以推导出很多不方便的操作,其实都可以通过调用任务计划来实现
方法二、
对于网络文件共享,有很多使用的是SMB协议,平常在Windows的地址直接输入\\Server\Share这种方式就是使用SMB协议,既然知道了是通过这种协议,那么我们就可以通过使用PowerShare里面的smbshare这个模块来实现
以下是使用smbshare来实现的一个范例
$ps=New-PSSession -HostName PCB -KeyFilePath D:\id_rsa
$scripts={
New-SmbMapping -LocalPath "K:" -RemotePath "\\Server\Share" -UserName "administrator" -Password "";
robocopy K:\Test D:\ smbshare.txt *.*;
}
Invoke-Command -Session $ps -ScriptBlock $scripts
这段代码的意思就是先在PCB机子上面创建远程服务器文件映射到本地的K盘,K盘相对应的是Server服务器上面的Share文件夹,然后把Share目录下的Test整个文件夹拷贝到PCB机子上面D盘
注:如果要删除SmbMapping的话,发现直接使用Remove-SmbMapping无效,再Get-SmbMapping依然存在,这个时候可以使用
net use * /del /y,把所有的磁盘映射都删除。