iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
DevOps

《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》系列 第 21

Day 21 - 工作階段:更輕鬆的遠端控制

  • 分享至 

  • xImage
  •  

對應 30天挑戰精通 PowerShell 該書第 18 章。

之前講到了使用 Invoke-Command 進行一對多及透過 Enter-PSSession 進行一對一的遠端操作,今天將介紹第三種使用遠端操作的方式:

「隱含遠端操作」( implicit remoting ),它能讓你能夠從「遠端電腦」匯入「模組」到你的工作階段中,來加入代理命令( proxy command )。
Reference - P.285

首先,當使用 Invoke-Command 或是 Enter-PSSession 時,你不需要每次操作時都指定其電腦名稱、認證資訊以及不同的 Port 號,而是建立一個可重複使用的工作階段(Session),可以大幅提升效率。這樣你就不需要每次都重新建立連線,節省時間和系統資源。

可以透過 Get-Help 看到這兩個 cmdlet 都支援 Session 這個參數,其意義是讓它使用你建立好的 Session 去進行操作。

get-help Invoke-Command -Parameter Session
get-help Enter-PSSession -Parameter Session

18.1 建立並使用可重複使用的工作階段

工作階段( Session )是指你的 PowerShell 和遠端 PowerShell 之間的長期連線。當工作階段處於啓動狀態時,你的電腦和遠端電腦都會分配一小部分記憶體和處理器時間來維持這個連線。不過,在連線中所需要的網路流量很少。PowerShell 會保留你開啟的工作階段清單,你可以使用這些工作階段來呼叫命令,或是進入一個遠端的 shell。
Reference - P.286

建立工作階段

使用 New-PSSession ,透過 -ComputerName 時,若在同網域可使用電腦名稱,若非同網域,則可以使用 IP 進行連線,這裏它預設使用的協定是 WinRM,但你可以透過使用 -HostName 改用 SSH 協定,兩者結果都會產生 Session Object 並存放在 PowerShell 的記憶體裡。
而我們嘗試要透過 New-PSSession 連線之前,讓我梳理一下如何在連線時,依據不同情境提供不同的認證方式:

建立認證當目標為 Remote Window Server 時

可以透過建立 加密的 XML 檔案 來安全地儲存遠端伺服器的帳號和密碼。在連線時,使用 Import-CliXml 將 XML 檔案中的內容匯入,生成一個 PSCredential 物件,然後在 New-PSSession 命令中透過 -Credential 參數傳入該物件。

1. 建立並加密儲存憑證物件:

假設遠端伺服器的帳號是 ubuntu ,遠端伺服器的密碼是 1234 ,我們要將 XML 檔案儲存在 /Users/kanglin/code/30days/credentialA.xml
提醒:Export-CliXml 會使用 Windows DPAPI 來加密敏感資訊(如密碼)。只有在 相同的使用者帳戶和電腦 上才能解密。

# 提示輸入密碼,建立 PSCredential 物件
$credential = Get-Credential -UserName "ubuntu" -Message "請輸入遠端伺服器的密碼:"

# 將憑證物件加密匯出到 XML 檔案
$credential | Export-CliXml -Path "/Users/kanglin/code/30days/credentialA.xml"

2. 匯入憑證物件並建立遠端會話:

# 從 XML 檔案匯入加密的 PSCredential 物件
$credential = Import-CliXml -Path "C:\Path\To\credential.xml"

# 使用匯入的憑證建立新的遠端會話
$session = New-PSSession -ComputerName "192.168.1.201" -Credential $credential

建立認證當目標為 Remote Linux Server 時

1. [remote]先確保遠端 Linux server 有安裝 pwsh ( PowerShell )

我使用的 server 為 Ubuntu 20.04。

# 更新軟體包列表
sudo apt update

# 安裝必要的軟體
sudo apt install -y wget apt-transport-https software-properties-common

# 下載 Microsoft 的 GPG 金鑰
wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb

# 註冊 Microsoft 的 GPG 金鑰
sudo dpkg -i packages-microsoft-prod.deb

# 再次更新軟體包列表
sudo apt update

# 安裝 PowerShell
sudo apt install -y powershell

2. [remote]配置 SSHD 以使用 PowerShell 子系統

為了能讓我從本地端透過 ssh 連線到 remote server 的 pwsh,需要設定 sshd config。

sudo vim /etc/ssh/sshd_config

進入到 sshd_config 後,在最後ㄧ行添加以下指令後,存檔。

Subsystem   powershell   /usr/bin/pwsh -sshs -NoLogo -NoProfile

3. [remote]重新啟動 SSHD 服務

sudo systemctl restart sshd

4. [local] 生成 SSH 金鑰

ssh-keygen -t rsa -b 4096

5. [local] 將公鑰複製到遠端主機

當做完這一步,之後建立 PSSession 連線時,就不需要再輸入驗證了。

ssh-copy-id ubuntu@192.168.1.202

6. [local] 建立 Session

$session = New-PSSession -HostName "ubuntu@192.168.1.202"

18.2 結合工作階段物件使用 Enter-PSSession

$session = Get-PSSession | Where-Object { $_.Id -eq 17 }

Enter-PSSession -session $session

https://ithelp.ithome.com.tw/upload/images/20241005/20168708AQTnoG9QE7.png


18.3 結合工作階段物件使用 Invoke-Command

# 僅建立 Session
New-PSSession -HostName "ubuntu@192.168.1.202"

# 取得 Session
$session = Get-PSSession | Where-Object { $_.Id -eq 17 }

# 使用 Session
Invoke-Command -Session $session -ScriptBlock { get-process }

https://ithelp.ithome.com.tw/upload/images/20241005/20168708WIJ7ocSH2E.png


18.4 隱含遠端操作:匯入工作階段

隱含遠端操作 是 PowerShell 中的一種技術,它允許你在本地端使用來自遠端電腦的模組或指令,而無需直接在遠端機器上逐一執行命令。通過隱含遠端操作,你可以將遠端電腦上的 PowerShell 模組匯入到本地端,並且在本地就像使用本機模組一樣使用這些指令,實際上這些指令仍然是在遠端執行。
這個技術特別適合於管理遠端系統資源,如 Active Directory 或其他遠端服務,而不需要你每次都進行遠端登錄。

如何使用隱含遠端操作

1. 建立遠端會話

先透過 New-PSSession 建立與遠端電腦的連線。

$session = New-PSSession -ComputerName 192.168.1.201 -Credential (Get-Credential)

2. 匯入遠端模組

使用 Import-PSSession 匯入 remote server 上的模組。這步驟會將遠端模組的命令匯入到自己本地 PowerShell 會話中。

Import-PSSession -Session $session -Module ActiveDirectory

執行這個指令後,ActiveDirectory 模組的命令就可以在本地端可用,但實際上這些命令是在遠端執行。


18.5 使用已斷線的工作階段

透過下列的 cmdlet 就能將原本已經 Disconnected 的 Session 重新 Open 起來。

Get-PSSession -computerName COMPUTER2 | Connect-PSSession

書中也在這裡列出了一些關鍵設定已控制那些斷線的 Session,請參考下面表格:

設定檔位置 設定名稱 說明 預設值/範例
WSMan\localhost\shell IdleTimeout PowerShell 會話在無活動後自動終止的時間(毫秒) 7200000(2 小時)
WSMan\localhost\shell MaxConcurrentUsers 允許同時使用 PowerShell 會話的最大使用者數量 5
WSMan\localhost\shell MaxShellRunTime 每個 PowerShell 會話的最大執行時間 無限(如未特別設定)
WSMan\localhost\shell MaxShellsPerUser 每個使用者允許的同時 PowerShell 會話數量 25
WSMan\localhost\Service MaxConnections 允許的最大同時連接數量,針對整個 WSMan 服務(包括所有連接) 25
WSMan\localhost\Service MaxConcurrentUsers 整個 WSMan 服務允許的同時連接使用者數量 10
WSMan\localhost\Service MaxConcurrentOperationsPerUser 每個使用者可以同時運行的最大操作數量 25
WSMan\localhost\Service EnumerationTimeoutms WSMan 操作超時時間設定(毫秒) 60000

明日主題

Day 22 - 指令碼編寫 Part 1


上一篇
Day 20 - 互動指令碼的原理:Read-Host、Write-Host、Write-Output
下一篇
Day 22 - 指令碼編寫 Part 1
系列文
《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言