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

PowerShell ระยะไกลผ่าน SSH


ภาพรวม

โดยปกติแล้ว ระยะไกลของ PowerShell จะใช้ WinRM สำหรับการเจรจาการเชื่อมต่อและการถ่ายโอนข้อมูล SSH พร้อมใช้งานแล้วสำหรับแพลตฟอร์ม Linux และ Windows และอนุญาตให้ใช้งานระยะไกล PowerShell หลายแพลตฟอร์มได้อย่างแท้จริง

WinRM จัดเตรียมโมเดลโฮสติ้งที่มีประสิทธิภาพสำหรับเซสชันระยะไกลของ PowerShell การทำงานระยะไกลแบบ SSH ไม่รองรับการกำหนดค่าปลายทางระยะไกลและ Just Enough Administration (JEA) ในปัจจุบัน

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

New-PSSession, Enter-PSSession และ Invive-Command cmdlet ขณะนี้มีการตั้งค่าพารามิเตอร์ใหม่เพื่อรองรับการเชื่อมต่อระยะไกลใหม่นี้

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

หากต้องการสร้างเซสชันระยะไกล คุณต้องระบุคอมพิวเตอร์เป้าหมายด้วยพารามิเตอร์ HostName และระบุชื่อผู้ใช้ด้วย ชื่อผู้ใช้ เมื่อเรียกใช้ cmdlets แบบโต้ตอบ คุณจะได้รับพร้อมท์ให้ใส่รหัสผ่าน คุณยังสามารถใช้การตรวจสอบสิทธิ์คีย์ SSH โดยใช้ไฟล์คีย์ส่วนตัวที่มีพารามิเตอร์ KeyFilePath การสร้างคีย์สำหรับการตรวจสอบสิทธิ์ SSH จะแตกต่างกันไปตามแพลตฟอร์ม

ข้อมูลการตั้งค่าทั่วไป

PowerShell 6 หรือสูงกว่า และต้องติดตั้ง SSH ในคอมพิวเตอร์ทุกเครื่อง ติดตั้งทั้งไคลเอนต์ SSH (ssh.exe) และเซิร์ฟเวอร์ (sshd.exe) เพื่อให้คุณสามารถเข้าและออกจากคอมพิวเตอร์จากระยะไกลได้ OpenSSH สำหรับ Windows พร้อมใช้งานแล้วใน Windows 10 build 1809 และ Windows Server 2019 สำหรับข้อมูลเพิ่มเติม โปรดดูที่จัดการ Windows ด้วย OpenSSH สำหรับ Linux ให้ติดตั้ง SSH รวมถึงเซิร์ฟเวอร์ sshd ที่เหมาะกับแพลตฟอร์มของคุณ คุณต้องติดตั้ง PowerShell จาก GitHub เพื่อรับคุณสมบัติระยะไกล SSH ต้องกำหนดค่าเซิร์ฟเวอร์ SSH เพื่อสร้างระบบย่อย SSH เพื่อโฮสต์กระบวนการ PowerShell บนคอมพิวเตอร์ระยะไกล และคุณต้องเปิดใช้งานการตรวจสอบสิทธิ์ รหัสผ่าน หรือ ตามคีย์

ติดตั้งบริการ SSH บนคอมพิวเตอร์ Windows

  1. ติดตั้ง PowerShell เวอร์ชันล่าสุด สำหรับข้อมูลเพิ่มเติม โปรดดูที่การติดตั้ง PowerShell บน Windows

    คุณสามารถยืนยันได้ว่า PowerShell มีการสนับสนุนระยะไกล SSH โดยการแสดงรายการชุดพารามิเตอร์ New-PSSession คุณจะสังเกตเห็นว่ามีชื่อชุดพารามิเตอร์ที่ขึ้นต้นด้วย SSH ชุดพารามิเตอร์เหล่านั้นประกอบด้วยพารามิเตอร์ SSH

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. ติดตั้ง Win32 OpenSSH ล่าสุด สำหรับคำแนะนำในการติดตั้ง โปรดดูที่การเริ่มต้นใช้งาน OpenSSH

    บันทึก

    หากคุณต้องการตั้งค่า PowerShell เป็นเชลล์เริ่มต้นสำหรับ OpenSSH โปรดดูการกำหนดค่า Windows สำหรับ OpenSSH

  3. แก้ไขไฟล์ sshd_config ซึ่งอยู่ที่ $env:ProgramData\ssh

    ตรวจสอบให้แน่ใจว่าเปิดใช้งานการตรวจสอบรหัสผ่านแล้ว:

    PasswordAuthentication yes
    

    สร้างระบบย่อย SSH ที่โฮสต์กระบวนการ PowerShell บนคอมพิวเตอร์ระยะไกล:

    Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
    

    บันทึก

    ตั้งแต่ PowerShell 7.4 เป็นต้นไป คุณไม่จำเป็นต้องใช้พารามิเตอร์ -nologo อีกต่อไปเมื่อใช้งาน PowerShell ในโหมดเซิร์ฟเวอร์ SSH

    บันทึก

    ตำแหน่งเริ่มต้นของไฟล์ปฏิบัติการ PowerShell คือ c:/progra~1/powershell/7/pwsh.exe ตำแหน่งอาจแตกต่างกันไปขึ้นอยู่กับวิธีที่คุณติดตั้ง PowerShell

    คุณต้องใช้ชื่อย่อ 8.3 สำหรับพาธไฟล์ใดๆ ที่มีช่องว่าง มีข้อบกพร่องใน OpenSSH สำหรับ Windows ที่ทำให้ช่องว่างไม่สามารถทำงานได้ในเส้นทางปฏิบัติการของระบบย่อย สำหรับข้อมูลเพิ่มเติม โปรดดูปัญหา GitHub นี้

    ชื่อย่อ 8.3 สำหรับโฟลเดอร์ Program Files ใน Windows มักจะเป็น Progra~1 อย่างไรก็ตาม คุณสามารถใช้คำสั่งต่อไปนี้เพื่อให้แน่ใจว่า:

    Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    c:\progra~1
    

    ทางเลือก เปิดใช้งานการรับรองความถูกต้องของคีย์:

    PubkeyAuthentication yes
    

    สำหรับข้อมูลเพิ่มเติม โปรดดูที่การจัดการคีย์ OpenSSH

  4. เริ่มบริการ sshd ใหม่

    Restart-Service sshd
    
  5. เพิ่มเส้นทางที่ติดตั้ง OpenSSH ลงในตัวแปรสภาพแวดล้อม Path ของคุณ ตัวอย่างเช่น C:\Program Files\OpenSSH\ รายการนี้อนุญาตให้พบ ssh.exe

ติดตั้งบริการ SSH บนคอมพิวเตอร์ Ubuntu Linux

  1. ติดตั้ง PowerShell เวอร์ชันล่าสุด โปรดดูการติดตั้ง PowerShell บน Ubuntu

  2. ติดตั้งเซิร์ฟเวอร์ Ubuntu OpenSSH

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. แก้ไขไฟล์ sshd_config ที่ตำแหน่ง /etc/ssh

    ตรวจสอบให้แน่ใจว่าเปิดใช้งานการตรวจสอบรหัสผ่านแล้ว:

    PasswordAuthentication yes
    

    ทางเลือก เปิดใช้งานการรับรองความถูกต้องของคีย์:

    PubkeyAuthentication yes
    

    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสร้างคีย์ SSH บน Ubuntu โปรดดูที่ manpage สำหรับ ssh-keygen

    เพิ่มรายการระบบย่อย PowerShell:

    Subsystem powershell /usr/bin/pwsh -sshs -nologo
    

    บันทึก

    ตำแหน่งเริ่มต้นของไฟล์ปฏิบัติการ PowerShell คือ /usr/bin/pwsh ตำแหน่งอาจแตกต่างกันไปขึ้นอยู่กับวิธีที่คุณติดตั้ง PowerShell

    บันทึก

    ตั้งแต่ PowerShell 7.4 เป็นต้นไป คุณไม่จำเป็นต้องใช้พารามิเตอร์ -nologo อีกต่อไปเมื่อใช้งาน PowerShell ในโหมดเซิร์ฟเวอร์ SSH

  4. เริ่มบริการ ssh ใหม่

    sudo systemctl restart sshd.service
    

ติดตั้งบริการ SSH บนคอมพิวเตอร์ macOS

  1. ติดตั้ง PowerShell เวอร์ชันล่าสุด สำหรับข้อมูลเพิ่มเติม การติดตั้ง PowerShell บน macOS

    ตรวจสอบให้แน่ใจว่าเปิดใช้งาน SSH Remoting โดยทำตามขั้นตอนเหล่านี้:

    1. เปิด การตั้งค่าระบบ
    2. คลิกที่ ทั่วไป
    3. คลิกที่ การแบ่งปัน
    4. เลือก การเข้าสู่ระบบระยะไกล เพื่อตั้งค่า การเข้าสู่ระบบระยะไกล: เปิด
    5. อนุญาตให้เข้าถึงผู้ใช้ที่เหมาะสม
  2. แก้ไขไฟล์ sshd_config ที่ตำแหน่ง /private/etc/ssh/sshd_config

    ใช้โปรแกรมแก้ไขข้อความเช่น นาโน:

    sudo nano /private/etc/ssh/sshd_config
    

    ตรวจสอบให้แน่ใจว่าเปิดใช้งานการตรวจสอบรหัสผ่านแล้ว:

    PasswordAuthentication yes
    

    เพิ่มรายการระบบย่อย PowerShell:

    Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
    

    บันทึก

    ตำแหน่งเริ่มต้นของไฟล์ปฏิบัติการ PowerShell คือ /usr/local/bin/pwsh ตำแหน่งอาจแตกต่างกันไปขึ้นอยู่กับวิธีที่คุณติดตั้ง PowerShell

    บันทึก

    ตั้งแต่ PowerShell 7.4 เป็นต้นไป คุณไม่จำเป็นต้องใช้พารามิเตอร์ -nologo อีกต่อไปเมื่อใช้งาน PowerShell ในโหมดเซิร์ฟเวอร์ SSH

    ทางเลือก เปิดใช้งานการรับรองความถูกต้องของคีย์:

    PubkeyAuthentication yes
    
  3. เริ่มบริการ sshd ใหม่

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

บันทึก

เมื่อคุณอัพเกรดระบบปฏิบัติการ ไฟล์การกำหนดค่า SSH อาจถูกเขียนทับ ตรวจสอบให้แน่ใจว่าคุณตรวจสอบไฟล์การกำหนดค่าหลังการอัพเกรด

การรับรองความถูกต้อง

การดำเนินการระยะไกลของ PowerShell ผ่าน SSH อาศัยการแลกเปลี่ยนการรับรองความถูกต้องระหว่างไคลเอ็นต์ SSH และบริการ SSH และไม่ได้ใช้แผนการรับรองความถูกต้องใดๆ ผลลัพธ์ก็คือแผนการตรวจสอบสิทธิ์ที่กำหนดค่าไว้ รวมถึงการตรวจสอบสิทธิ์แบบหลายปัจจัยได้รับการจัดการโดย SSH และไม่ขึ้นอยู่กับ PowerShell ตัวอย่างเช่น คุณสามารถกำหนดค่าบริการ SSH ให้ต้องมีการตรวจสอบสิทธิ์คีย์สาธารณะและรหัสผ่านแบบใช้ครั้งเดียวเพื่อเพิ่มความปลอดภัย การกำหนดค่าการรับรองความถูกต้องแบบหลายปัจจัยอยู่นอกขอบเขตของเอกสารนี้ โปรดดูเอกสารประกอบสำหรับ SSH เกี่ยวกับวิธีกำหนดค่าการรับรองความถูกต้องแบบหลายปัจจัยอย่างถูกต้อง และตรวจสอบความถูกต้องว่าทำงานนอก PowerShell ก่อนที่จะพยายามใช้กับระยะไกลของ PowerShell

บันทึก

ผู้ใช้ยังคงมีสิทธิ์เหมือนเดิมในเซสชันระยะไกล หมายความว่าผู้ดูแลระบบสามารถเข้าถึงเชลล์ที่ยกระดับได้ และผู้ใช้ทั่วไปไม่สามารถเข้าถึงได้

ตัวอย่างระยะไกลของ PowerShell

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

ลินุกซ์ถึงลินุกซ์

$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
 Id Name   ComputerName    ComputerType    State    ConfigurationName     Availability
 -- ----   ------------    ------------    -----    -----------------     ------------
  1 SSH1   UbuntuVM1       RemoteMachine   Opened   DefaultShell             Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------    --------------
      0       0        0         19       3.23  10635 635 pwsh           UbuntuVM1
      0       0        0         21       4.92  11033 017 pwsh           UbuntuVM1
      0       0        0         20       3.07  11076 076 pwsh           UbuntuVM1

ลินุกซ์เป็นวินโดวส์

Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]

วินโดวส์เป็นวินโดวส์

C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable

Name                           Value
----                           -----
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1
BuildVersion                   3.0.0.0
CLRVersion
PSVersion                      6.0.0-alpha
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
GitCommitId                    v6.0.0-alpha.17


[WinVM2]: PS C:\Users\PSRemoteUser\Documents>

ข้อจำกัด

  • คำสั่ง sudo ไม่ทำงานในเซสชันระยะไกลกับคอมพิวเตอร์ Linux

  • PSRemoting ผ่าน SSH ไม่รองรับโปรไฟล์และไม่สามารถเข้าถึง $PROFILE เมื่ออยู่ในเซสชั่น คุณสามารถโหลดโปรไฟล์โดย dot จัดหาโปรไฟล์ด้วยพาธไฟล์แบบเต็ม สิ่งนี้ไม่เกี่ยวข้องกับโปรไฟล์ SSH คุณสามารถกำหนดค่าเซิร์ฟเวอร์ SSH ให้ใช้ PowerShell เป็นเชลล์เริ่มต้นและโหลดโปรไฟล์ผ่าน SSH ได้ ดูเอกสารประกอบ SSH สำหรับข้อมูลเพิ่มเติม

  • ก่อน PowerShell 7.1 การดำเนินการระยะไกลผ่าน SSH ไม่รองรับเซสชันระยะไกลแบบ Second-hop ความสามารถนี้จำกัดเฉพาะเซสชันที่ใช้ WinRM PowerShell 7.1 อนุญาตให้ Enter-PSSession และ Enter-PSHostProcess ทำงานจากภายในเซสชันระยะไกลแบบโต้ตอบใดๆ

ดูเพิ่มเติม

  • การติดตั้ง PowerShell บน Linux
  • การติดตั้ง PowerShell บน macOS
  • การติดตั้ง PowerShell บน Windows
  • จัดการ Windows ด้วย OpenSSH
  • การจัดการคีย์ OpenSSH
  • อูบุนตู SSH

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