Aracılığıyla paylaş


SSH üzerinden PowerShell uzaktan iletişimi

Genel Bakış

PowerShell, uzak bağlantı için normalde bağlantı müzakeresi ve veri aktarımı amacıyla WinRM kullanır. SSH artık Linux ve Windows platformları için kullanılabilir ve gerçek çok platformlu PowerShell uzaktan iletişimini sağlar.

WinRM, PowerShell uzak oturumları için sağlam bir barındırma modeli sağlar. SSH tabanlı uzaktan bağlantı şu anda uzak uç nokta yapılandırmasını ve Yeterli Yönetim Özelliği'ni (JEA) desteklememektedir.

SSH uzaktan iletişim, Windows ve Linux bilgisayarlar arasında temel PowerShell oturumu uzaktan iletişimini gerçekleştirmenizi sağlar. SSH uzaktan iletişim, hedef bilgisayarda SSH alt sistemi olarak bir PowerShell konak işlemi oluşturur. Sonunda, uç nokta yapılandırmasını ve JEA'yı desteklemek için WinRM'ye benzer genel bir barındırma modeli uygulayacağız.

New-PSSession, Enter-PSSession ve Invoke-Command cmdlet'leri artık bu yeni uzaktan iletişim bağlantısını desteklemek için yeni bir parametre kümesine sahip.

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

Uzak oturum oluşturmak için hedef bilgisayarı HostName parametresiyle belirtir ve kullanıcı adını UserName ile sağlarsınız. Cmdlet'leri etkileşimli olarak çalıştırırken parola girmeniz istenir. KeyFilePath parametresiyle özel bir anahtar dosyası kullanarak SSH anahtarı kimlik doğrulamasını da kullanabilirsiniz. SSH kimlik doğrulaması için anahtar oluşturma, platforma göre değişir.

Genel kurulum bilgileri

PowerShell 6 veya üzeri ve SSH tüm bilgisayarlara yüklenmelidir. Bilgisayarlara uzaktan erişebilmek için hem SSH istemcisini (ssh.exe) hem de sunucuyu (sshd.exe) yükleyin. Windows için OpenSSH artık Windows 10 derleme 1809 ve Windows Server 2019'da kullanılabilir. Daha fazla bilgi için bkz. OpenSSH ile Windows'ı yönetme. Linux için, platformunuza uygun sshd sunucusu da dahil olmak üzere SSH'yi yükleyin. Ayrıca SSH uzaktan komut iletme özelliğini elde etmek için GitHub'dan PowerShell yüklemeniz gerekir. SSH sunucusu, uzak bilgisayarda bir PowerShell işlemini barındıracak bir SSH alt sistemi oluşturacak şekilde yapılandırılmalıdır. Ayrıca parolayı veya anahtar tabanlı kimlik doğrulamasını etkinleştirmeniz gerekir.

Windows bilgisayarına SSH hizmetini yükleme

  1. PowerShell'in en son sürümünü yükleyin. Daha fazla bilgi için bkz . Windows'a PowerShell Yükleme.

    Parametre kümelerini listeleyerek PowerShell'in SSH uzaktan iletişim desteğine New-PSSession sahip olduğunu onaylayabilirsiniz. SSH ile başlayan parametre kümesi adları olduğunu göreceksiniz. Bu parametre kümeleri SSH parametrelerini içerir.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. En son Win32 OpenSSH'yi yükleyin. Yükleme yönergeleri için bkz. OpenSSH kullanmaya başlama.

    Uyarı

    PowerShell'i OpenSSH için varsayılan kabuk olarak ayarlamak istiyorsanız bkz. OpenSSH için Windows Yapılandırma.

  3. konumunda sshd_configbulunan $Env:ProgramData\ssh dosyayı düzenleyin.

    • Parola kimlik doğrulamasının etkinleştirildiğinden emin olun:

      PasswordAuthentication yes
      
    • Uzak bilgisayarda bir PowerShell işlemini barındıran SSH alt sistemini oluşturun:

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

      Uyarı

      Windows için OpenSSH'de alt sistem yürütülebilir dosyası için boşluklar içeren bir yol kullanmanızı engelleyen bir hata var. Bu sorunu geçici olarak çözmenin iki yolu vardır:

      • PowerShell yürütülebilir yolu için Windows 8.3 stili kısa adı kullanma
      • PowerShell yürütülebilir dosyasının sembolik bağlantısını oluşturarak boşluksuz bir yol oluşturun

      Daha fazla bilgi için bkz. PowerShell/Win32-OpenSSH deposundaki sorun #784 .

      Yalnızca alanı içeren yolun kesimi için 8,3 stilindeki adı almanız gerekir. PowerShell 7 varsayılan olarak içinde C:\Program Files\PowerShell\7\yüklüdür. için Program Files 8,3 stilindeki ad olmalıdır progra~1. Adı doğrulamak için aşağıdaki komutu kullanabilirsiniz:

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

      8.3 adı, NTFS dosya sisteminin devre dışı bırakılabilir eski bir özelliğidir. PowerShell'in yüklü olduğu birim için bu özelliğin etkinleştirilmesi gerekir.

      Alternatif olarak, PowerShell yürütülebilir dosyasının sembolik bağlantısını oluşturabilir ve bu da boşluksuz bir yol elde edebilirsiniz. Bu yöntem, PowerShell yürütülebilir dosyasının yolu da dosyanızı güncelleştirmeye gerek kalmadan değişirse bağlantıyı güncelleştirmenizi sshd_config sağladığından tercih edilir.

      Yürütülebilir dosyaya sembolik bir bağlantı oluşturmak için aşağıdaki komutu kullanın:

      $newItemSplat = @{
           ItemType = 'SymbolicLink'
           Path = 'C:\ProgramData\ssh\'
           Name = 'pwsh.exe'
           Value = (Get-Command pwsh.exe).Source
      }
      New-Item @newItemSplat
      

      Bu komut, konak anahtarlarını ve diğer yapılandırmayı depolamak için OpenSSH sunucusu tarafından kullanılan dizinde sembolik bağlantıyı oluşturur.

    • İsteğe bağlı olarak anahtar kimlik doğrulamasını etkinleştirin:

      PubkeyAuthentication yes
      

      Daha fazla bilgi için bkz. OpenSSH Anahtarlarını Yönetme.

  4. sshd hizmetini yeniden başlatın.

    Restart-Service sshd
    
  5. OpenSSH'nin yüklendiği yolu PATH ortam değişkeninize ekleyin. Örneğin, C:\Program Files\OpenSSH\. Bu giriş, ssh.exe öğesinin bulunmasına olanak tanır.

Ubuntu Linux bilgisayarına SSH hizmetini yükleme

  1. PowerShell'in en son sürümünü yükleyin, bkz . Ubuntu'da PowerShell'i yükleme.

  2. Ubuntu OpenSSH Sunucusu'nu yükleyin.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. sshd_config dosyasını /etc/ssh konumunda düzenleyin.

    • Parola kimlik doğrulamasının etkinleştirildiğinden emin olun:

      PasswordAuthentication yes
      
    • İsteğe bağlı olarak anahtar kimlik doğrulamasını etkinleştirin:

      PubkeyAuthentication yes
      

      Ubuntu'da SSH anahtarları oluşturma hakkında daha fazla bilgi için bkz. ssh-keygen için manpage.

    • PowerShell alt sistemi girdisi ekleyin:

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

      Uyarı

      PowerShell yürütülebilir dosyasının varsayılan konumudur /usr/bin/pwsh. Konum, PowerShell'i nasıl yüklediğinize bağlı olarak değişebilir.

  4. Ssh hizmetini yeniden başlatın.

    sudo systemctl restart sshd.service
    

SSH hizmetini macOS bilgisayara yükleme

  1. PowerShell'in en son sürümünü yükleyin. Daha fazla bilgi için macOS'a PowerShell yükleme.

    Aşağıdaki adımları izleyerek SSH Uzaktan İletişimi'nin etkinleştirildiğinden emin olun:

    1. System Settings'ı açın.
    2. General seçeneğine tıklayın
    3. Sharingöğesine tıklayın.
    4. Remote Logindenetleyin, Remote Login: On öğesini ayarlayın.
    5. Uygun kullanıcılara erişim izni verin.
  2. sshd_config dosyasını /private/etc/ssh/sshd_config konumunda düzenleyin.

    Nano gibi bir metin düzenleyicisi kullanın:

    sudo nano /private/etc/ssh/sshd_config
    
    • Parola kimlik doğrulamasının etkinleştirildiğinden emin olun:

      PasswordAuthentication yes
      
    • PowerShell alt sistemi girdisi ekleyin:

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

      Uyarı

      PowerShell yürütülebilir dosyasının varsayılan konumudur /usr/local/bin/pwsh. Konum, PowerShell'i nasıl yüklediğinize bağlı olarak değişebilir.

    • İsteğe bağlı olarak anahtar kimlik doğrulamasını etkinleştirin:

      PubkeyAuthentication yes
      
  3. sshd hizmetini yeniden başlatın.

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

Uyarı

İşletim sisteminizi yükselttiğinizde SSH yapılandırma dosyasının üzerine yazılabilir. Yükseltmeden sonra yapılandırma dosyasını denetlediğinizden emin olun.

Kimlik doğrulama

PowerShell'in SSH üzerinden uzaktan iletişimi, SSH istemcisi ile SSH sunucusu arasındaki kimlik doğrulama değişimine dayanır ve kendi başına hiçbir kimlik doğrulama şeması uygulamaz. Sonuç olarak, çok faktörlü kimlik doğrulaması dahil olmak üzere yapılandırılmış tüm kimlik doğrulama düzenleri SSH tarafından ve PowerShell'in bağımsız olarak işlenir. Örneğin, SSH hizmetini ortak anahtar kimlik doğrulaması ve ek güvenlik için tek seferlik parola gerektirecek şekilde yapılandırabilirsiniz. Çok faktörlü kimlik doğrulaması yapılandırması bu belgelerin kapsamı dışındadır. PowerShell uzaktan iletişimiyle kullanmayı denemeden önce, çok faktörlü kimlik doğrulaması konfigürasyonunu doğru yapma ve PowerShell dışında çalıştığını doğruladığınızdan emin olma konularında SSH belgelerine bakın.

Uyarı

Kullanıcılar uzak oturumlarda aynı ayrıcalıkları korur. Diğer bir deyişle, Yöneticiler yükseltilmiş bir kabuğa erişebilir ve normal kullanıcılar erişemeyebilir.

PowerShell uzaktan yönetim örneği

Uzaktan iletişimi test etmenin en kolay yolu, bunu tek bir bilgisayarda denemektir. Bu örnekte, aynı Linux bilgisayara bir uzak oturum oluşturuyoruz. PowerShell cmdlet'lerini etkileşimli olarak kullanıyoruz, bu nedenle SSH'den konak bilgisayarı doğrulamayı isteyen ve parola isteyen istemler görüyoruz. Uzaktan iletişimin çalıştığından emin olmak için Windows bilgisayarınızda da aynı şeyi yapabilirsiniz. Ardından, ana bilgisayar adını değiştirerek bilgisayarlar arasında uzaktan bağlantı kurun.

Linux'ten Linux'e

$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'ta Windows'a

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'tan Windows'a

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>

Sınırlamalar

  • Sudo komutu, Linux bilgisayarına uzak oturumda çalışmaz.

  • SSH üzerinden PSRemoting Profilleri desteklemez ve $PROFILE erişimi yoktur. Bir oturumda, profili tam dosya yolunu kullanarak profil dosyasını çalıştırarak yükleyebilirsiniz. Bu, SSH profilleriyle ilgili değildir. SSH sunucusunu varsayılan kabuk olarak PowerShell kullanacak ve SSH aracılığıyla bir profil yüklenecek şekilde yapılandırabilirsiniz. Daha fazla bilgi için SSH belgelerine bakın.

  • PowerShell 7.1'den önce SSH üzerinden uzaktan yönetim, ikinci aşama uzak oturumları desteklemiyordu. Bu özellik WinRM kullanan oturumlarla sınırlıydı. PowerShell 7.1, Enter-PSSession ve Enter-PSHostProcess herhangi bir etkileşimli uzak oturumdan çalışmasına olanak tanır.

Ayrıca bkz.