31.01.2023

Etki alanında olmayan makinelere powershell ile uzaktan bağlanmak

Kısacası PSRemoting. Uzun konu. Ama pratik olarak etki alanında (domain) olmayan makinelerin birbirlerine nasıl uzaktan bağlanacaklarına hızlıca bakalım.

İki makine de workgroup modunda. Bağlantıyı başlatarak karşı tarafta bağlanacak makineye "kaynak", kendisine bağlanılmasını bekleyecek makineye de "hedef" diyelim.

Bu ikisinin de güvenlik duvarları açık olabilir. Kaynak makinenin dışarı çıkışının engellenmediğini varsayarak bu tarafta yapılacak birşey yok. Ama hedef makine dinleme modunda olduğundan bu makinede uygun portlar açacak ayarların yapılması gerekecek. Ayrıca hedef makinede bu bağlantıyı bekleyecek (dinleyecek) bir yapı da olmalı. Bu da WinRM hizmeti. Varsayılan olarak yeni sistemlerde bu kapalı geliyor. Bunun da açılması gerekecek. Birkaç küçük ayrıntı daha var. Şükür ki bunları otomatik yapan bir cmdlet var. Hedef makinede sadece şunu yazmak yeterli:

PS> Enable-PSRemoting

Eğer bunu yazınca ağ profilimiz ile ilgili şikayet ediyorsa Public profildeyiz demektir. İki seçeneğimiz var; ya -SkipNetworkProfileCheck parametresini kullanarak tekrar deneyebiliriz ya da ağ profilimizi değiştirmeliyiz. Bence ikincisi daya iyi bir seçenek. Değiştirmek için

PS> Set-NetConnectionProfile -NetworkCategory Private

Hedef makine ile işimiz bitti. Şimdi sıra kaynak makinede. Powershell ile bağlanırken kullanıcı adı ve şifre bilgileri karşı makineye gönderileceğinden karşıdaki makinenin gerçekten güvenilir olup olmadığından emin olmamız istenir. Bu sebeple rastgele makinelere bağlanmayı denerken kullanıcı adı ve şifre bilgilerini göndermememiz için güvenilir bilgisayarlar listesi oluşturulmuş. Sadece bu listedeki bilgisayarlara bağlanabiliriz. Bu liste de WSMan sürücüsünde localhost\Client\TrustedHosts gibi bir adrestedir. Mevcut içeriğini görüntülemek için

PS> Get-Item WSMan:\localhost\Client\TrustedHosts

kullanabiliriz. Hedef makinemizin adının da "hedef" olduğunu varsayarsak bu dosyaya bu bilgisayarın ismini girmemiz gerek. Şöyle bir komut kullanabiliriz:

PS> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "hedef"

Bu komut TrustedHosts'un içeriğini değiştirir. Birden fazla ekleme yapmak için -Concatenate parametresi kullanılabilir. Bir de "sunucu" adında bir makine daha ekleyelim:

PS> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "hedef" -Concatenate

Bu aşamada artık bağlanabiliriz:

PS> Enter-PSSession -Computername hedef -Credential (Get-Credential "hedef\kullanici")

Burada sorun varsa belki hedef makinedeki güvenlik duvarını tekrar kontrol etmek isteyebiliriz.

PS> Get-NetFirewallRule "WINRM-HTTP-In-TCP*"

Bu komut sonucunda 2 kural dönecektir. İkisi de 5985/TCP portunu etkinleştiren kuraldır ama özelliklerini aşağıaki gibi kıyaslayayım:

Kural ismi
Ağ profiliKapsamPort/ProtokolPrivate Profilde
WINRM-HTTP-In-TCPPublic
Yerel alt ağ
5985/TCPDevre dışı
WINRM-HTTP-In-TCP-NoScopeDomain ve Private
-yok-5985/TCPEtkin

Bu tabloda vurgulamak istediğim, isminde NoScope geçen Domain ve Private profilleri için oluşturulmuş bir kural. Bizim profilimiz de Private olduğu için burada etkinleştirilmiş duruma olmalı. Diğer kuralda ise kapsam (scope) belirtilmiştir, sadece yerel alt ağ. Eğer olur da public profili etkinleştirirsek bizim kontrol etmemiz gereken kural bu olacak.

Buna alternatif olarak hedef makine SSH sunucusu varsa ssh ile de bağlanmak mümkün. O yazımda yazmadığım şekilde Windows makineye ssh yüklemek için (bugün için beta) artık winget de kullanabiliriz:

PS> winget install "OpenSSH Beta"

4.01.2023

Komut satırından sıkıştırma ve açma

 Eskiden sadece tar vardı. Bir klasörü tar ile sıkıştırmak için

$ tar -czvf compressed.tar.gz /home/user/dir1

Burada

    -c : Create (oluştur)

    -z :  zip (sıkıştır)

    -v : verbose (dosya ayrıntılarını görüntüle)

    -f : Filename (sıkıştırılmış dosya adını belirt)

Birden fazla klasör boşluk bırakarak ard arda yazılabilir.

Hariç tutulmak istenen klasör veya dosyalar (* wildcard karakteri kullanılarak) --exclude parametresiyle verilebilir.

$ tar -czvf compressed.tar.gz /home/usr/dir1 --exclude=/home/user/dosya1.txt --exclude=*.mp4 --exclude /home/user/Download

Bu örneklerdeki -z parametresi gzip sıkıştırma yöntemini kullanıyordu. Yeni bir sıkıştırma yöntemi olan bzip2'yi kullanmak (daha fazla sıkıştırma oranı için) -z'yi -j ile değiştirmek gerek. Örneğin

$ tar -cjvf compressed.tar.bzip2 /home/user/dir1

Sıkıştırılmış dosyayı açmak (ayıklamak/çıkarmak) için ise -c anahtarını -x (eXtract) ile değiştirmek gerek:

$ tar -xzvf compressed.tar.gz

Bu komut mevcut klasörün içine çıkartır. Başka bir klasöre çıkartmak için -C (büyük C) anahtarı kullanılır:

$ tar -xzvf compressed.tar.gz -C /tmp

tar komutundan başka bir de zip komutu var. Bu komut ile tek bir dosyayı sıkıştırma yapmak için

$ zip compressed.zip /home/user/file1.txt

bir klasörü, altındaki tüm içerik ile birlikte sıkıştırmak için ise

$zip -r -q -9 compressed.zip /home/user/Documents/

kullanılabilir. Burada

    -r : Recurse (alt klasörleri de dahil et)

    -q : Quiet (sıkıştırılan her içeriği yazma)

    -9 : En yüksek sıkıştırma oranını kullan (-0 en düşük, -9 en yüksek sıkıştırma oranı)

Sıkıştırılan dosyaya bir parola vermek için -e anahtarı kullanılabilir. Bu anahtardan sonra parola sorulur.

zip ile sıkıştırılmış dosyaları açmak için ise unzip komutunu kullanmak gerek:

    $ unzip compressed.zip

Burada kullanılabilecek bazı anahtarlar şöyle:

    -q : Quiet (ayrıntıları yazma)

    -d <klasör> : çıkarılacak konumu belirt

    -P <parola> : Büyük 'P' harfi ile parola korumalı dosya için parola belirt (DİKKAT: Komut geçmişinde görüntülenecek!)

    -x <*>    : eXlude (hariç tut)

    -l : Çıkarmadan sadece zip dosyasının içeriğindeki dosyaları görüntüle

Bazı bonus komutlar şöyle:

$ zipcloak compressed.zip    # varolan bir dosyayı parola korumalı yap

$ zipdetail compressed.zip  # sıkıştırılmış dosya ayrıntılarını görüntüle

$ zipinfo compressed.zip  # sıkıştırılmış dosya ayrıntılarını görüntüle

$ zipgrep kelime compressed.zip # sıkışmış dosyaların içeriğinde anahtar kelime araması yap

$ zipsplit -n 1024000 compressed.zip # sıkıştırılmış dosyayı 102400 byte (1 MB) bölümlere böl

Son zamanlarda daha da fazla sıkıştırma oranı veren 7zip de kullanılabilir. Windows için yüklenen 7-zip paketinde de 7z komutu aynı işlemleri yapabilir. Bir klasörü 7zip ile sıkıştırmak için:

$ 7z a compressed.7z /home/user/log_file

çıkartmak için de

$ 7z e compressed.7z -o /home/user/

Tabi Windows'da powershell ile gelen Compress-Archive ve Expand-Archive komutları da kullanılabilir:

PS> Compress-Archive -Path log_file -DestinationPath compressed.zip

Açmak için de

PS> Expand-Archive -Path D:\archive\compressed.zip -DestinationPath C:\Users\fethi\

kullanılabilir.