在運維當中,最經常要碰上文件在各個服務器之間的傳輸,而使用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,把所有的磁盤映射都刪除。