12.03.2019

Linux'ta açık bir pencerenin PID'sini ve süreç adını bulma

Manjaro'da kurulu uygulamaların arasında yer alan Microsoft Excel Online'ı görüp ne olduğuna bakmak istedim. Aşağıdaki gibi bir ekran açıldı.


Microsoft Excel Online olarak çalılşan programın ne olduğunu merak ettim. Bu gibi durumlarda xprop'u (Property Displayer for X) kullanıyorum. Komut satırından

$ xprop _NET_WM_PID

çalıştırıyorum. Bundan sonra farenin okuyla bu pencerenin içine tıklıyorum. Bana farenin altındaki pencerenin PID'sini veriyor.

_NET_WM_PID(CARDINAL) = 1330

Bundan sonra da ps ile 1330 numaralı sürecin ne olduğuna bakmak kalıyor.

$ ps -p 1330 -o pid,command
   PID COMMAND
  1330 python3 ./ms-excel-online


Demek bir python betiğiymiş. Acaba ms-excel-online nerede?

$ locate ms-excel-online
/usr/share/ms-office-online/excel/ms-excel-online

Bunu da ilk defa bir linux dağıtımında görüyorum. LibreOffice falan varken Microsoft Office'in online sürümüne ait linkler... Linux da Microsoft'u seviyor mu acaba?

2022-01-20 ek: Şu sayfada konu enine boyuna tartışılmış. Alternatif yöntem olarak xdotool önerilmiş. Kurulu değilse Fedora için aynı isimli paketi kurabiliriz. Kullanım şöyle:

$ xdotool selectwindow getwindowpid

Xfce'de görev yöneticisinin (xfce4-taskmanager) araç çubuğunda bulunan "artı" işaretine benzeyen buton tıklandığında da benzer şekilde çalışan pencerenin seçilerek görev yöneticisindeki çalışan süreçler listesindeki satırına odaklanılması sağlanıyor. X yerine Wayland kullanan bir sistemde şu sayfada lg (looking glass) önerilmiş.

tcplay kullanımı

Truecrypt'ten ses seda yok. Uzun süredir güncellenemeyen programın yerine artık alternatifleri değerlendirme zamanı geldi.

Archlinux Wiki'sinde tcplay gözüme çarpmıştı, cryptsetup ve Veracrypt'in yanısıra. tcplay'i denemeye karar verdim. Kurulum basit:

$ sudo pacman -S tcplay

Bundan sonra elimizdeki örneğin tcvolume.tc adındaki bir truecrypt birimini örneğin /mnt klasörüne bağlamak için şu komut dizileri gerek:

$ sudo losetup /dev/loop0 tcvolume.tc
$ sudo tcplay -m tcvolume.tc -d /dev/loop0
$ sudo mount -o nodev,nosuid,uid=100,gid=100 /dev/mapper/tcvolume.tc /mnt

İşimiz bittikten sonra da kaldırmak için

$ sudo umount /mnt
$ sudo dmsetup remove tcvolume.tc
$ sudo losetup -d /dev/loop0

Buradaki kritik nokta loop0. Şuradaki bilgiye göre yeni linux çekirdeklerinde açılışta varsayılan olarak loop modülü yüklenmiyor. Dolayısıyla loop0, loop1 vs yok. Bunları yaratmak gerek. Önce

$ sudo modprobe loop

(eğer her açılışta bunu yapmasını istiyorsak

$ sudo tee /etc/modules-load.d/truecrypt.conf <<< "loop"

daha iyi olacaktır)

ile loop modülünü yüklemek, ardından da örneğin 4 tane /dev/loop# yaratmak gerek:

$ echo "options loop max_loop=4" > /etc/modprobe.d/eightloop.conf

Bunu bir shell script'i ile yapmak
Yukarıdaki işlemer her dosya için ayrı ayrı oldukça uğraştırıcı olur. Onun için az biraz kısatılmış hali şöyle bir bash script'i ile olabilir:

tcmount.sh
#!/bin/bash
sudo losetup /dev/loop$1 $2
sudo tcplay -m $2 -d /dev/loop$1
sudo mount -o nodev,nosuid,uid=1000,gid=1000 /dev/mapper/$2 $3


tcumount.sh
sudo umount $3
sudo dmsetup remove $2
sudo losetup -d /dev/loop$1


Örnek olarak yine tcvolume.tc dosyasını /mnt klasörüne bağlamak için:

$ sudo tcmount.sh 0 tcvolume.tc /mnt

ve bağlantıyı kesmek için ise

$ sudo tcumount.sh 0 tcvolume.tc /mnt

kullanmak gerek. Aynı anda birden fazla dosyanın bağlanması ihtimaline karşı loop için de bir parametre kullandım. Gerekli görülmezse $1 silinerek giriş argümanı sayısı 2'ye düşürülebilir.

11.03.2019

Firefox'ta saatin yanlış algılanması

Kullandığım bir web uygulaması, Firefox'ta saatleri 3 saat geride gösteriyordu. Sunucu tarafında ve bilgisayarımdaki saat/zaman dilimi ayarlarının normal olduğunu doğruladıktan sonra aynı uygulamayı kullanan başka bilgisayarlarda da kontrol ettim: hiçbir sorun yoktu. Demek benim bilgisayarıma özgü bir sorun.

Aklıma Process Explorer ile firefox'un ortam değişkenlerini incelemek geldi. Şöyle bir ekranla karşılaştım:


Komut satırından kontrol ettiğimde böyle bir ortam değişkenimin olmadığını da doğruladım:


Demek ki birşey, firefox'un

set TZ=UTC

ile başlamasını sağlıyor. Bunu doğrulamak için firefox'un içinden Dosya>Aç komutunu vererek C:\Windows\System32 klasörüne gidip cmd.exe'yi sağ tıklayarak çalıştırı seçtim (Aç değil!). Açılan yeni komut satırı penceresinde aynı şeyi denediğimde ise şunu gördüm:



Bu nasıl oluyor diye bir kez daha aradığımda, daha sonuca yönelik kelimeler kullandım sanıyorum, bu sefer şu sayfayı buldum. Anlaşılan TOR browser'dan örnek alınarak adapte edilen yeni finger printing özelliğini etkinleştirince bu da bir özellik olarak geliyormuş.




O kadar sorunun kısa bir süre önce kendi yaptığım bir değişiklikten kaynaklanıyor olmasına sevinsem mi, üzülsem mi bilemedim.

7.03.2019

Manjaro, Fedora e EFI disk bölümü

Bir bilgisayara önce Manjaro kurdum. Son zamanların favori dağıtımı. Benim de hoşuma gitti. Ama yetmedi, yanına bir de Fedora kurmak istedim. Manjaro'yu kurmadan önce live CD ortamında fdisk ile diski bölümlendirmiştim. Manjaro'yu kurdum, gayet güzel çalıştı, ama Fedora'yı kurma aşamasında sürekli aşağıdaki hatayı alıyordum.



Görüldüğü gibi Fedora, EFI bölümünün yapısından yakınıyor. Oysa Manjaro bu yapıyı kabul edip, kurumu tamamlayarak çalışmaya bile başladı. Acaba tam olarak neyi beğenmedi diye arattığımda şu reddit gönderisinde gdisk ile bölüm tipinin değiştirilmesinden bahsediyordu. Benim durumumda gdisk ile disk tablosuna baktığımda aşağıdaki gibi bir sonuçla karşılaştım:


Görüldüğü gibi Manjaro sda1 bölümünün tipi 0700 (Microsoft Basic Data, ki bu da FAT32 aslında) olarak görüyor.

Hemen

$ sudo gdisk /dev/sda

ile gdisk'i başlatıp t komutuyla bölüm tipini ef00 olarak seçtim, Fedora bundan sonra sorunsuz ilerledi.


Ama sanıyorum başka bir hatadan /boot/efi bölümünü bozduğumdan (galiba kuruluşta sda1'i biçimlendirdim) Fedora açılmasına rağmen Manjaro açılmadı.

Bunu da kısmen şuradaki adımları izleyerek düzelttim. Boot menümde Manjaro'nun fallback initramfs'i vardı ve onunla açıldı. Açıldıktan sonra da şu komut ile EFI kipindeki GRUB'ı tekrar yazdım:

$ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=manjaro --recheck
$ sudo update-grub

Güncelleme 2019-03-11: Bundan sonra Fedora ile giriş yapmak istediğimde her şifre yazışımdan sonra tekrar giriş ekranına dönmeye başladı. Şurada sorunun sebebini anlatan arkadaş, bu işin sorumlusunun SELinux olduğunu, başka bir linux ile dual boot yapılan ve muhtemelen ortak bir /home disk bölümü kullanan Fedora'nın bu hataya yol açabileceğini yazmış, ki bu da tam olarak benim durumum. Çözüm olarak giriş (login) ekranındayken Ctrl+F2 ile grafik arayüzden çıkıp konsola giriş yapıp denemek için geçici olarak SELinux'u devre dışı bırakmayı

$ sudo setenforce 0

ardından eğer giriş yapmayı başarabildiysek tekrar GUI oturumumuzu sonlandırarak tekrar Ctrl+F2 ile konsola giriş yaparak önce SELinux'u tekrar etkinleştirmeyi

$ sudo setenforce 1

daha sonra da /home için varsayılan SELinux ayarlarına dönmeyi önermiş:

$ sudo restorecon -R /home

Bunun normal şartlar altında bir veri kaybına yol açmaması gerekiyor. Bu adımların sonucunda ben istediğim sonuca ulaştım.

---
https://bugzilla.redhat.com/show_bug.cgi?id=746895

Sistem EFI kipinde mi açılmış

Açık bir linux sistemin EFI/UEFI mı yoksa BIOS kipinde mi açıldığını nasıl anlarız?

En ayrıntılı yöntem şu gönderide Derobert'in cevabında verilmiş.

dmesg'a bakmak

Basitçe  kernel ring buffer'da ilgili kaydı kontrol etmek:
$ dmesg | grep "EFI v"
sonucunda eğer

[    0.000000] efi: EFI v2.31 by American Megatrends

gibi bir satır dönerse EFI ile açılmıştır. Hiç birşey dönmezse BIOS kipindedir.

/sys/firmware/efi'ı listelemek
Aşağıdaki komut ile efivars varsa EFI'dir

$ ls /sys/firmware/efi
config_table    fw_platform_size  runtime          systab
efivars         fw_vendor         runtime-map

BIOS sistemlerinde yukarıdaki komut bir sonuç üretmez

efibootmgr sonucuna bakmak
Eğer aşağıdaki gibi bir sonuç alınıyorsa EFI kipidir.

$ sudo efibootmgr
BootCurrent: 0004
BootOrder: 0004,0005,0000,0001,0002,0003
Boot0000* EFI VMware Virtual SCSI Hard Drive (0,0)
Boot0001* EFI VMware Virtual IDE CDROM Drive (IDE 1:0)
Boot0002* EFI Network
Boot0003* EFI Internal Shell (Unsupported option)
Boot0004* Manjaro
Boot0005* Fedora

Ya da şöyle bir çıkış alınıyorsa BIOS kipindedir:

EFI variables are not supported on this system.

efivars ile bakmak
Eğer aşağıdaki komut ile efi değişkenleri listeleniyorsa EFI kipindedir.

$ efivar -l

Hiçbir sonuç vermiyorsa BIOS kipindedir.

/boot/efi bölümü bağlanmış mı
EFI olarak açılmışsa bir disk bölümünün /boot/efi olarak bağlanmış olması gerekir. Bunu kontrol etmek için

$ sudo mount -l | grep sda

veya

$ df -h --local | grep /boot

kullanılabilir

Windows için?
Açık bir Windows sistemin EFI kipinde mi, BIOS kipinde mi açıldığını anlamak için birkaç yol var. En kolayı msinfo32.exe ile bakmak [1],[2]:



 BIOS Mode alanı bu iş ile ilgili bilgi veriyor.

Bu olmazsa %SystemRoot%\Panther\setupact.log dosyasının içindeki Callback_BootEnvironmentDetect satırına bakmak gerek. BIOS için

Code:Callback_BootEnvironmentDetect: Detected boot environment: BIOS

UEFI için ise
Code:Callback_BootEnvironmentDetect: Detected boot environment: UEFI

görülecektir.

Diğer bir yöntem ise bcdedit.exe ile (%SystemRoot\System32 klasöründe) Windows önyükleyicisini sorgulamak. Bunun için yönetici olarak açılmış bir komut satırında şu komudu çalıştırmak gerek:

bcdedit /enum

Bunun sonucunda "Windows Boot Loader" başlığının altında path'e bakmak gerek. BIOS için

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.exe


EFI için ise

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.efi


gibi bir sonuç verir.
--
[1] https://www.easyuefi.com/resource/check-windows-is-booted-in-uefi-mode.html
[2] https://superuser.com/questions/464760/how-to-tell-if-the-windows-installer-boots-in-efi-or-bios

10.01.2019

Linux'a Powershell Core kurulumu

Powershell bir süredir açık kaynak kodlu. Aslında açık kaynak kodlu haline Powershell Core deniyor ve github'da kaynak kodları mevcut. Powershell ile aralarında ufak farklılıklar var.

Denemek için Fedora'ya powershell kurmaya karar verdim. Microsoft'un Poweshell bloğu sayfasında linux için kurulum adımlarına rastladım. Gariptir, Ubuntu 14.04 ve 16.04 için çok iyi tarif edilmiş bir kurulum yönergesi mevcutken Fedora için yok. CentOS var, o da yum tabanlı, ben de benzer bir yol izledim. Öncelikle yeni bir depo oluşturmak lazım. Şu adreste depo linki verilmiş. Bunu önce indirdim ve /etc/yum.repos.d altına kopyaladım.
$ curl https://packages.microsoft.com/config/rhel/7/prod.repo > microsoft.repo
$ sudo cp microsoft.repo /etc/yum.repos.d
Sonrasında depoları güncelleyerek kurulum komutunu verdim.  Kurulacak paketin adı powershell.
$ sudo dnf check-update
$ sudo dnf install powershell
50 MB gibi bir boyutu var, 6.1.1 sürmünün. Kurulum tamamlandıktan sonra
$ pwsh
yazarak powershell'e geçiş yaptım. İlk denememi aşağıdaki gibi yaptım.


Dünya garip bir dünya oldu: Microsoft loves Linux!

---
düzeltme (10.01.2019):
Github'da Fedora için kurulum adımları verilmiş. Yakışıklı yönerge şöyl:

# Register the Microsoft signature key
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

# Register the Microsoft RedHat repository
curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo

# Update the list of products
sudo dnf update

# Install a system component
sudo dnf install compat-openssl10

# Install PowerShell
sudo dnf install -y powershell

# Start PowerShell
pwsh

9.01.2019

Linux terminali özelleştirmek

Linux'ta vakit geçirdikçe Windows'un komut satırı pek bi sıradan gözüküyor insanın gözüne. Ama buna çare yok (ya da çare cmder!)


Yukarıda Fedora ile gelen standart terminal penceresi. Renklendirme yok, prompt standart. Biraz kendime göre özelleştirmeye çalıştım. Bunun sonuçlarında da şöyle bir sonuca ulaştım:


Biraz renklendirilmiş, saat ve geçmiş bilgisi eklenmiş. Bu sonuca nasıl vardığımı kısaca anlatayım.

Öncelikle prompt satırında "[" ve "]" arasında yazılmış 3 alan var. Birinci alan varsayılan haliyle

[metin@ozm-fed ~]

kısmı. Burada kullanıcı adı ve bilgisayar adını, sonrasında da bulunduğumuz klasör adını görüyoruz. Bunu kodlamak için

[\u@\h \w]

kullandım.

İkinci kısım ise saati gösteriyor. Bunun için de

[\A]

kullandım.

Üçüncü kısım ise komut geçmişindeki mevcut indeksi gösteriyor. Bunun içinse

[\h]

kullandım. Son prompt karakteri olarak \$ aşikar. Tüm bunları birleştirince şöyle bir dizi çıkıyor:

"[\u@\h \w] [\A] [\h] \$"

Ancak bu renklendirilmemiş hali. Renklendirme işi ise başka bir dünya. Renk kodları vermek için escape karakteri kullanmak gerek. Escape karakteri başlangıcı \[ ile, bitişi ise \] ile belirtiliyor. Renk kodları ise \e[ ile başlayan ve m ile bitecek şekilde belirtiliyor. Garip ama böyle.

Renk kodları şöyle:
  • 30: Siyah
  • 31: Kırmızı
  • 32: Yeşil
  • 33: Sarı
  • 34: Mavi
  • 35: Mor
  • 36: Camgöbeği
  • 37: Beyaz
Ayrıca bir de biçem kodları var:

  • 0: Normal metin
  • 1: Kalın veya ince, terminale göre değişir
  • 4: Altı çizili
Fon rengi kodları da şöyle:
  • 40: Siyah fon
  • 41: Kırmızı fon
  • 42: Yeşil fon
  • 43: Sarı fon
  • 44: Mavi fon
  • 45: Mor fon
  • 46: Camgöbeği fon
  • 47: Beyaz fon

Nihayet sarı bir kullanıcı adı yazmak için şu kodlama gerek:

\[\e[0;33m\]\h

Sarı ile vurgulanan alan sadece \h ile belirtilen kullanıcı adını düz metin (0) ve sarı renk (33) ile yazmak içindi. Eğer bir de arka fon rengi belirtmek istiyorsak 0'dan önce de onu yazmamız gerekecekti, yine noktalı virgille ayırarak. Aşağıda örneği var. Kullanıcı adını sarı ile yazdıktan sonra tekrar @ karakterini varsayılan renkte yazması için sıfırlamak gerek. Bunun için de

\[\e[0m\]

kullanılır. Bu şekilde tüm promptu oluşturmak için şöyle bir kodlama gerekti:

[\[\e[0;33m\]\u\[\e[0m\]@\[\e[0;31m\]\h\[\e[0m\] \w] [\[\e[0;34m\]\A\[\e[0m\]] [\[\e[0;32m\]h:\!\[\e[0m\]] \[\e[43;1;37m\]$\[\e[0m\]

Şu renk kodlamasıyla ayrılan bölüm prompt karakterini sarı fon üzerine beyaz olarak yazmak içindi.

Bu karakter dizisini PS1 adlı bir ortam değişkenine atarak etkin kılabiliriz. Bunu her yeni terminal penceresinde kullanabilmek için ise profil klasörümüzdeki .bashrc dosyasının içine

PS1="[\[\e[0;33m\]\u\[\e[0m\]@\[\e[0;31m\]\h\[\e[0m\] \w] [\[\e[0;34m\]\A\[\e[0m\]] [\[\e[0;32m\]h:\!\[\e[0m\]] \[\e[43;1;33m\]\$\[\e[0m\] "

gibi bir satır ekleyerek yapabiliriz.

ls komutunun renkli çıktı üretmesi için .bashrc dosyasının içine bir alias eklenebilir:

export ls='ls --color=ALWAYS'

Burada, Manjaro için ls= den sonra gelen kısmın tek tırnak içinde olmasına, color'dan sonra iki nokta üstüste değil eşittir kullanılmasına ve ALWAYS'sin büyük harflerle yazılmasına dikkat etmek gerek. Fedora için ise always küçük harflerle yazılmalı.

Ya da ls komutunda gösterilen tarih ve saat biçimini değiştirmek için Manjaro için yine .bashrc'de aşağıdaki gibi bir ortam değişkeni tanımlanabilir:

export SYSTEM_TIME=long-iso

Fedora için ise ls komutu parametresi --time-style=long-iso kullanılabilir. Yukarıdakiyle birleştirildiğinde toplu alias şöyle olabilir:

alias ls='ls --color=always --time-style=long-iso'

2021-12-20 düzenleme: Aşağıdaki bash değişkenlerini tanımlayarak işimizi kolaylaştırabiliriz.

Sari_Siyah = "\[\e[0;33m\]"
Kirmizi_Siyah = "\[\e[0;31m\]"
Mavi_Siyah = "\[\e[0;34m\]"
Yesil_Siyah = "\[\e[0;32m\]"
Sari_Sari = "\[\e[43;1;37m\]"
Sifirla = "\[\e[0m\]"
Kullanici = "${Sari_Siyah}\u${Sifirla}"
Makine = "${Kirmizi_Siyah}\h${Sifirla}"
Konum = "${Kirmizi_Siyah}\w${Sifirla}"
Saat = "${Mavi_Siyah}\A${Sifirla}"
Gecmis = "${Yesil_Siyah}h:\!${Sifirla}"
Prmpt = "${Sari_Sari}\$${Sifirla}"
PS1 = "[${Kullanici}@${Makine} ${Konum}] [${Saat}] [${Gecmis}] ${Prmpt}"


Ya da direk hazır kodlanmışı alıp kopyalayabiliriz.
 
2023-01-02: Hiç uğraşmadan yapmak için şu sayfa süper!

2025-02-15 Ek:

# Function to calculate and display command duration
function preexec() {
    TIMER_START=$(date +%s%N)
}

function precmd() {
    # Calculate duration in seconds and milliseconds
    if [ -n "$TIMER_START" ]; then
        TIMER_END=$(date +%s%N)
        DURATION=$(( (TIMER_END - TIMER_START) / 1000000 ))  # Convert nanoseconds to milliseconds
        if (( DURATION > 1000 )); then
            DURATION_DISPLAY="$((DURATION / 1000))s"
        else
            DURATION_DISPLAY="${DURATION}ms"
        fi
    else
        DURATION_DISPLAY="0ms"
    fi
}

PROMPT_COMMAND=precmd

# Function to set the prompt
function set_prompt() {
    local term_width=$(tput cols)  # Get terminal width

    # Left section: current working directory in blue
    local cwd="\[\e[1;34m\]\w\[\e[0m\]"

    # Right section: date and time in green
    local datetime="$(date +'%Y-%m-%d %H:%M:%S')"
    local datetime_length=${#datetime}

    # Calculate padding to right-align the date and time
    local padding=$((term_width - datetime_length))

    # Ensure the padding is valid
    if (( padding < 0 )); then
        padding=0
    fi

    # First line: Left (cwd) and right (datetime)
    PS1="${cwd}\[\e[${padding}G\]\[\e[1;32m\]${datetime}\[\e[0m\]\n"

    # Second line: Command duration + "$" prompt
    PS1+="\[\e[1;36m\]${DURATION_DISPLAY}\[\e[0m\] $ "
}

PROMPT_COMMAND="set_prompt; $PROMPT_COMMAND"
nd 'set show-all-if-ambiguous on'
bind 'TAB:menu-complete'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
# veya
# bindkey '\e[A' history-beginning-search-backward
# bindkey '\e[B' history-beginning-search-forward 

---

[1] https://www.digitalocean.com/community/tutorials/how-to-customize-your-bash-prompt-on-a-linux-vps

[2] https://dev.to/rossijonas/how-to-set-up-history-based-autocompletion-in-zsh-k7o

 

<