19.12.2025

dnf update sırasında çıkan "Downloading successful, but checksum doesn't match." mesajı

Buna hata mı demek lazım, uyarı mı, yoksa bilgilendirme mesajı mı?

Fedora üzerinde dnf update yaparken rastladım. Şuna benzer bir mesajdı:

$ sudo dnf check-upgrade
Updating and loading repositories:
 Fedora 41 - x86_64 - Updates                               100% |  67.2 KiB/s |  31.8 KiB |  00m00s
 Signal Messaging Devel Project (Fedora_41)                 100% |   2.3 KiB/s |   1.7 KiB |  00m01s
 Fedora 41 openh264 (From Cisco) - x86_64                   100% |   3.6 KiB/s | 989.0   B |  00m00s
 Brave Browser                                              100% |  15.5 KiB/s |   2.0 KiB |  00m00s
 ProtonVPN Fedora Stable repository                         100% |   4.8 KiB/s |   3.7 KiB |  00m01s
 Fedora 41 - x86_64                                         100% | 182.4 KiB/s |  32.7 KiB |  00m00s
 Fedora 41 - x86_64 - Updates                               100% |   1.3 MiB/s |   4.6 MiB |  00m03s
>>> Downloading successful, but checksum doesn't match. Calculated: e96bd9b4c272be2d9c7d4a656b7ae322
>>> Downloading successful, but checksum doesn't match. Calculated: e96bd9b4c272be2d9c7d4a656b7ae322

Genelde böyle bir hata olursa paket güncellenmemiş olur. Hangi paket güncellenmedi acaba diye bakmak istedim, /var/log/dnf.log dosyasına, ama burada hata olduğuna dair bir bilgi bulamadım. Bu kelime ile yaptığım aramalarda şu adreste bulduğum açıklamaya göre güncelleştirme sırasında kullanılan yansı sunucuda geçici bir uyumsuzluk olabileceği, dnf'in hata yaşanan paketi yeniden indirerek veya yansı sunucuyu değiştirerek sorunu giderebileceği belirtilmiş. Hatta böyle bir uyumsuzluğun belki de yansı sunucunun üzerindeki paketlerin diğer bir yansı üzerinden güncellenmesi sırasında karşılaşılabileceği ifade edilmiş.

Sonuç olarak tekrar dnf upgrade yaptığımda hata oluşmadı, loglarda da sorun olduğuna dair bir kayıt bulamadım. Yani geçici bir durummuş, çözülmüş. 

18.12.2025

KB5072033 - Aralık 2025 Build 26100.7462 güncellemesi

Son dönemde Invoke-WebRequest'i kullandığım betiklerimde aşağıdaki gibi bir uyarı ile karşılaşıyorum.


Bunu hiç düşünmemiştim. Meğer Invoke-WebRequst cmdlet'i, çalıştırıldığında sayfadaki javascript betiklerini de çalıştırıyormuş. Bunu yapmak istemiyorsak, sadece sayfanın HTML içeriğini almak istiyorsak -UseBasicParsing parametresini kullanmalıymışız.

Bunu son birkaç günde görmeye başladım. Önce

Get-Hotfix

ile bilgisayarımda son yüklenen güncelleştirmeleri inceledim. En son yüklenen, olağan şüpheli olarak KB5072033'ü buldum. Bunu kullanarak yaptığım arama beni şu ve bu sayfalara götürdü. Bu vesile ile 24H2 güncelleştirmesinde artık Powershell 2.0 bileşeninin olmadığını da görmüş oldum ama asıl önemli olan söz konusu güncelleştirmenin bir toplu güncelleştirme paketi olduğu ve aslında 9 Aralık tarihli KB5074596 güncelleştirmesi ile Invoke-WebRequest'in bu uyarıyı göstermeye başladığını öğrendim. Artık tüm Invoke-WebRequest cmdlet'lerine -UseBasicParsing parametresini koymak gerek.

Powershell 5.1 Windows Management Framework bileşeni aracılığıyla bazı güvenlik güncelleştirmeleri almış mıdır, bilemiyorum ama bu şekilde bir özellik güncelleştirmesi uzun zamandır ilk defa alıyor sanki. 

15.12.2025

Rocky Linux sunucu kurulumu sonrası ilk ayarlar

Bir Rocky Linux sunucu kurdum. Kurulum sonrası bazı ilk ayarlar yapılması gerek.

İlk iş TCP/IP ayarlarını yapmak. Tercihen nmtui ile IP ataması yaptım. Ama elle atama yapacaksak /etc/NetworkManager/SystemConnections klasöründe her ethernet kartımıza ait bir dosya bulunur, örneğin ens192.nmconnection şeklinde. Bu dosyanın içeriği şöyle olabilir:

[connection]
id=ens192
uuid=<8-4-4-4-12 karakterlik-hex-dizi>
type=ethernet
autoconnect-priority=-999
interface-name=ens192
timestamp=1765795716

[ethernet]

[ipv4]
method=manual
address1=192.168.1.5/24
gateway=192.168.1.1
dns=1.1.1.1;8.8.8.8;
dns-search=domain.com
ignore-auto-dns=true
never-default=true

DNS sunucuların yeri yine /etc/resolv.conf dosyası. 

İkinci iş klavye düzenini değiştirmek. Hazırdaki klavye düzenlerini görmek istersek

localectl list-keymaps

ve bunların arasından örneğin Türkçe-Q klavye düzenini seçmek istiyorsak da

localectl set-keymap trq

komutu ile ilerleyebiliriz.

OpenSSH kurulu mu diye kontrol ettim:

rpm -q openssh

kurulu gelmiş. Hizmet çalışıyor mu diye baktım:

systemctl status sshd

o da çalışıyor. Windows makinemden ssh'a bağlantı denedim:

ssh metin@192.168.1.5

Bana daha önce 192.168.1.5 IP adresine sahip başka bir cihaza ait parmak izinin C:\Users\metin\.ssh\known_hosts dosyasında bulunduğunu söyleyen bir uyarı mesajı verdi. Evet, eski sunucuya ait satırı bu dosyadan silmek istiyorum. Hızlı bir şekilde

cd C:\users\metin\.ssh
cat known_hosts | ? {$_ -notmatch 192.168.1.5} | sc known_hosts2

yaptım. Yedek olması açısından mevuct dosyayı koruyarak yeni dosyayı devreye aldım:

ren known_hosts known_hosts.old2025
ren known_hosts2 known_hosts

Bu noktadan sonra önce sunucuya genel anahtarımızı aktaralım (bir tane yaratmak için tıklayın).

scp genel_anahtarim metin@192.168.1.5:/user/metin

Bu anahtarı authorized_keys dosyasının içine eklemeliyim. Var olan bir authorized_keys dosyası varsa, buna eklemek için ya cat komutunun birleştirme yeteneğini kullanarak

cat genel_anahtarim .ssh/authorized_keys > .ssh/authorized_keys

ya da çift yönlendirme operatörünü kullanabilirim:

cat genel_anahtarim >> .ssh/authorized_keys

Varsayılan olarak parola ile giriş (hatta boş parolalar bile) ve root ile erişim açıktır. Bunları kapatmak için /etc/ssh/sshd_config.d klasörünün içine bir dosya oluşturup aşağıdaki içerik girilebilir.

# Varsayilan portu degistir
Port 2122
# Sadece SSH protokol 2
Protocol 2

# Root kesinlikle giremez
PermitRootLogin no

# Sadece belirli kullanıcılar
AllowUsers metin

# Boş parola kabul etme
PermitEmptyPasswords no

# Parola ile giriş YOK
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no

# Sadece anahtar tabanlı giris
PubkeyAuthentication yes

# Yetkisiz forwarding kapali
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

# Oturum guvenligi
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2

# Loglar daha ayrintili olsun
LogLevel VERBOSE 

Dağıtımdan dağıtıma değişebilir ama, bu klasör içinde bazı dosyalar olabilir. Örneğin benim sunucumda bu klasörde

-rw-------. 1 root root 412 Jul 20 20:00 40-redhat-crypto-policies.conf
-rw-------. 1 root root 307 Jul 20 20:00 50-redhat.conf

gibi dosyalar vardı. Ben 60-ek-yapilandirma.conf gibi bir dosya oluşturarak bunun içine girdim.

Hepsi bitince OpenSSH hizmetini yeniden başlattım.

systemctl restart sshd

Sonrasında parola ile girmeyi denedim, olmadı -tam da istediğim gibi. Sonra özel anahtarım ile girmeyi denedim:

ssh -i ozel_anahtarim metin@192.168.1.5

ve başarılı. 

12.12.2025

Linux komut geçmişi

Terminalden bağlandığım bir linux sunucu var. Oluşturduğum yeni bir kullanıcı için komut geçmişi (history) yok gibi görünüyor. Bunu etkinleştirmek istiyorum.

Önce kullandığım shell'i kontrol etmem gerek.

echo $SHELL
/usr/bin/sh

ile bash'i değil, sh'i kullandığımı gördüm. Bunu değiştirerek bash yaptım.

chsh -s $(which bash)

sonra bir kez bağlantımı kesip (konsoldan bağlıysam oturumu kapatıp) tekrar oturum açmam gerek.

Sonrasında yine echo $SHELL komutunu kullanarak çıkışta /usr/bin/bash gördüm.

Komut geçmişi, profilin altında .bash_history dosyasına yazılır. Bu dosya yoksa

echo $HISTFILE

komutu ile önce bu değişkenin varlığını kontrol etmek, yoksa

export HISTFILE=~/.bash_history

satırını .bashrc dosyasına eklemek, arkasından etkinleştirmek için

source ~/.bashrc

çalıştırmak gerek.

Komut geçmişini sınırlandıran değişkenler kontrol edilebilir:

echo $HISTSIZE
echo $HISTFILESIZE

Bu değişkenlerin ilki hafızada tutulacak komut geçmişi sayısı, ikincisi diskte tutulacak geçmiş sayısıdır.

zsh için de benzer bir şekilde ~/.zsh_history dosyasında tutulur. HISTSIZE değişkeni aynen geçerlidir, HISTFILESIZE yerine SAVEHIST değişkeni kullanılır.

Daha iyi bir yöntem için audit kullanılabilir. 

3.12.2025

Firefox'ta arama yapmak

Firefox, hep saygı duyduğum kullanmaktan zevk aldığı bir tarayıcı oldu. Adres satırından arama yapma fikrini sanıyorum ilk kullanan tarayıcıydı. Adres satırından yapılan aramalar için arama motoru eklemek de mümkün.

Üstteki ekran görüntüsünde açılan menünün en altında gözüken "Arama ayarları"na tıkladıktan sonra bizi karşılayan sayfaya elle arama motoru eklenebileceği gibi, arama motorunun anahtar kelime yazılan kutusuna sağ tıklayarak açılan menüden "Arama motoru ekle" komutu verilerek de eklenebilir. Ancak sonrasında bunu fareye dokunmadan da yapabilmek için az önce bahsettiğim arama ayarları sayfasına giderek buraya yeni eklenen satırın sağ yarısını çift tıklayarak oraya @viki gibi bir "@" işareti ile başlayan bir etiket yazarsak, ama satırına sadece @viki yazdıktan sonra istediğimiz aramayı gerçekleştirebiliriz.

Başka bir yöntem de yer imlerine yeni bir adres ekleyip anahtar kelimesini belirlemek. Örneğin Youtube'a girmeden adres satırına sadece "you barış manço" yazarak arama yapmak için aşağıdaki gibi bir düzenleme yeterli:


Adres kısmını bulmak için ise Youtube'a girip bir arama yaptıktan sonra adres satırında yer alan her şeyi kopyalayıp, içinde arama terimimizi (ki burada barış+manço) %s değişkeniyle değiştirebilriz.


Bir de DuckDuckGo Bangs mevzu var. Yukarıdakilerin hiçbirini yapmadan sadece arama motorumuzu DuckDuckGo ile değiştirirsek, !w gibi bir ön ekiyle Wikipedia araması, !imdb ön ekiyle IMDB araması yapabiliriz.


Bugün itibariyle +13.000 bang'e sahip olan ddg en iyi çözüm değil. Çünkü arama kriteri önce ddg'nin sunucularına, oradan Wikipedia'ya gönderiliyor. Firefox yöntemleri ile arama kriterleri doğrudan Wikipedia sunucularına (ya da IMDB sunucularına, hangisi ile arama yapıyorsak) gönderildiği için daha iyi bir çözüm.

25.11.2025

Linux sunucuya yapılan bağlantıları görmek

SSH örneği üzerinden gidelim. Varsayılan SSH portu tcp/22. Çoğu dağıtımda ss komutu yüklü gelir.

ss -tpn

Çok fazla bağlantı varsa sadece 22 portu süzmek için

ss -tpn | grep :22 
-t : tcp
-p : bağlantı ile ilişkili prosesleri göster
-n : portları nümerik olarak listele, hizmet isimlerini gösterme

Başka bir yöntem lsof kullanmak.

sudo lsof -i

Sadece 22 numaralı portu görmek için aşağıdaki notasyon yeterli.

sudo lsof -i :22

ssh bağlantılarına özel who veya w komutları da kullanılabilir.

who
user1    pts/0        2025-11-25 14:15 (192.168.17.8)
w komutu da aşağıdaki gibi
w
 15:59:14 up  3:44,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT
user1              192.168.17.8         14:15          3:29m  0.00s  0.04s sshd: user1 [priv]

Linux için son seçenek diye birşey olmaz, daha çok seçenek vardır eminim ama bir de last komutu var.

last
user1     pts/0        192.168.17.8       Tue Nov 25 14:15   still logged in

Eğer son satırda "still logged in" yazıyorsa bağlantı hala devam ediyordur. Aşağıdaki gibiyse bağlantı 14:30'da sonlanmış demektir.

last
user1     pts/0        192.168.17.8       Tue Nov 25 14:15 - 14:30 (00:15)


19.11.2025

Dell switch yapılandırmasını bir dosyaya kaydetmek

Dell OpenManage switch serisinde yapılandırmayı bir dosyaya kaydetmenin otomatik bir yolu yok. Ama komut satırından telnet ile giriş yapıldığında ekrana bunu basabiliyor. Bunu kopyala yapıştıra gerek kalmadan nasıl bir dosyaya atabilirim?

$kullanici="kullanici"
$parola="gizliparola"
$komut1="enable"    # running-config komutunu etkinleştir
$komut2="terminal length 0" # Sayfa sonlandırmayı devre dışı bırak
$komut3="show running-config all" # Tüm yapılandırmayı göster
$komut4="quit"      # Oturumu sonlandır
$birlesik_komut="$kullanici`r`n$parola`r`n$komut1`r`n$komut2`r`n$komut3`r`n$komut4`r`n"

$birlesik_komut | ncat -C 192.168.7.151 23 | out-file dellconfig151.txt

Bunun sonunda mevcut klasörde dellconfig151.txt dosyasında bir yapılandırma dosyamız oluşur. $kullanici ve $parola değişkenlerini ve switch IP adresini değiştirmeyi unutmamak lazım.

ncat, telnet'e kıyasla daha kullanışlı.

enable ve terminal length 0 gibi komutlar oturum başına değişiklik yapıyor, kalıcı değil. 

11.11.2025

Ping ile gönderilen veri

En çok kullanılan sorun gideme aracımız ping. Windows'da her ping varsayılan 4 adet ICMP paketi gönderir, karşı tarafın da aynı sayıda ICMP paketi ile cevap vermesini bekler. Linux'ta varsayılan gönderme sayısı sınırsızdır. Ctrl+C'ye basana kadar gönderir. Windows'da her seferinde 32 byte gönderildi, 32 byte alındı gibi bir bilgilendirme görüntülenir, başarılı gönderme ve alma işlemleri için. Linux'ta da 48 byte'tır bu miktar.

Peki ne gönderir bu arkadaş? Windows'da abcd.. ile başlayan yapay bir veri gönderildiğini biliyordum. Ama powershell'in Test-Connection veya Linux'un ping'inin, Sysinternals'ın psping'inin veya Nirsoft'un PingInfoView'unun ne gönderdiğini bilmiyordum.

Windows ping aracı: abcdefghijklmnopqrstuvwabcdefghi

Test-Connection:    abcdefghijklmnopqrstuvwabcdefghi

Linux png:          <º______________________!"#$%&'()*+,-./01234567 

psping:             aralarına 0x00 yerleştirilmiş veri

PingInvoView:       tamamen rastgele karakterler 

Linux ping aracı 48 byte veri gönderiyor. Alt tire karakteri "_" ile gösterdiğim alanlar 0x00 ile 0x20 arasında basılamayan karakterler. Benzer şekilde sysinternals aracı psping de her harf arasına 0x00 yerleştirilmiş (UTF16 ?), bir yerden okunan (nereden, bulamadım) bazı karakter veri gönderiyor. Her seferinde farklı içerik.

Alıcı ister Windows olsun, ister Linux, farketmez. Gönderen ne gönderdiyse aynı şekilde cevap geliyor. Bunun bazı istisnaları yok değil ama bu durum konumuzun dışında.

10.11.2025

Powershell ErrorVariable parametresi

Alışık olduğum kullanımın dışında yeni bir kullanım buldum [1].

Normalde şöyle yapardım (örnek senaryo):

Invoke-Command -Computername (Get-Content D:\pclist.txt) {
    hostname
} -ErrorAction SilentlyContinue

Bu şekilde pclist.txt dosyasında yazan bilgisayarlar üzerinde hostname komutu çalıştırılarak bilgisayar ismi yazılır. Ulaşılamayan her bir bilgisayar için hata vermesini istemediğimden -ErrorAction SilentlyContinue kullandım.

Bu komut sonucunda hangi bilgisayarlarda hata ile karşılaştığımı göremedim. Ama hangi bilgisayarlarda çalıştığını gördüm.

Buna alternatif -ErrorVariable parametresi var. Takiben bir değişken adı girerek oluşan hatalar ile ilgili bir rapor alabilirim.

Invoke-Command -Computername (Get-Content D:\pclist.txt) {
    hostname
} -ErrorAction SilentlyContinue -ErrorVariable Hatalar

foreach ($Hata in $Hatalar) {
    "$($Hata.TargetObject) Bilgisayarina Baglanilamadi!"
}

Bu da güzel.

---

[1] https://www.networkadm.in/find-out-how-long-that-pc-has-been-running-with-get-uptime/ 

6.11.2025

Hafta numarasının hesaplanmasında yanlışlık

Daha önce yılın kaçıncı haftasında olduğumuzu gösteren

Get-Date -UFormat %V

komutu hakkında bir yazı yazmıştım

Bu sene 1 Ocak Çarşamba gününe denk geldi. Türkiye'de bu hafta yılın ilk haftası olarak kabul ediliyor. 6 Ocak Pazartesi günü de yılın ikinci haftası olarak kabul edilmeliydi. Ancak

Get-Date "2025-01-06" -UFormat %V

komutu bu tarih için 1 dönüyorken bir gün sonra 7 Ocak Salı günü için aşağıdaki komut

Get-Date "2025-01-07" -UFormat %V

2 dönüyor. ABD'ye kıyasla Türkiye'de haftanın ilk günü Pazartesi günü kabul ediliyor. Ayrıca yılın ilk haftasının hangi gün başlayacağı ile ilgili de farklı fikirler var. Örneğin 1 Ocak'ın Pazar gününe denk gelmesi durumunda yılın ilk haftası 2 Ocak'ta başlıyor olarak kabul edilebilyor. Bu durumda en az 4 güne sahip bir haftanın yılın ilk haftası kabul edilmesi gertiği yönünde bazı standartlar (IS-8601) oluşmuş. Claude.ai'a göre C çalışma zamanı kütüphanesi strftime, bu hatalardan sorumlu.

Çözüm olarak şöyle bir fonksiyon oluşturulması ve bunun kullanılması önerilmiş.

function Get-ISOWeekNumber {
    param([DateTime]$Date = (Get-Date))
   
    $cal = [System.Globalization.CultureInfo]::InvariantCulture.Calendar
    return $cal.GetWeekOfYear($Date, [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [DayOfWeek]::Monday)
}


31.10.2025

Powershell istisnaları

Powershell istisnaları (exceptions) uzun konu. Doğrudan söylemek istediğime geleyim. Bir web sayfasına bağlantı yapmaya çalışıyorum, Invoke-WebRequest ile. Bu cmdlet'i bir try-catch bloğuna koyuyorum. 

try {
    Invoke-WebRequest -Uri "https://example.com" -Method Get -ErrorAction Stop
}
catch {
    $_.Exception.Response.StatusCode
    $_.Exception.Response.StatusCode.Value__
    $_.Exception
}

catch ile aslında burada olabilecek bütün istisnalar için bir yakalama yaptım. Ama her istisna durumu için ayrı ayrı işlem yapılacaksa bu istisna durumlarını ayrı ayrı incelemek gerekebilir. Örneğin Forbidden (403) dönen bir HTTP response durumu için bir eylemde bulunmak istiyorsak

try {
    Invoke-WebRequest -Uri "https://example.com" -Method Get -ErrorAction Stop
}
catch [System.Net.WebException] {
    $_.Exception.Response.StatusCode
    $_.Exception.Response.StatusCode.Value__
    $_.Exception
}

ile System.Net.WebException sınıfı istisna yakalayabilirim. Peki olası bütün istisnaları nasıl öğrenebilirim?

Öncelikle $_ değişkeni catch bloğuna özel, son istisna. $Error değişkeni, mevcut oturumda oluşan bütün istisnaların dizisi. En son istisnaya $Error[0] ile ulaşılabilir. $err ise $Error için bir alias.

Bir istisnanın türünü anlamak için catch bloğunun içinde GetType() kullanılabilir. 

try {
    Invoke-WebRequest -Uri "https://example.com" -Method Get -ErrorAction Stop
}
catch {
    $_.GetType().FullName
}

Bu, Forbidden (403) durumunda

System.Net.WebException

döndü. Meşhur sıfır ile bölünme durumu istisnası için

try {
    1/0
}
catch {
    $_.GetType().FullName
}
System.Management.Automation.RuntimeException

döndü. 

Daha iyi bir örnek Powershell yardım sitesinden bulunabilir:

try
{
    Start-Something -Path $path -ErrorAction Stop
}
catch [System.IO.DirectoryNotFoundException],[System.IO.FileNotFoundException]
{
    Write-Output "The path or file was not found: [$path]"
}
catch [System.IO.IOException]
{
    Write-Output "IO error with the file: [$path]"
}
catch
{
    Write-Output "An unexpected error occurred: $_"
}

Burada klasör ve dosya bulunamaması durumları için bir işlem, giriş/çıkış işlemi hataları için başka bir işlem yapılmış. En sonunda da bu iki sınıfa da dahil olmayan işlemler için bir genel yakalama yapılmış.

Daha da iyisi yapılarak istisnaların büyük bir listesi oluşturulmuş

30.10.2025

Powershell hata durumu eylemi

Çoğu powershell cmdlet'inin -ErrorAction parametresi vardır, bir hata durumunda yapılması istenen eylemi belirlemek için. Örneğin dosyanın olmaması durumunda hata vermeden sessizce devam etmesi için aşağıdaki gibi kullanım olabilir.

Get-Content -Path D:\dosyalar\hata.log -ErrorAction SilentlyContinue

Ya da try-catch bloğu içinde her hatanın yakalanmasını sağlamak için Stop kullanmak isteyebiliriz.

try {
    $user = Get-ADUser -Filter "Name -like '$name*'" -ErrorAction Stop
    ...
}
catch {
    ...
}

Ama her cmdlet sonunda bu parametreyi seçmemek için $ErrorActionPreference değişkenini kullanabiliriz. Varsayılan değer Continue'dir. Atanan değerler tek veya çift tırnak içinde verilmelidir.

$ErrorActionPreference="Stop"

Genel olarak Preference Variables kategorisinde bazı değişkenlerin arasında yer alır. Şu değerlerden birini alabilir:

Break: Bir hata olduğunda veya bir istisna tetiklendiğinde debugger'a gir.
Continue: (Varsayılan) Hata mesajını görüntüle ve devam et.
Inquire: Hata mesajını görüntüle ve devam etmek isteyip istemediğini kullanıcıya sor.
SilentlyContinue: Hata mesajı da gösterme, devam et.
Stop: Hatayı görüntüle ve dur. Stop değeri ayrıca ActionPreferenceStopException  nesnesi de oluşturarak hata akışına gönderir.

Bunların dışında -ErrorAction parametresi ile belirtilebilecek Ignore ve Suspend değerleri de var, ama $ErrorActionPreference olarak kullanılamıyor. Anlamları şöyle:

Ignore: Hata mesajını görmezden gel/gösterme ve çalışmaya devam et.
Suspend: Her hata sonrasında daha fazla inceleme için durulur, sonra çalışmaya devam edilir.
---

https://www.meziantou.net/stop-the-script-when-an-error-occurs-in-powershell.htm
https://www.scriptwizards.net/powershell-erroractionpreference-explained 

19.10.2025

openfortivpn

Linux bir makineden Fortinet firewall'a VPN yaparken kullanılabilecek bir yöntem, openfortivpn.

Fedora altında yüklenmesi gereken paket de openfortivpn.

sudo dnf install openfortivpn

Kurulum tamamlandıktan sonra /etc/openfortivpn/config altındaki dosyayı düzenlememiz gerek.

hedef sistemin adı (veya IP adresi), port numarası ve firewall'daki kullanıcı adını yazmak tamam. Ama bir de trusted-cert alanına yazılması gereken bir thumbprint var. Bunu edinmek için tarayıcımızla https kullanarak firewall'a bağlanıp (VPN portu üzerinden) sertifikanın sha256 parmak izini (thumbprint) almamız gerek. Daha sonra bu parmak izini octetler arasında tire "-", iki nokta üstüste ":" karakteri veya boşluk olmadan  olmadan bitişik bir şekilde yazmak gerek.

trusted-cert = 1234567890ABCDEF...

Bu adımdan sonra bağlantı yöntemi komut satırından. Bunu bir bash betiğine koymak da olası:

sudo openfortivpn fortinet.sirket.com:443 -u kullanici.adi

 

14.10.2025

Powershell'de bir string değişkeni karakter dizisine çevirmek

Powershell'de bir string değişkenimiz var.

$strMesaj = "Merhaba Dünya!"

Bu değişkeni bir karakter dizisi şeklinde kullanmak için aşağıdakiler işe yaramıyor.

$strMesaj[2]
foreach ($char in $strMesaj) { ... }
$strMesaj | % { ... }

Bunun yerine bir karakter dizisi oluşturabilecek yöntemler şöyle:

[char[]]$strMesaj
$strMesaj.ToCharArray()
$strMesaj -split ''

13.10.2025

Etkinleştirilmemiş bir Windows için tema değişiklikleri

Windows, etkinleştirilmeden tema, renk ve duvar kağıdı değişikliklerine izin vermiyor. Saçma.

Varolan kullanıcıda temayı karanlık yapmak için

Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" -Name "AppsUseLightTheme" -Value 0

Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" -Name "SystemUsesLightTheme" -Value 0

Duvar kağıdını değiştirmek için resmin üzerine sağ tıklayıp "Masaüstü arkaplanı olarak ayarla" komutunu vermek yeterli.

Windows Server üzerinde varsayılan gelen temada pencere sınırları pek belirsiz.

Böyle bir durumda iki seçenek var. Ya aşağıdaki gibi "Settings>Personalization>Colors" altında yer alan "Title bars and window borders" kutusu işaretlenerek başlık çubuğunun ve pencere çerçevelerinin belirginleşmesi sağlanabilir (ki sonuç aşağıdaki gibi olur). Bunu da powershell ile yapmak için

Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\DWM" -Name ColorPrevalence -Value 1

ya da aşağıdaki gibi bir powershell betiği çalıştırılarak pencerelerin altında hafif bir gölgeleme yapılabilir.

$RegistryKey = "HKCU:Control Panel\Desktop"
$Name = "UserPreferencesMask"
$Value = ([byte[]](0x90,0x32,0x07,0x80,0x10,0x00,0x00,0x00))
$Type = "Binary"
New-ItemProperty -Path $RegistryKey -Name $Name -Value $Value -PropertyType $Type -Force

---

https://gist.github.com/PyroGenesis/e3f2d59b636f03653b64e07ba4e1e8aa 

27.09.2025

ping istatistikleri

Windows'da ping komutu, işlevini tamamladıktan sonra kısa bir istatistik verir; kaç ping gönderdi, kaçı ulaştı, ortalaması, en düşük, en yüksek süre falan. Bir de -t ile sonsuza dek ping göndermesini istediğimiz durumda bu istatistiği görmek için Ctrl+Break kısayolu ile bu istatistik istendiği zaman görüntülenir, ama ping göndermesi kesintiye uğramaz.

Ama bunun eşdeğerini Linux'taki ping ile göremiyorum. Her türlü klavye kısayolunu denediğimi düşünüyordum ama birini atlamışım; ki bu da deneye yanılma ile bulunabilir mi, bilemiyorum.

Linux'ta benzer işlev Ctrl+\ ile mümkün denmiş. Türkçe klavye düzeninde bu Ctrl+AltGr+? (soru işareti çoğu klavyede en üst satırda rakam tuşlarının sonunda, sıfıra bitişik) ile mümkün. 

64 bayt, 192.168.0.1'den: icmp_seq=524 ttl=64 zaman=3.03 ms
64 bayt, 192.168.0.1'den: icmp_seq=525 ttl=64 zaman=4.60 ms
525/525 paket, %0 kayıp, en düşük/ortalama/ewma/en yüksek = 0.912/4.123/4.382/105.021 ms

Bu arada Linux'ta ping, ulaşmayan ping cevabını göstermiyorsa -O anahtarı ile her adımı raporla seçeneği seçilebilir.

24.09.2025

Linux'ta terminalde rastgele sayı üretmek

Linux'ta /dev/random ve /dev/urandom gibi iki cihaz var. Bunları kullanarak rastgele sayı üretebilir miyim diye düşündüm. İlk aklıma gelen

cat /dev/random

ile denedim, ctrl+c'ye basanara kadar ekranı anlamsız bir sürü rastgele karakterle doldurdu. Anladım, sadece belli bir miktar (örneğin 1 byte) veri okumamız lazım. Bunu yapmak için de head komutunu kullandım, -c1 parametresiyle.

head -c1 /dev/urandom

Evet, bunun sonucunda /dev/urandom'dan sadece 1 byte uzunluğunda bir veri okundu ama ekrana bunu sayı olarak basmadı. Sayıya çevirmek için od komutunu kullanmak gerekti. Öncelikle görmek istediğim sayı 0 ile 255 arasında bir tamsayı olduğu için bu veri tipini (-t) işaretsiz tamsayı (-u) olarak seçmem gerekti. Uzunluğunu da 1 byte seçtim (-u1)

head -c1 /dev/urandom | od -tu1

Bu da aslında, rastgele sayıların adres bilgilerini (akış içindeki sırasını) de ekrana bastı. Onlardan kurtulmak için ise -An (address none) kullandım:

head -c1 /dev/urandom | od -An -tu1

1 byte'lık bir sayı değil de 4 byte'lık bir sayı isteseydim:

head -c4 /dev/urandom | od -An -tu4

Ve hatta 2 tane 4 byte'lık veri isteseydim, 8 byte'lık rastgele sayı okuyup, bunu 4'byte'lık biçimlendirmem gerekirdi:

head -c8 /dev/urandom | od -An -tu4

11.09.2025

Exchange hizmetleri başlamıyor, hatta devre dışı

Exchange sunucuya yüklenen KB5066372 sonrası Exchange hizmetleri başlamadı. Elle de çalıştıramadım. Farkettim ki hizmetler devre dışı. Ne olmuş olabilir ki, güncelleme sonrasında hizmetler devre dışı bırakılmış olabilir? Ararken farkettim ki tarih tekerrür (bu ve şu) ediyor.

Reddit'te tek tek Exchange hizmetlerinin isimleri (artı birkaç sistem hizmeti) yazılarak önce bu hizmetler tekrar devreye alınmış, sonra başlatılmış. Ama bu betiği pastebin.com'a koydukları için şu an için Türkiye'den erişilemiyor (alternatif yöntem, pastebinp.com çalışıyor, Reddit'te paylaşılmış).

Diğer bağlantıda (thinksecurity.com) verilen çözümde ise hizmet isminde "Microsoft Exchange*" geçen hizmetler için bu işlemler otomatik yapılmış.

Ama gördüğüm kadarıyla bazı sistem hizmetleri için de devreye almayı genişletmek lazım. O yüzden Reddit'te paylaşılan pastebin betiğine, Exchange 2019'da olmayan hizmetleri çıkartıp, Exchange 2019'da olan hizmetleri ilave ederek katkıda bulundum:

$autos = "MSExchangeADTopology",
"MSExchangeAntispamUpdate",
"MSExchangeDagMgmt",
"MSExchangeDiagnostics",
"MSExchangeEdgeSync",
"MSExchangeFrontEndTransport",
"MSExchangeHM",
"MSExchangeImap4",
"MSExchangeIMAP4BE",
"MSExchangeIS",
"MSExchangeMailboxAssistants",
"MSExchangeMailboxReplication",
"MSExchangeDelivery",
"MSExchangeSubmission",
"MSExchangeRepl",
"MSExchangeRPC",
"MSExchangeFastSearch",
"HostControllerService",
"MSExchangeServiceHost",
"MSExchangeThrottling",
"MSExchangeTransport",
"MSExchangeTransportLogSearch",
"FMS",
"IISADMIN",
"SearchExchangeTracing",
"Winmgmt",
"W3SVC",
"MSExchangeFlighting",
"MSExchangeMitigation",
"MSComplianceAudit",
"MSExchangeHMRecovery"

$mans = "MSExchangePop3",
"MSExchangePOP3BE",
"RemoteRegistry",
"wsbexchange",
"AppIDSvc",
"pla"

#Enable Services
foreach($service in $autos)
{
   Set-Service -Name $service -StartupType Automatic
   Write-Host "Enabling "$service
}
foreach($service2 in $mans)
{
   Set-Service -Name $service2 -StartupType Manual
   Write-Host "Enabling "$service2
}


#Start Services
foreach($service in $autos)
{
   Start-Service  -Name $service
   Write-Host "Starting "$service
}

Yapanın eline sağlık.

Bu hizmetlerin devre dışı kalması bir amaca mı hizmet ediyor diye merak ettim. C:\ExchangeSetupLogs\ServiceControl.log dosyasında gördüm ki şuna benzer kayıtlar düşülmüş:

[08:53:31] Enabling service 'IISAdmin'.
[08:53:31] [Warning] 'IISAdmin' did not exist, this is not an error as the sevice might have just been installed

Yani, bir sebepten IISAdmin hizmetini yeniden devreye almaya çalıştığı sırada (nedense) bu hizmeti bulamamış. Ama ilginiç bir şekilde bu bir hata olarak değerlendirilmemiş.