PowerShell SSH İstemcisi ve Uzaktan İletişim Açıklaması


Uzak bir sunucuyu veya ağ cihazını yönetmeniz mi gerekiyor? O zaman muhtemelen bunları bağlamak ve yönetmek için SSH kullanıyorsunuzdur. SSH protokolü, güvenli olmayan bir ağ (internet) üzerinden uzaktaki bir cihaza güvenli bir şekilde bağlanmanıza olanak tanır. SSH'yi kullanmak için çoğu kişi Putty gibi bir SSH istemci aracı kullanır. Peki PowerShell'in yerleşik bir SSH İstemcisi'ne sahip olduğunu biliyor muydunuz?

PowerShell SSH istemcisi, Windows 10 1809 ve sonraki sürümlerde varsayılan olarak etkindir. Bu, artık favori komut satırı aracınızı kullanarak herhangi bir uzak cihaza kolayca bağlanabileceğiniz anlamına gelir.

Başka bir Windows makinesini uzaktan yönetmek için PowerShell'de SSH'yi de kullanabiliriz, ancak SSH sunucusunu çalıştırmak için PowerShell 6 veya üstünü kullanmanız gerekecektir.

PowerShell SSH İstemcisi

PowerShell'de SSH'yi kullanmanın en yaygın yolu SSH İstemcisi kullanmaktır. Windows'unuzu güncel tuttuğunuzu varsayarsak SSH'yi varsayılan olarak etkinleştirmiş olmanız gerekir. PowerShell'i açıp aşağıdaki komutu yazarak bunu kontrol edebilirsiniz:

# 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 açıkken uzak bir sunucuya veya ağ cihazına tek bir komutla bağlanabilirsiniz:

ssh <username>@<host_ip_address>

# For example:
ssh pi@192.168.1.210

IP Adresi yerine ana bilgisayar adını da kullanabilirsiniz. Kullanıcı adı belirtmezseniz yerel kullanıcı hesabınız kullanılacaktır.

Enter tuşuna bastığınızda SSH kullanıcısının şifresini girmeniz gerekecektir. Bir cihaza ilk kez bağlandığınızda, ana bilgisayarın anahtarını kabul etmeniz gerekecektir. Sadece enter tuşuna basın veya evet yazın.

Varsayılan bağlantı noktası 22'den farklı bir bağlantı noktasında çalışan SSH'niz varsa bağlantı noktası numarasını -P bayrağıyla değiştirebilirsiniz:

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

# For example
ssh pi@192.168.1.210 -P 1022

PowerShell SSH Anahtar Geni

Bazı uzak sunucular veya hizmetler yalnızca SSH anahtarı kullanılarak SSH erişimine izin verir. Sizi doğrulayabilmesi ve güvenli bir bağlantı oluşturabilmesi için yerel bir SSH anahtarı oluşturmanız ve anahtarı sunucuya (veya hizmetlere) yüklemeniz gerekecektir.

SSH Anahtarı özel ve genel bir anahtardan oluşur. Özel anahtarı yerel makinenizde saklamanız (ve bunu kendinize sakladığınızdan emin olmanız) ve genel anahtarın sunucuya yüklenmesi gerekir.

PowerShell, yeni bir anahtar oluşturmak için kullanabileceğiniz yerleşik bir SSH anahtar oluşturucusuna sahiptir. Bir anahtar oluşturmak için aşağıdaki komutu yazın:

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 seçeneği, anahtarı oluşturmak için kullanılan daha yeni bir algoritmadır. Eski sistemlerde bu desteklenmeyebilir. Daha sonra eski RSA şifreleme sistemini kullanabilirsiniz.

ssh-keygen -b 4096 -t RSA

Anahtarlar kullanıcı profilinizde saklanır. Yol çıktıda görüntülenir, ancak genellikle aşağıdaki konuma kaydedilirler:

%userprofile%\.ssh

SSH Keygen parolası

Ssh anahtarının oluşturulması sırasında sizden bir parola girmeniz veya boş bırakmanız istenecektir (varsayılan). Parola yerel anahtarı şifrelemek için kullanılır. Bu şekilde yerel anahtarı güvenli bir şekilde saklayabilirsiniz. Birisi anahtara erişirse, onu parola olmadan kullanamaz.

Ancak parolayı kullanmadan önce aklınızda bulundurmanız gereken önemli bir şey var. SSH anahtarını her kullandığınızda parolayı girmeniz gerekecektir. Çoğu zaman SSH anahtarı, örneğin GitHub hizmetleri gibi otomasyonda kullanılır. Bu kullanım durumlarında parola kullanmak bir seçenek değildir.

SSH ile PowerShell Uzaktan Bağlantı

Başka bir bilgisayar veya sunucuya uzaktan bağlantı kurmak için PowerShell'de SSH'yi de kullanabiliriz. Bu, Windows bilgisayarları veya Windows-Linux arasında olabilir ve bunun tersi de geçerlidir.

İki Windows makinesi arasında PowerShell uzaktan iletişim oturumu oluşturmak WinRM ile zaten mümkündü. Ancak artık bağlantıyı oluşturmak için SSH'yi de kullanabilirsiniz. SSH'nin avantajı Windows, Linux ve macOS'ta kullanabilmenizdir.

Windows ve Linux makineleri arasındaki uzak bağlantılarda SSH'yi kullanmak için PowerShell 6 veya daha yüksek bir sürüme ihtiyacınız olacak. Aşağıdaki örneklerde PowerShell 7 kullanıyorum.

OpenSSH Sunucusunu Kurun

İlk adım, Windows bilgisayarınıza OpenSSH sunucusunu yüklemektir. Bahsedildiği gibi, SSH istemcisi artık varsayılan olarak yüklenmiş ve etkinleştirilmiştir. Ancak SSH sunucusu değil.

OpenSSH sunucusunun kurulu olup olmadığını aşağıdaki cmdlet ile kontrol edebilirsiniz:

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

Gördüğünüz gibi OpenSSH sunucusu mevcut değil. PowerShell ile kurabilir/etkinleştirebiliriz:

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

Bir sonraki adım OpenSSH sunucusunu başlatmaktır. Çünkü bu, otomatik olarak başlayacak şekilde ayarlayabileceğimiz bir hizmettir:

# Start the sshd service
Start-Service sshd

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

SSH Sunucusunu Yapılandırma

Bir parola ile kimlik doğrulaması yapabilmemiz ve uzaktaki makinede PowerShell'i kullanabilmemiz için SSHD yapılandırma dosyasını düzenlememiz gerekiyor.

SSH sunucusunu yapılandırmazsak, uzak makinedeki yalnızca temel komutları (Windows Kabuk İstemi) kullanabiliriz.

Tüm PowerShell cmdlet'lerini tam olarak kullanmak için SSH Sunucusunu PowerShell'i alt sistem olarak ekleyecek şekilde yapılandırmamız gerekecek.

SSHD yapılandırma dosyası program verisi klasöründe saklanır. Zaten açık PowerShell'imiz olduğundan, yapılandırma dosyasını açmak için onu kullanacağız:

# 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

Yapılandırma dosyasında PasswordAuthentication yes satırının önündeki # işaretini kaldırın ve yapılandırma dosyasına aşağıdaki satırı ekleyin. (konum pek önemli değil ama "# alt sistem yok varsayılanını geçersiz kıl" kısmının altına ekledim)

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

Yeni yapılandırma dosyasını yüklemek için SSHD hizmetini yeniden başlatın:

Restart-service sshd

PowerShell ile SSH Uzaktan İletişimi

Sunucumuzda SSH sunucusu kurulu olduğundan artık istemcimizde PowerShell kullanarak bağlanabiliyoruz. WinRM uzaktan iletişiminde olduğu gibi aynı cmdlet'i kullanabiliriz, fark ana bilgisayar adı ile bilgisayar adı arasındadır.

  • Yeni-PSSession
  • PSSession'a girin
  • Çağır-Komut

New-PSSession -Computername kullanırsanız WinRM protokolü kullanılacaktır. Bunun yerine -ana bilgisayar adı parametresini kullandığınızda SSH kullanılacaktır.

Yeni bir PowerShell uzaktan iletişim oturumunu aşağıdaki şekilde başlatabilirsiniz:

# 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

Ayrıca WinRM yönteminde olduğu gibi -Credentials yerine -Kullanıcı adı parametresini kullandığımızı unutmayın.

Uzak PowerShell komutlarını Invoke-Command cmdlet'iyle çalıştırabilir veya sunucudaki PowerShell'i Enter-PSSession ile açabiliriz.

Birden fazla SSH Bağlantısını Yönetme

Putty gibi araçların avantajı SSH bağlantılarınızı yönetip kaydedebilmenizdir. Bu, sık kullandığınız sunuculara veya ağ cihazlarına kolayca yeniden bağlanmanıza olanak tanır.

Windows Terminali ile aynı şeyi başarabilirsiniz. Yeni Windows Terminali, farklı bağlantıları kolayca saklamanıza ve farklı komut satırı arayüzlerini kullanmanıza olanak tanır.

Winows Terminali hakkında daha fazla bilgi edinmek istiyorsanız bu güçlü terminal hakkında tüm detayları anlattığım bu makaleyi mutlaka okuyun.

Kapanış

SSH'yi PowerShell ile kullanmak gerçekten kullanışlıdır ve ekstra bir araca (SSH İstemcisi) olan ihtiyacı ortadan kaldırır. Kişisel PowerShell'i çok kullanıyorum, bu nedenle bir sunucuyu kontrol etmem veya sunucuda bir şey yapmam gerektiğinde PowerShell penceremden sunucuya hızlı bir şekilde bağlanmak son derece kolay.

Umarım bu makaleyi faydalı bulmuşsunuzdur, herhangi bir sorunuz varsa aşağıya yorum bırakmanız yeterli.

İlgili makaleler