ค้นหาเว็บไซต์

ใช้ 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.service

PSRemoting ผ่าน SSH พร้อมตัวอย่าง

ตอนนี้คุณสามารถเชื่อมต่อกับโฮสต์ Windows หรือ Linux ที่กำหนดค่าโดยใช้ PowerShell ผ่าน SSH ในการเข้าถึงคอมพิวเตอร์ระยะไกลผ่าน SSH จะใช้ cmdlets เดียวกันกับใน WinRM:

  • New-PSSession
  • Enter-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) และกำหนดค่าได้ง่าย

บทความที่เกี่ยวข้อง