1. 程式人生 > 實用技巧 >PowerShell遠端會話之大檔案傳輸

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下面