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

อธิบายไคลเอ็นต์ PowerShell SSH และ Remoting


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

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

นอกจากนี้เรายังสามารถใช้ SSH ใน PowerShell เพื่อจัดการเครื่อง Windows อื่นจากระยะไกลได้ แต่คุณจะต้องใช้ PowerShell 6 หรือสูงกว่าเพื่อเรียกใช้เซิร์ฟเวอร์ SSH

ไคลเอนต์ PowerShell SSH

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

# type ssh and press enter
ssh

# Result:
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

เมื่อเปิด PowerShell คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลหรืออุปกรณ์เครือข่ายด้วยคำสั่งเดียว:

ssh <username>@<host_ip_address>

# For example:
ssh pi@192.168.1.210

คุณยังสามารถใช้ชื่อโฮสต์แทนที่อยู่ IP ได้ หากคุณไม่ระบุชื่อผู้ใช้ บัญชีผู้ใช้ภายในของคุณจะถูกใช้

เมื่อคุณกด Enter คุณจะต้องป้อนรหัสผ่านของผู้ใช้ SSH เมื่อคุณเชื่อมต่อกับอุปกรณ์เป็นครั้งแรก คุณจะต้องยอมรับรหัสของโฮสต์ เพียงกด Enter หรือพิมพ์ใช่

หากคุณมี SSH ทำงานบนพอร์ตอื่นที่ไม่ใช่พอร์ตเริ่มต้น 22 คุณสามารถเปลี่ยนหมายเลขพอร์ตได้โดยใช้แฟล็ก -P:

ssh <username>@<host_ip_address> -P <port_number>

# For example
ssh pi@192.168.1.210 -P 1022

PowerShell SSH Keygen

เซิร์ฟเวอร์หรือบริการระยะไกลบางแห่งอนุญาตให้เข้าถึง SSH โดยใช้คีย์ SSH เท่านั้น คุณจะต้องสร้างคีย์ SSH ในเครื่องและอัปโหลดคีย์ไปยังเซิร์ฟเวอร์ (หรือบริการ) เพื่อให้สามารถยืนยันคุณและสร้างการเชื่อมต่อที่ปลอดภัย

คีย์ SSH มีอยู่จากคีย์ส่วนตัวและสาธารณะ คุณจะต้องเก็บคีย์ส่วนตัวไว้ในเครื่องของคุณ (และตรวจสอบให้แน่ใจว่าคุณเก็บไว้กับตัวเอง) และคีย์สาธารณะจะถูกอัปโหลดไปยังเซิร์ฟเวอร์

PowerShell มีคีย์เจน SSH ในตัวที่คุณสามารถใช้เพื่อสร้างคีย์ใหม่ได้ พิมพ์คำสั่งต่อไปนี้เพื่อสร้างคีย์:

ssh-keygen -t Ed25519

# Result
Generating public/private Ed25519 key pair.
Enter file in which to save the key (C:\Users\lazyadmin/.ssh/id_ed25519): <press enter>

# It will ask for apassphrase, you can leave it empty - see below for more details
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

# Generated key
Your identification has been saved in C:\Users\lazyadmin/.ssh/id_ed25519.
Your public key has been saved in C:\Users\lazyadmin/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:1232131+ASdi123SscvBbwn9Qfxj0 lazyadmin@lab01
The key's randomart image is:
+--[ED25519 256]--+
| .o .            |
|..o+ .           |
|o..o .   o       |
|+..# o .         |
|=.+ =...S.       |
|.+.C.+. + E      |
|. *o@OO O. .     |
| = O*o  .        |
|. +++.           |
+----[SHA256]-----+

ตัวเลือก -t Ed25519 เป็นอัลกอริทึมใหม่ที่ใช้ในการสร้างคีย์ ในระบบเดิมอาจไม่รองรับสิ่งนี้ จากนั้นคุณสามารถใช้ระบบเข้ารหัส RSA รุ่นเก่าได้

ssh-keygen -b 4096 -t RSA

กุญแจจะถูกเก็บไว้ในโปรไฟล์ผู้ใช้ของคุณ เส้นทางจะแสดงอยู่ในเอาต์พุต แต่โดยทั่วไปแล้ว เส้นทางเหล่านั้นจะถูกบันทึกไว้ในตำแหน่งต่อไปนี้:

%userprofile%\.ssh

ข้อความรหัสผ่าน SSH Keygen

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

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

การเชื่อมต่อระยะไกล PowerShell กับ SSH

นอกจากนี้เรายังสามารถใช้ SSH ใน PowerShell เพื่อสร้างการเชื่อมต่อระยะไกลไปยังคอมพิวเตอร์หรือเซิร์ฟเวอร์เครื่องอื่น ซึ่งอาจอยู่ระหว่างคอมพิวเตอร์ Windows หรือ Windows-Linux และในทางกลับกัน

การสร้างเซสชันระยะไกล PowerShell ระหว่างเครื่อง Windows สองเครื่องสามารถทำได้ด้วย WinRM อยู่แล้ว แต่ตอนนี้คุณสามารถใช้ SSH เพื่อสร้างการเชื่อมต่อได้แล้ว ข้อดีของ SSH คือคุณสามารถใช้บน Windows, Linux และ macOS

คุณจะต้องใช้ PowerShell 6 หรือสูงกว่าเพื่อใช้ SSH สำหรับการเชื่อมต่อระยะไกลระหว่างเครื่อง Windows และ Linux ฉันใช้ PowerShell 7 ในตัวอย่างด้านล่าง

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

ขั้นตอนแรกคือการติดตั้ง เซิร์ฟเวอร์ OpenSSH บนคอมพิวเตอร์ Windows ของคุณ ตามที่กล่าวไว้ ขณะนี้ไคลเอ็นต์ SSH ได้รับการติดตั้งและเปิดใช้งานตามค่าเริ่มต้นแล้ว แต่เซิร์ฟเวอร์ SSH ไม่ใช่

คุณสามารถตรวจสอบว่าเซิร์ฟเวอร์ OpenSSH ได้รับการติดตั้งด้วย cmdlet ด้านล่างหรือไม่:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

# Result:
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

อย่างที่คุณเห็นไม่มีเซิร์ฟเวอร์ OpenSSH เราสามารถติดตั้ง/เปิดใช้งานด้วย PowerShell:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

ขั้นตอนต่อไปคือการเริ่มเซิร์ฟเวอร์ OpenSSH เนื่องจากเป็นบริการที่เราสามารถตั้งค่าให้เริ่มโดยอัตโนมัติ:

# Start the sshd service
Start-Service sshd

# Set the service to automatic start
Set-Service sshd -StartupType Automatic

กำหนดค่าเซิร์ฟเวอร์ SSH

เราจำเป็นต้องแก้ไขไฟล์การกำหนดค่า SSHD เพื่อให้เราสามารถตรวจสอบสิทธิ์ด้วยรหัสผ่านและใช้ PowerShell บนเครื่องระยะไกลได้

หากเราไม่ได้กำหนดค่าเซิร์ฟเวอร์ SSH เราจะสามารถใช้คำสั่งพื้นฐานบนเครื่องระยะไกลเท่านั้น (Windows Shell Prompt)

หากต้องการใช้ PowerShell cmdlets ทั้งหมดอย่างสมบูรณ์ เราจะต้องกำหนดค่าเซิร์ฟเวอร์ SSH เพื่อเพิ่ม PowerShell เป็นระบบย่อย

ไฟล์การกำหนดค่า SSHD จะถูกจัดเก็บไว้ในโฟลเดอร์ programdata เนื่องจากเราเปิด PowerShell ไว้แล้ว เราจะใช้มันเพื่อเปิดไฟล์การกำหนดค่า:

# Change the directory to the programdata folder> ssh
cd $env:ProgramData\ssh

# Open the configuration file in notepad
PS C:\ProgramData\ssh> notepad .\sshd_config

ในไฟล์การกำหนดค่า ลบ # หน้าบรรทัด PasswordAuthentication yes และเพิ่มบรรทัดต่อไปนี้ในไฟล์การกำหนดค่า (ตำแหน่งไม่สำคัญ แต่ฉันได้เพิ่มไว้ด้านล่างส่วน “# override default of no subsystems”)

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

เริ่มบริการ SSHD ใหม่เพื่อโหลดไฟล์การกำหนดค่าใหม่:

Restart-service sshd

ระยะไกล SSH ด้วย PowerShell

เมื่อติดตั้งเซิร์ฟเวอร์ SSH บนเซิร์ฟเวอร์ของเราแล้ว ตอนนี้เราสามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้โดยใช้ PowerShell บนไคลเอนต์ของเรา เราสามารถใช้ cmdlet เดียวกันกับการใช้ระยะไกลของ WinRM ความแตกต่างอยู่ที่ชื่อโฮสต์และชื่อคอมพิวเตอร์

  • ใหม่-PSSession
  • เข้าสู่ PSSession
  • เรียกใช้คำสั่ง

หากคุณใช้ New-PSSession -Computername โปรโตคอล WinRM จะถูกนำมาใช้ เมื่อคุณใช้พารามิเตอร์ -hostname แทน SSH จะถูกนำมาใช้

คุณสามารถเริ่มเซสชันระยะไกลของ PowerShell ใหม่ได้ดังนี้:

# Directly open a remoting session
Enter-PSSession -HostName la-srv-lab01 -UserName admin

# Create a new session
$session = New-PSSession -HostName la-srv-lab01 -UserName admin

# Invoke a command on the remote machine
Invoke-Command -Session $session -ScriptBlock {Get-Process -Name "Explorer"}

# Result:
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName   PSComputerName
 ------    -----      -----     ------      --  -- -----------   -------------
    517    49,78     122,99      24,83    3532   1 explorer      la-srv-lab01

นอกจากนี้ โปรดทราบว่าเราใช้พารามิเตอร์ -ชื่อผู้ใช้ แทน -Credentials เช่นเดียวกับวิธี WinRM

เราสามารถเรียกใช้คำสั่ง PowerShell ระยะไกลด้วย Intake-Command cmdlet หรือเปิด PowerShell บนเซิร์ฟเวอร์ด้วย Enter-PSSession

การจัดการการเชื่อมต่อ SSH หลายรายการ

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

ด้วย Windows Terminal คุณสามารถบรรลุสิ่งเดียวกันได้ Windows Terminal ใหม่ช่วยให้คุณจัดเก็บการเชื่อมต่อต่างๆ ได้อย่างง่ายดาย และใช้อินเทอร์เฟซบรรทัดคำสั่งที่แตกต่างกัน

หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ Winows Terminal โปรดอ่านบทความนี้ซึ่งฉันจะอธิบายรายละเอียดทั้งหมดเกี่ยวกับเทอร์มินัลอันทรงพลังนี้

ห่อขึ้น

การใช้ SSH กับ PowerShell นั้นสะดวกมากและไม่จำเป็นต้องใช้เครื่องมือพิเศษ (ไคลเอนต์ SSH) โดยส่วนตัวแล้วฉันใช้ PowerShell บ่อยครั้ง ดังนั้นเมื่อฉันต้องตรวจสอบหรือทำอะไรบางอย่างบนเซิร์ฟเวอร์ การเชื่อมต่ออย่างรวดเร็วจากหน้าต่าง PowerShell ของฉันจึงเป็นเรื่องง่ายมาก

ฉันหวังว่าบทความนี้จะมีประโยชน์ หากคุณมีคำถามใด ๆ โปรดแสดงความคิดเห็นด้านล่าง

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