23.07.2018

archlinux kablosuz ağ şifresini güncelleme

İlk archlinux kurulumumda, wifi şifresini değiştirdikten sonra ağ bağlantısı sorunu yaşamaya başladım. Bilgisayarım bir türlü şifresi değişen kablosuz ağa bağlanmıyordu. Archlinux forumlarındaki şu sayfada faydalı birkaç öneri verilmiş.

Kablosuz erişim noktası üzerindeki kablosuz ağ şifremi değiştirdikten sonra /etc/netctl klasörü altında profil dosyama girip şifremi güncellemiştim. Benimki için dosya adı
/etc/netctl/wlo1-Deneme
idi. Dosyanın içinde Key ile başlayan satırdaki şifreyi güncelledikten sonra
sudo netctl start wlo1-Deneme
komutu ile profilimi başlatmayı denediğimde şöyle bir hata alıyordum:

Job for netctl@Deneme.service failed because the control process exited with error code. 
See "systemctl status netctl@Deneme.service" and "journalctl -xe" for details.

Forumdaki yüce kişilik öncelikle bu hatanın birden fazla IP otomatik ayarlaması yapan hizmetin çalışması ile ilgili olabileceğini farkederek bu kontrolü yaptırmış:
ls -l /etc/systemd/system/multi-user.target.wants 
 Klasörünün altındaki hizmetleri listeletmiş. Benimkinde de dhcp hizmetine ait bir öğe vardı. Önce onu kaldırdım:
systemctl disable dhcpcd.service systemd-networkd.service wicd.service
Daha sonra bilgisayarımı tekrar başlattım. Bilgisayarım tekrar başladıktan sonra netctl komutlarına daha önceki gibi hata vermeyi bıraktı. Artık wifi şifremi değiştirdikten sonra ilgili profil dosyamdaki şifreyi değiştirip sonrasında
netctl stop wlo1-Deneme
ve ardından (bazı durumlarda ip link set wlo1 up gerekebilir)
netctl start wlo1-Deneme
yapmam yetiyor :)

Archlinux ve pacman

Ubuntu ve Fedora'nın ardından yeni favorim Archlinux. Bir deneme yapabilmek için diskimde yeni bir bölüm oluşturdum, manuel kurulumu tamamladım. Komut satırı, AUR ve pacman ile biraz daha yakın ilişkim olacak, orası kesin.

Pacman'i biraz özetlemek benim için faydalı olacak.

Öncelikle söylenen o ki pacman, apt ve dnf'e kıyasla daha hızlı. Ama ihtiyaç duyulan parametreler biraz daha içgüdüden uzak. Kendi içinde bir yapısı var elbette, ama öğremek zaman alacak.

 Pacman'da işlemler 5 ana kategoride:

-Q : (Query) pacman veritabanını sorgula
-R : (Remove) sistemden paket kaldır
-S : (Sync) paketleri senkronize et
-U : (Upgrade) Sistemdeki paketleri güncelle
-F : (File) sistemde kurulu dosyaların içinde sorgu çalıştır

Query (-Q) işlemleri için kullanılabilecek anahtarlar:
-i : Kurulu paket ile ilgili bilgileri göster. Örneğin
pacman -Qi firefox
-k : Bir pakedin sahip olduğu dosyaları kontrol et. Ayrıntılı kontrol için -kk kullanılabilir.
-l : Bir paketin sisteme kurduğu dosyaları göster
-o : Bir dosyanın sahibi olan paketi ara
-s : Kurulu paketlerin arasında bir paket ismi ara

Remove (-R) işlemleri için kullanılabilecek anahtarlar:
-s : recursive. bir paketi ve o paketle gelen tüm alt bağımlılıkları kaldırmak için
-u : unneeded. gereksiz paketleri de kaldır

Sync (-S) anahtarları:
-c : clean, yerel belleği temizle
-i : Kurulu olmayan paket ile ilgili bilgileri göster
-l : list
-q : quiet
-s : search. depolarda arama yap.
pacman -Ss chromium
-y : refresh. depolardan paket listesini tekrar indir
-u : upgrade. Tüm kurulu paketleri güncelle.
-w : indir, ama kurma

Genel bir anahtar:
-p : işlemi yapmaktansa sadece işlemin uygulanacağı paket adını yaz.

Birkaç örnek üzerinden gidelim:

pacman -Syu // tüm paketleri güncelle
pacman -S firefox // firefox'u depolardan kur
pacman -S extra/firefox // belli bir depodan kur
pacman -U /home/user/package // sistemdeki yerel dosyayı kur
pacman -U http://github/... // bir URL'den dosya kur
pacman -S gnome // gnome paket grubunu kur
pacman -R firefox // bir paket kaldır
pacman -Rs apache // bir paket ve tüm alt bağımlılıklarını kaldır
pacman -Rns $(pacman -Qtdq) // sistemdeki tüm kullanılmayan paketleri temizle/kaldır
pacman -Ru gnome // tüm gnome paket grubunu kaldır
pacman -Q | more // tüm kurulu paketleri listele
pacman -Ql apache // apache tarafından kurulan tüm dosyaları listele
pacman -Ss chromium // depolarda bir paket ara
pacman -Qs firefox // kurulu paketlerin içinde bir paket ara
pacman -Si chromium // kurulu olmayan bir paket hakkında bilgileri göster
pacman -Qi apache // kurulu bir paket ile ilgili bilgileri göster
pactree apache // bir paket ile ilgili bağımlılık ağacını göster
pacman -Qdt // artık gerekli olmayan paketleri listele
pacman -Sc  // cache verileri temizle
pacman -Scc // cache belleğe alınan paketleri sil
pacman-optimize // optimize pacman

9.07.2018

Komut satırından harici IP adresi bulmak

Arch linux kurulumu sırasında harici IP adresimi bulmak istedim. Aradığımda aşağıdaki gibi sonuçlara ulaştım:

OpenDNS ile:

dig +short myip.opendns.com @resolver1.opendns.com
Bu sayede öğrendim ki OpenDNS sunucuları üzerinde myip.opendns.com için yapılan sorgularda sorguyu yapan istemcinin adresi dönüyormuş.

Web Hizmeti ile:

Aynı  www.whatismyip.com gibi bir sayfaya girerek bakmak gibi, ama düz metin olarak IP dönüyor:
curl -S http://whatismyip.akamai.com
Elbette şu sayfada whatismyip.akamai.com için alternatifler de verilmiş.

Bir de bunları Windows'da yapmanın yollarını bulmak istedim. dig'in Windows eşdeğeri (basit bir DNS sorgusu yapmak aslında) nslookup veya Resolve-DnsName olabilir:
nslookup myip.opendns.com resolver1.opendns.com
Ama bu komut sonunda tek satırlık bir hedef dönmüyor, en alt satırdaki sonuca odaklanmak lazım.

Ya da Powershell eşdeğerini kullanarak
PS> Resolve-DnsName -Name myip.opendns.com -Server 208.67.220.220
Curl'un eşdeğerini aradığımda da zaten curl diye bir alias'ı bulunan Invoke-WebRequest cmdlet'ini gördüm. Sadece IP adresini döndürmek için alias'ı kullanarak:
PS> curl http://whatismyip.akamai.com | select -ExpandProperty content

1.06.2018

Windows'da güncellemeleri komut satırından yükleme

Linux ile fazla içli dışlı olunca insan Windows'da da aynı şeyleri arıyor. Linux'taki bütün güncellemelerin komut satırından yönetilmesi çok güzel. Powershell ile bunu Windows'da yapmayı bulunca çok hoşuma gitti.

Sanıyorum sürüm 3'ten beri Powershell'de PoweShellGet adında bir sağlayıcı (provider) bulunuyor. Bu sağlayıcı aracılığıyla bazı ek paketler (packages) yüklenebiliyor. Bunlardan biri de PSWindowsUpdate paketi.

Öncelikle PowerShell ile gelen modülleri görelim:

PS> Get-Module -ListAvailable

    Directory: C:\Program Files\WindowsPowerShell\Modules


ModuleType Version    Name                   ExportedCommands
---------- -------    ----                   ----------------
Script     1.1.7.2    PackageManagement      {Find-Package, Get-Package, ...
Manifest   2.0.2      Posh-SSH               {Get-SCPFile, Get-SCPFolder, ...
Script     1.6.5      PowerShellGet          {Find-Command, Find-DSCResource, ...
Binary     2.0.0.4    PSWindowsUpdate        {Enable-WURemoting, Get-WUJob, ...


    Directory: C:\Windows\system32\WindowsPowerShell\v1.0\Modules


ModuleType Version    Name                   ExportedCommands
---------- -------    ----                   ----------------
Manifest   1.0.0.0    ActiveDirectory        {Add-ADCentralAccessPolicyMember,...
Manifest   1.0.0.0    AppBackgroundTask      {Disable-AppBackgroundTaskDiagnosticLog, ...
Manifest   2.0.0.0    AppLocker              {Get-AppLockerFileInformation, ...


Liste bu kadar değild, kısa kestim. Burada kalın olarak vurguladığım kısım, bahsettiğim PowerShellGet modülü. Yanında bu modül ile gelen cmdlet'ler listelenmiş. Ben bunu güncellediğim için sürüm 1.6.5 gözüküyor. Güncellemek için

PS> Install-Module -Name PowerShellGet

kullanmak gerek. Tüm kurulumlar için yönetici yetkileri gerek. Ayrıca bu adımda NuGet'i de kurmak isteyecek, izin vermek durumundayız. Bunu yapınca sistemde 2 tane PoweShellGet olabilir, eski sürümü

$env:ProgramFiles\WindowsPowerShell\Modules\PowerShellGet

konumundan silebiliriz. Aslında Update-Module diye de bir cmdlet var, ama sadece Install-Module ile kurulan modüller Update-Module kullanarak güncellenebiliyormuş

Sonrasında PowerShellGet sağlayıcısının içinde ne gibi paketler var diye bakmak için Find-Package cmdlet'ini kullanabiliriz (öncesinde execution policy'yi remotesigned olarak ayarlamak gerekebilir):

Find-Package -ProviderName PowerShellGet

Bende 2820 tane paket çıktı. Bu paketlerden biri de PSWindowsUpdate. Yüklemek için şu komudu kullandım:

Install-Package -Name PSWindowsUpdate

Birkaç saniye içinde kuruldu. Bu paket ile acaba hangi komutlar geldi?

PS> Get-Command -Module PSWindowsUpdate

CommandType     Name                                 Version    Source
-----------     ----                                 -------    ------
Alias           Download-WindowsUpdate               2.0.0.4    PSWindowsUpdate
Alias           Get-WUInstall                        2.0.0.4    PSWindowsUpdate
Alias           Get-WUList                           2.0.0.4    PSWindowsUpdate
Alias           Hide-WindowsUpdate                   2.0.0.4    PSWindowsUpdate
Alias           Install-WindowsUpdate                2.0.0.4    PSWindowsUpdate
Alias           Show-WindowsUpdate                   2.0.0.4    PSWindowsUpdate
Alias           UnHide-WindowsUpdate                 2.0.0.4    PSWindowsUpdate
Alias           Uninstall-WindowsUpdate              2.0.0.4    PSWindowsUpdate
Cmdlet          Add-WUServiceManager                 2.0.0.4    PSWindowsUpdate
Cmdlet          Enable-WURemoting                    2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WindowsUpdate                    2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUApiVersion                     2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUHistory                        2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUInstallerStatus                2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUJob                            2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WULastResults                    2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WURebootStatus                   2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUServiceManager                 2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUSettings                       2.0.0.4    PSWindowsUpdate
Cmdlet          Get-WUTest                           2.0.0.4    PSWindowsUpdate
Cmdlet          Invoke-WUJob                         2.0.0.4    PSWindowsUpdate
Cmdlet          Remove-WindowsUpdate                 2.0.0.4    PSWindowsUpdate
Cmdlet          Remove-WUServiceManager              2.0.0.4    PSWindowsUpdate
Cmdlet          Set-WUSettings                       2.0.0.4    PSWindowsUpdate
Cmdlet          Update-WUModule                      2.0.0.4    PSWindowsUpdate


Şimdi Windows güncellemelerini kontrol edelim:

PS> Get-WindowsUpdate

Bu aşamada her güncelleştirme için status sütununda bazı kısatlamar yer alacak. Bunların anlamları şöyle:

[A|R]DIMHUB:
A: Accepted (kabul edilmiş)
R: Rejected (kabul edilmemiş)
D: Downloaded (indirilmiş)
F: Download failed (indirme başarısız)
?: Invoked (sanıyorum kurulumuna başlanmış ve devam eden)
I: Installed (kurulmuş)
R: Reboot required (tekrar başlatma bekleniyor)
M: Mandatory (zorunlu)
H: Hidden (gizlenmiş)
U: Uninstalled (kaldırılmış)
B: Beta (test aşamasında)


Bu güncellemelerin tümünü indirip kurmak istiyorsak şunu yapabiliriz:

PS> Get-WindowsUpdate -AcceptAll -Install -

Ya da belli birkaç güncelleştirmeyi saat 23:30'da kurmak üzere zamanlamak ve sonrasında gerekiyorsa otomatik olarak tekrar başltmak için:

PS> Get-WindowsUpdate -KBArticleID KB7585315 -AcceptAll -Install -ScheduleJob (Get-Date -Hour 23 -Minute 30 -Second 0) -AutoReboot

Tüm bu komutların -ComputerName anahtarını kullanarak uzak bir veya birkaç bilgisayarda da yapabiliriz.

PowershellGet altında dikkatimi bir paket daha çekti: PSScreenFetch. Linux altındaki screenfetch'in bir benzeri olabilir mi diye bir de bunu kurayım dedim:

PS> Install-Package -Name PSScreenFetch

Sonrasında da bu paket ile acaba hangi komutlar geldi diye baktım:

PS> Get-Command -Module PSScreenFetch

CommandType           Name                  Version  Source
--------------------  -----                 -------  ------
Function              Invoke-PSScreenFetch  0.0.3    psscreenfetch

Gelen Invoke-PSScreenFetch'i çalıştırdım ve sürpriz...


Windows için screenfetch! Tek kötü tarafı, sadece Windows 10'da çalışıyor. Madem yaptınız, az daha uğraşıp diğer sürümlerde de çalıştırsaydınız ya... :/

23.05.2018

Fedora 28'e yükseltme sorunu

Fedora 28'e yükseltme sırasında aşağıdaki gibi bir hata aldım:

Error:
 Problem: nss-pem-1.0.3-6.fc27.i686 has inferior architecture
 - nss-pem-1.0.3-6.fc27.x86_64 does not belong to disupgrade repository
 - problem with installed package nss-pem-1.0.3-6.fc27_i686

Sorunun bir dnf hatasından kaynaklandığı, çözüm olarak nss-pem'i elle kurulması önerilmiş [1]:

sudo dnf install nss-pem-1.0.3-9.fc28

ya da daha açık bir şekilde sürüm 28 için [2]:

sudo dnf install nss-pem-1.0.3-9.fc28 --releasever=28

İşe yaradı.


---
[1] https://ask.fedoraproject.org/en/question/119529/upgrade-issue-does-not-belong-to-a-distupgrade-repository/
[2] https://bodhi.fedoraproject.org/updates/FEDORA-2018-7f8b60cd0e

15.05.2018

Windows komut satırı gelişmiş kullanımı

Linux ve MacOS gibi Windows'un da yazarak komut verilen bir arayüzü var. Bu arayüzü yıllardır neredeyse aynı. Windows 10 ile birlikte bazı ufak değişiklikler oldu (Alt+Enter ile tam ekran olma, şeffaflık kazanma gibi) ama temelde değişen ciddi birşeyler yok. Sık kullananlar için bazı ileri seviye yöntemler faydalı olabilir, tekrarlanan yazmaları azaltmak için.


Şu sayfada bazı ileri seviye teknikler anlatılmış. Benim ilgilendiğim ise iki bölümden oluşan bir komutun birinci ve ikinci kısımlarını tekrar yazmadan kullanabilmek.

Örneğin şöyle bir komut kullandığımızı varsayalım:
ping hedefpc1
Burada komut boşlukla ayrılan iki bölümden oluşuyor. Birinci bölüm ping komutu, ikinci bölüm ise bilgisayar adı.

Eğer arka arkaya birkaç cihazı ping'lemek istiyorsak bu komuttaki ilk bölüm aynı kalacak, ikinci bölüm değişecek demektir. Her seferinde ise ping'i yazmaktan kurtulabiliriz. Bunun için önce F2'ye sonra da boşluk tuşuna basmak olacaktır. Bu tuş kombinasyonu bize bir önceki komutun ilk boşluk karakterine kadarki kısmını verecektir. Sonrasında bilgisayar ismini yazarak devam edebiliriz.

Veya tam tersi bir durum olsun. Varsayalım ki önce hedefin ICMP'ye cevap verip vermediğini kontrol ettik, eğer cevap veriyorsa başka bir işlem yapmak istiyoruz. Bu durumda bilgisayar adını yazmadan sadece ping komutunu başka bir komut ile değiştirmek istiyoruz. Bu durumda yapılacak olan önce F8 tuşu ile bir önceki komudu ekrana getirmek (takipçi otomatik olarak satır başına konumlandırılır) ve daha sonra F4'e ve boşluk tuşuna basmak. Bu şekilde boşluk karakterine kadar olan kısım (yani ping) silinir, sadece bilgisayar adı kalır.

Evet, bunun yerine linux terminalindeki gibi sadece Ctrl+w kısa yolunun olmasını isterdim, ama elimizdeki bu.

Bir de son olarak komut satırında kullanılan fontu değiştirmek var. Bu da aynı komut satırını yıllardır görüp sıkılanlar için. Komut satırı fontlarını değiştirmek için sistem menüsünden özelliklere gelerek Font sekmesine geçebiliriz. Ama buraya sistemde yüklü olan bütün fontlar gelmeyecektir. Buraya gelmesini istediğimiz fontlar için Windows kayıt defterine bazı girişler yapmak gerek.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont

anahtarı altına adı ilk fonta ait kayıt defteri değeri adı "00"dan (çift sıfır) başlayarak, ikincisi "000" (üç sıfır) diye her seferinde 1 fazla sıfır "0" koyarak girişler yapmak, bunların da değerlerini font ismi olarak ayarlamak gerek. Örneğin ben Google'ın Noto Mono fontlarını kullanmak istedim. Bu font, girdiğim ilk ek font olduğu için "00" ismini kullandım. İkincisini girmek isteseydim "000" kullanacaktım. Bu girişin değeri olarak da "Noto Mono" (tabi öncesinde ilgili fontları download etmek lazım) yazdım, aşağıdaki gibi:


Nihayetinde font sekmesinde artık seçimim gözüküyor. Buraya sadece sabit genişlikli fontların (monospace) eklenmesini tercih etmek isteyebilirsiniz.


Bu yöntemin bir dezavantajı, F7 geçmiş menüsünde olduğu gibi karakter tabanlı pencere kenarlıkları istenilen şekilde görüntülenemiyor.

4.04.2018

Powershell'de fonksiyon hangi modülden geliyor

Bir yanlışlık yapıp oluşturduğum fonksiyon'a var olan bir başka fonksiyon ile aynı ismi vermişim. Aslında böyle bir fonksiyon bile olduğunu bilmiyordum, tesadüfen öğrenmiş oldum.

Peki bir fonksiyonun hangi modülden geldiğini nasıl bulurum? Get-Command cmdlet'i ile.
Get-Command Test-DNSServer
CommandType  Name                 Version    Source
-----------  ----                 -------    ------
Function     Test-DnsServer       2.0.0.0    DnsServer

Görüldüğü gibi Source altında DnsServer adında bir modül adı yazıyor.
Peki benim yanlışlıkla aynı ismi verip sonradan düzelttiğim fonksiyon hangi modülden?

Get-Command Test-DNSServerResponse
CommandType  Name                   Version    Source
-----------  ----                   -------    ------
Function     Test-DnsServerResponse 2.0.0.0    Local
Bu fonksiyon, görüldüğü gibi kendi yazdığım ve adı local olan başka bir modülden.

Get-Command ayrıca adını tam bilmediğimiz cmdlet veya fonksiyonları da aramak için faydalı:
get-command Get-Net*IP*
Veya test ile başlayan tüm cmdlet'leri aramak için:
get-command -Verb test
Ya da tireden sonraki ikinci kısmında connection olan cmdlet'leri aramak için:
get-command -Noun connection