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依然存在,这个时候可以使用

  Remove-SmbMapping -UpdateProfile -Force
  或者是

  net use * /del /y,把所有的磁盘映射都删除。

  

posted @ 2020-12-12 17:53  流云飞虹  阅读(1300)  评论(0编辑  收藏  举报