天天看點

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

MS 定義了一個叫做 WS-Management 的協定,這個協定為計算機裝置遠端交換管理資料提供了一個公開的标準。在 Windows 平台上,MS 通過 Windows 遠端管理服務(Windows Remote Management service,簡稱 WinRM) 實作了 WS-Management 協定。這就是我們可以通過 PowerShell 執行遠端操作的基礎,因為 PowerShell 就是通過 WinRM 服務來進行遠端操作的。

我們可以通過下面的指令檢視 WinRM 服務的狀态:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

伺服器版的 Windows 系統預設是啟動 WinRM 服務的,而普通版的系統預設則沒有啟動該服務。接下來我們将介紹如何以正确的姿勢啟動這個服務。

類似于 SSH 的用戶端/伺服器架構,隻需要在接受遠端指令的主機上配置 WinRM 服務就可以了。其實就是讓 WinRM 服務監聽一個端口,跟 SSH daemon 是一樣的! 

用管理者權限啟動 PowerShell,執行下面的指令:

然後再檢查 WinRM 服務就應該是運作狀态:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

或者:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

防火牆規則也發生了變化:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

Enable-PSRemoting 指令不僅啟動了 WinRM 服務,還幫我們設定好了防火牆規則。

如果你的計算機已經加入了域,那麼上面的配置就可以了。對于沒有加入域的計算機還需要進行信任設定,然後重新開機 WinRM 服務:

PowerShell 還提供了一個指令用來測試遠端主機是否開啟了遠端操作服務:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

上面圖中的指令成功傳回了,說明遠端主機上已經配置好了允許遠端通路的服務。如果傳回錯誤的消息,則說明遠端主機沒有打開遠端通路的服務。

這種方式類似于 SSH 的遠端連接配接。使用 SSH 用戶端建立一個到伺服器的連接配接(session),然後執行各種操作。這是 SSH 最基本的使用方式,PowerShell 也提供了類似的支援讓我們可以做同樣的事情。

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

輸入密碼就可以建立連接配接了:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

接下來就可以在遠端主機上執行任務了!

能夠在與遠端主機建立的 session 中執行任務是個很好的開始。但很多時候我們隻需要簡單的執行單個指令,甚至是在腳本中執行這樣的指令,怎麼辦呢?

我們可以通過 Invoke-Command 指令,并指定其 -ScriptBlock 參數完成這個任務:

執行上面的指令,并輸入使用者的密碼:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

雖然指令被執行了,但缺陷也很明顯:需要使用者輸入密碼,是以無法被寫到腳本中進行自動化操作。

使用下面的方法把密碼寫到指令中(這樣就可以自動化了):

有時候我們需要連續執行多個有關聯的指令,比如後一條指令會用到前一條指令的結果。此時再使用上面的方法就不行了。需要通過 session 來處理指令之間的聯系:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

當我們直接執行前兩個指令時,由于第二個指令中的 $p 沒有值,是以不能獲得結果。最後兩行的指令是通過同一個 session 執行的,是以它們可以共享變量,并最終獲得結果。

介紹了遠端執行指令的操作,再來介紹遠端執行腳本就容易多了。其實這才是自動化工作的核心部分:

我在 task.ps1 中建立了一個 test.txt 檔案,并把 PowerShell 的版本資訊添加到這個檔案中。運作上面的指令:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

然後在遠端機器上看有沒有檔案建立:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

一切看上去都很好,隻不過在實際應用中我們的腳本會更複雜而已!

同時在多台主機上做相同的操作會成倍的提升效率,這可以遠端操作的拿手好戲:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

上面圖中的指令同時在兩台遠端主機上執行,其實就是為 ComputerName 屬性指定多個目标而已!

重複一遍:真正的威力是執行腳本檔案:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

這次,我們同時在兩台遠端主機上執行了腳本檔案 task.ps1。

如果目标主機很多,還可以把它們寫到檔案中,然後通過下面的方式引用:

終于,PowerShell 在 5.x 的版本中開始支援遠端拷貝檔案了!先來看 demo:

上面的指令把本地目前目錄下的 task.ps1 檔案拷貝到遠端主機 xxxxxx 的 C 盤根目錄下。注意 Copy-Item 指令使用了一個 Session 對象作為參數,這個參數的名稱為 ToSession。我們可以猜測,檔案傳遞的方向就是由這個參數決定的:使用 ToSession 會把本地的檔案傳遞到遠端主機;使用 FromSession 則會把遠端主機上的檔案傳遞到本機。

再看一下如何拷貝整個目錄:

PowerShell 遠端執行任務基礎測試遠端連接配接建立遠端連接配接 Session遠端執行單個指令遠端執行多個指令遠端執行腳本在多個機器上執行相同的操作遠端拷貝檔案

注意目錄拷貝操作要加上 Recurse 參數。

上面的兩個操作分别是把一個檔案和一個目錄拷貝到遠端的主機上,接下來我們要把遠端主機上的檔案或檔案夾拷貝到本機來:

注意這裡使用的參數是 FromSession,是以指令中的 Destination 指定的是本地路徑。執行上面的指令,看看是不是已經把内容拷貝到本地的 F:\temp 目錄下了!

本文轉自帥氣的頭頭部落格51CTO部落格,原文連結http://blog.51cto.com/12902932/1949333如需轉載請自行聯系原作者

sshpp

繼續閱讀