ใช้ PowerShell ระยะไกลผ่าน SSH
ใน Windows PowerShell เวอร์ชันคลาสสิก (สูงสุด 5.1) คุณสามารถใช้เฉพาะโปรโตคอล WinRM (WSMan, พอร์ต 5985/5986) เพื่อเข้าถึงคอมพิวเตอร์ระยะไกลโดยใช้ PSRemoting ใน PowerShell Core 7.x และ 6.x เวอร์ชันข้ามแพลตฟอร์มที่ใหม่กว่า คุณสามารถใช้ SSH สำหรับ PowerShell จากระยะไกล ระหว่างคอมพิวเตอร์ ลองกำหนดค่า PSRemoting ผ่าน SSH เพื่อเชื่อมต่อกับโฮสต์ Windows, Linux หรือ macOS
เปิดใช้งาน SSH PowerShell Remoting ใน Windows
มาดูวิธีกำหนดค่าเซิร์ฟเวอร์ SSH บนฝั่งไคลเอ็นต์ของ Windows เพื่อเปิดใช้งาน PowerShell Remoting
ขั้นแรก ให้เปิดใช้งานเซิร์ฟเวอร์ OpenSSH ในตัวบน Windows 10 (เวอร์ชัน 1809 หรือใหม่กว่า) และ Windows Server 2019 ติดตั้งเซิร์ฟเวอร์ SSH ด้วยคำสั่งต่อไปนี้ (ใน Windows 10 หรือ 11):
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0ติดตั้ง PowerShell Core เวอร์ชันล่าสุดด้วย:
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"จากนั้นเปิดใช้งานการเริ่มต้นอัตโนมัติสำหรับบริการ sshd โดยใช้บริการการจัดการ PowerShell cmdlets:
Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd
ตรวจสอบให้แน่ใจว่า Windows กำลังฟังพอร์ต TCP/22 (SSH):
Get-NetTCPConnection -State Listen|where {$_.localport -eq '22'}อนุญาตการเชื่อมต่อ SSH ขาเข้าในไฟร์วอลล์ Windows Defender:
Enable-NetFirewallRule -Name *OpenSSH-Server*จากนั้นเปิดไฟล์การกำหนดค่า C:\ProgramData\ssh\sshd_config:
notepad $Env:ProgramData\ssh\sshd_configเปิดใช้งานการตรวจสอบรหัสผ่าน SSH โดยยกเลิกการแสดงความคิดเห็นในบรรทัดต่อไปนี้:
PasswordAuthentication yesคุณยังสามารถอนุญาตการเข้าถึง SSH โดยใช้คีย์:
PubkeyAuthentication yesเพิ่มบรรทัดด้านล่างในไฟล์ มันจะเรียกใช้ล่าม pwsh.exe สำหรับการเชื่อมต่อ SSH ระยะไกล:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogoบันทึกไฟล์ sshd_config และเริ่มบริการ sshd ใหม่:
restart-service sshdวิธีเปิดใช้งาน PowerShell SSH Remoting บน Linux
ตอนนี้มาดูวิธีกำหนดค่าโฮสต์ Linux สำหรับ PowerShell Remoting ผ่าน SSH
ติดตั้ง PowerShell Core บน Linux distro ตามคำแนะนำนี้ ฉันใช้คำสั่งต่อไปนี้สำหรับโฮสต์ Ubuntu 20.04 ของฉัน:
$ sudo apt-get update -y
$ wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update
$ sudo apt-get install powershell -y
ติดตั้งเซิร์ฟเวอร์ OpenSSH (หากไม่ได้ติดตั้ง):
$ sudo apt install openssh-serverเพิ่มบรรทัดด้านล่างใน /etc/ssh/sshd_config:
PasswordAuthentication yes
Subsystem powershell /usr/bin/pwsh -sshs -NoLogoเริ่มบริการ ssh ใหม่:
sudo systemctl restart sshd.servicePSRemoting ผ่าน SSH พร้อมตัวอย่าง
ตอนนี้คุณสามารถเชื่อมต่อกับโฮสต์ Windows หรือ Linux ที่กำหนดค่าโดยใช้ PowerShell ผ่าน SSH ในการเข้าถึงคอมพิวเตอร์ระยะไกลผ่าน SSH จะใช้ cmdlets เดียวกันกับใน WinRM:
New-PSSessionEnter-PSSession- เพื่อสร้างเซสชัน PowerShell แบบโต้ตอบกับโฮสต์ระยะไกล
Invoke-Command- เพื่อเรียกใช้คำสั่งหรือสคริปต์ PS1 จากระยะไกล
ตามค่าเริ่มต้น cmdlet เหล่านี้กำลังพยายามใช้ WinRM เพื่อเชื่อมต่อกับคอมพิวเตอร์ระยะไกล หากต้องการใช้การขนส่ง SSH คุณควรใช้ตัวเลือกการเชื่อมต่ออื่นๆ (มีให้ใน PowerShell Core ดังนั้นคุณต้องเรียกใช้จาก
pwsh.exeพร้อมท์).
ตัวเลือก -HostName (แทน -ComputerName) และ -UserName (แทน -Credential) ช่วยให้สามารถตั้งชื่อคอมพิวเตอร์และผู้ใช้สำหรับการเชื่อมต่อ SSH เมื่อใช้พารามิเตอร์ -KeyFilePath คุณสามารถระบุคีย์ SSH สำหรับการรับรองความถูกต้อง (ไม่บังคับ) คุณยังสามารถใช้พารามิเตอร์ -SSHTransport เพื่อเปิดใช้งานการขนส่ง SSH สำหรับการรับส่งข้อมูล PowerShell อย่างชัดเจน
ลองเชื่อมต่อกับคอมพิวเตอร์ระยะไกลแบบโต้ตอบจาก Windows โดยใช้ไคลเอนต์ SSH ในตัว:
Enter-PSSession -HostName 192.168.50.20 -UserName maxbakในการเชื่อมต่อ ก็เพียงพอแล้วที่จะยืนยันลายนิ้วมือ SSH ของเซิร์ฟเวอร์และป้อนรหัสผ่านของผู้ใช้ที่ได้รับอนุญาตให้เชื่อมต่อจากระยะไกล
คุณสามารถสร้างเซสชัน PowerShell ถาวรหลายเซสชันไปยังคอมพิวเตอร์ระยะไกลและดำเนินการคำสั่งบน SSH:
$session1 = New-PSSession -HostName 192.168.50.20 -UserName maxbak -SSHTransport
$session2 = New-PSSession -HostName 192.168.54.44 -UserName root -SSHTransportหากต้องการเรียกใช้คำสั่งบนคอมพิวเตอร์หลายเครื่องพร้อมกัน ให้ใช้คำสั่งด้านล่าง:
Invoke-Command -Session $session1, $session2 -ScriptBlock { $PSVersionTable| select OS, PSVersion}| Select-Object PSComputerName, PSVersion, OSในตัวอย่างนี้ เราเรียกใช้คำสั่งทั้งบนคอมพิวเตอร์ Windows และ Linux และแสดงผลลัพธ์ในคอนโซล
ใน PowerShell Core 7.1 และใหม่กว่านั้น PSRemoting รองรับการกระโดดสองครั้งไปยังคอมพิวเตอร์ระยะไกลเครื่องอื่นจากเซสชันที่มีอยู่
คุณสามารถระบุเซสชัน SSH ได้หลายเซสชันในตัวเลือกและรับรองความถูกต้องโดยใช้คีย์ RSA:
$sshConnections = @{HostName="winsrv1"; UserName="a-d\maxbak"; KeyFilePath="c:\users\maxbak\id_rsa" }, @{ HostName="root@ubunsrv1"; KeyFilePath="c:\vault\ubunsrv1_id_rsa" }
New-PSSession -SSHConnection $sshConnectionsข้อ จำกัด ที่สำคัญของ PowerShell Remoting ผ่าน SSH:
ไม่รองรับโปรไฟล์ PowerShell;
ในเซสชันระยะไกลกับโฮสต์ Linux ไม่รองรับ sudo (เมื่อรัน ข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper);
ไม่รองรับการดูแลระบบแบบพอเพียง (JEA)
อย่างที่คุณเห็น การกำหนดค่า PowerShell Remoting ผ่าน SSH นั้นง่ายกว่าผ่าน WinRM HTTPS นอกจากนี้ คุณสามารถใช้วิธีการเชื่อมต่อนี้เพื่อเชื่อมต่อกับคอมพิวเตอร์ในเวิร์กกรุ๊ปโดยใช้ PowerShell โดยไม่ต้องเพิ่มไปยัง TrustedHost
PowerShell Remoting ผ่าน SSH เป็นทางเลือกที่ปลอดภัยและง่ายสำหรับ WinRM PSremoting ผ่าน SSH รองรับบนทุกแพลตฟอร์ม (Windows, Linux, macOS) พอร์ตเพิ่มเติมที่จะเปิด (ยกเว้น TCP/22 SSH) และกำหนดค่าได้ง่าย



