Akses jarak jauh PowerShell melalui SSH
Gambaran Umum
PowerShell jarak jauh biasanya menggunakan WinRM untuk negosiasi koneksi dan transportasi data. SSH sekarang tersedia untuk platform Linux dan Windows dan memungkinkan PowerShell multiplatform jarak jauh asli.
WinRM menyediakan model hosting yang kuat untuk sesi jarak jauh PowerShell. Jarak jauh berbasis SSH saat ini tidak mendukung konfigurasi titik akhir jarak jauh dan Just Enough Administration (JEA).
Jarak jauh SSH memungkinkan Anda melakukan remoting sesi PowerShell dasar antara komputer Windows dan Linux. Jarak jauh SSH membuat proses host PowerShell pada komputer target sebagai subsistem SSH. Akhirnya kita akan menerapkan model hosting umum, mirip dengan WinRM, untuk mendukung konfigurasi titik akhir dan JEA.
New-PSSession
Cmdlet , Enter-PSSession
, dan Invoke-Command
sekarang memiliki parameter baru yang diatur untuk mendukung koneksi jarak jauh baru ini.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Untuk membuat sesi jarak jauh, Anda menentukan komputer target dengan parameter HostName dan memberikan nama pengguna dengan UserName. Saat menjalankan cmdlet secara interaktif, Anda akan dimintai kata sandi. Anda juga dapat menggunakan autentikasi kunci SSH menggunakan file kunci privat dengan parameter KeyFilePath . Membuat kunci untuk autentikasi SSH bervariasi menurut platform.
Informasi penyiapan umum
PowerShell 6 atau lebih tinggi, dan SSH harus diinstal di semua komputer. Instal klien SSH (ssh.exe
) dan server (sshd.exe
) sehingga Anda dapat jarak jauh ke dan dari komputer. OpenSSH untuk Windows sekarang tersedia di Windows 10 build 1809 dan Windows Server 2019. Untuk informasi selengkapnya, lihat Mengelola Windows dengan OpenSSH. Untuk Linux, instal SSH, termasuk server sshd, yang sesuai untuk platform Anda. Anda juga perlu menginstal PowerShell dari GitHub untuk mendapatkan fitur jarak jauh SSH.
Server SSH harus dikonfigurasi untuk membuat subsistem SSH untuk menghosting proses PowerShell di komputer jarak jauh. Dan, Anda harus mengaktifkan kata sandi atau autentikasi berbasis kunci.
Menginstal layanan SSH di komputer Windows
Instal PowerShell versi terbaru. Untuk informasi selengkapnya, lihat Menginstal PowerShell di Windows.
Anda dapat mengonfirmasi bahwa PowerShell memiliki dukungan jarak jauh SSH dengan mencantumkan
New-PSSession
set parameter. Anda akan melihat ada nama set parameter yang dimulai dengan SSH. Kumpulan parameter tersebut mencakup parameter SSH .(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Instal Win32 OpenSSH terbaru. Untuk petunjuk penginstalan, lihat Mulai menggunakan OpenSSH.
Catatan
Jika Anda ingin mengatur PowerShell sebagai shell default untuk OpenSSH, lihat Mengonfigurasi Windows untuk OpenSSH.
Edit file yang
sshd_config
terletak di$env:ProgramData\ssh
.Pastikan autentikasi kata sandi diaktifkan:
PasswordAuthentication yes
Buat subsistem SSH yang menghosting proses PowerShell di komputer jarak jauh:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
Catatan
Mulai dari PowerShell 7.4, Anda tidak perlu lagi menggunakan
-nologo
parameter saat menjalankan PowerShell dalam mode server SSH.Catatan
Lokasi default executable PowerShell adalah
c:/progra~1/powershell/7/pwsh.exe
. Lokasi dapat bervariasi tergantung pada cara Anda menginstal PowerShell.Anda harus menggunakan nama pendek 8.3 untuk jalur file apa pun yang berisi spasi. Ada bug di OpenSSH untuk Windows yang mencegah ruang bekerja di jalur yang dapat dieksekusi subsistem. Untuk informasi lebih lanjut, lihat masalah GitHub ini.
Nama pendek 8.3 untuk
Program Files
folder di Windows biasanyaProgra~1
. Namun, Anda dapat menggunakan perintah berikut untuk memastikan:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
EightDotThreeFileName --------------------- c:\progra~1
Secara opsional, aktifkan autentikasi kunci:
PubkeyAuthentication yes
Untuk informasi selengkapnya, lihat Mengelola Kunci OpenSSH.
Mulai ulang layanan sshd.
Restart-Service sshd
Tambahkan jalur tempat OpenSSH diinstal ke variabel lingkungan Jalur Anda. Contohnya,
C:\Program Files\OpenSSH\
. Entri ini memungkinkanssh.exe
untuk ditemukan.
Menginstal layanan SSH di komputer Linux Ubuntu
Instal versi terbaru PowerShell, lihat Menginstal PowerShell di Ubuntu.
Instal Ubuntu OpenSSH Server.
sudo apt install openssh-client sudo apt install openssh-server
sshd_config
Edit file di lokasi/etc/ssh
.Pastikan autentikasi kata sandi diaktifkan:
PasswordAuthentication yes
Secara opsional, aktifkan autentikasi kunci:
PubkeyAuthentication yes
Untuk informasi selengkapnya tentang membuat kunci SSH di Ubuntu, lihat manpage untuk ssh-keygen.
Tambahkan entri subsistem PowerShell:
Subsystem powershell /usr/bin/pwsh -sshs -nologo
Catatan
Lokasi default executable PowerShell adalah
/usr/bin/pwsh
. Lokasi dapat bervariasi tergantung pada cara Anda menginstal PowerShell.Catatan
Mulai dari PowerShell 7.4, Anda tidak perlu lagi menggunakan
-nologo
parameter saat menjalankan PowerShell dalam mode server SSH.Mulai ulang layanan ssh.
sudo systemctl restart sshd.service
Menginstal layanan SSH di komputer macOS
Instal PowerShell versi terbaru. Untuk informasi selengkapnya, Menginstal PowerShell di macOS.
Pastikan SSH Remoting diaktifkan dengan mengikuti langkah-langkah berikut:
- Buka
System Settings
. - Klik
General
- Klik .
Sharing
- Periksa
Remote Login
untuk mengaturRemote Login: On
. - Izinkan akses ke pengguna yang sesuai.
- Buka
sshd_config
Edit file di lokasi/private/etc/ssh/sshd_config
.Gunakan editor teks seperti nano:
sudo nano /private/etc/ssh/sshd_config
Pastikan autentikasi kata sandi diaktifkan:
PasswordAuthentication yes
Tambahkan entri subsistem PowerShell:
Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
Catatan
Lokasi default executable PowerShell adalah
/usr/local/bin/pwsh
. Lokasi dapat bervariasi tergantung pada cara Anda menginstal PowerShell.Catatan
Mulai dari PowerShell 7.4, Anda tidak perlu lagi menggunakan
-nologo
parameter saat menjalankan PowerShell dalam mode server SSH.Secara opsional, aktifkan autentikasi kunci:
PubkeyAuthentication yes
Mulai ulang layanan sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Catatan
Saat Anda meningkatkan sistem operasi, file konfigurasi SSH mungkin ditimpa. Pastikan Anda memeriksa file konfigurasi setelah peningkatan.
Autentikasi
PowerShell jarak jauh melalui SSH bergantung pada pertukaran autentikasi antara klien SSH dan layanan SSH dan tidak menerapkan skema autentikasi itu sendiri. Hasilnya adalah bahwa setiap skema autentikasi yang dikonfigurasi termasuk autentikasi multifaktor ditangani oleh SSH dan independen dari PowerShell. Misalnya, Anda dapat mengonfigurasi layanan SSH untuk memerlukan autentikasi kunci publik dan kata sandi satu kali untuk keamanan tambahan. Konfigurasi autentikasi multifaktor berada di luar cakupan dokumentasi ini. Lihat dokumentasi untuk SSH tentang cara mengonfigurasi autentikasi multifaktor dengan benar dan memvalidasinya berfungsi di luar PowerShell sebelum mencoba menggunakannya dengan PowerShell jarak jauh.
Catatan
Pengguna mempertahankan hak istimewa yang sama dalam sesi jarak jauh. Artinya, Administrator memiliki akses ke shell yang ditinggikan, dan pengguna normal tidak.
Contoh jarak jauh PowerShell
Cara term mudah untuk menguji jarak jauh adalah dengan mencobanya pada satu komputer. Dalam contoh ini, kami membuat sesi jarak jauh kembali ke komputer Linux yang sama. Kami menggunakan cmdlet PowerShell secara interaktif sehingga kami melihat perintah dari SSH yang meminta untuk memverifikasi komputer host dan meminta kata sandi. Anda dapat melakukan hal yang sama pada komputer Windows untuk memastikan jarak jauh berfungsi. Kemudian, jarak jauh antar komputer dengan mengubah nama host.
Linux ke Linux
$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
Linux ke Windows
Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]
Windows ke Windows
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>
Batasan
Perintah sudo tidak berfungsi dalam sesi jarak jauh ke komputer Linux.
PSRemoting melalui SSH tidak mendukung Profil dan tidak memiliki akses ke
$PROFILE
. Setelah dalam sesi, Anda dapat memuat profil dengan melakukan sumber profil dengan jalur file lengkap. Ini tidak terkait dengan profil SSH. Anda dapat mengonfigurasi server SSH untuk menggunakan PowerShell sebagai shell default dan memuat profil melalui SSH. Lihat dokumentasi SSH untuk informasi selengkapnya.Sebelum PowerShell 7.1, jarak jauh melalui SSH tidak mendukung sesi jarak jauh hop kedua. Kemampuan ini terbatas pada sesi menggunakan WinRM. PowerShell 7.1 memungkinkan
Enter-PSSession
danEnter-PSHostProcess
bekerja dari dalam sesi jarak jauh interaktif apa pun.