22.12.2019

Clam antivirüs kullanım

Linux makinemde bir antivirüs yüklü değil. Ama indirmek zorunda olduğum dosyaların bir genel taramasını yapabilmek için clam'e başvurdum. Kurmak için
sudo pacman -S clamav
kullandım. Ardından freshclam ile güncellemeden önce -V parametresiyle tanım dosyası sürümünü kontrol ettim:
$ sudo freshclam -V   # büyük V harfi ya da --version
ClamAV 0.102.1/25671/Sun Dec 22 12:58:12 2019

Ya da clamscan --version (ya da -V) da kullanılabilir.

Güncel. Güncel olmasaydı -V'yi kullanmadan güncelleştirebilirdim:

Şu sayfada clam hizmetlerini etkinleştirmekten bahsedilmiş.

sudo systemctl enable --now clamav-daemon
sudo systemctl enable --now clamav-freshclam

Taramak istediğim klasörü şu şekilde taradım:
sudo clamscan /klasor -r -l /home/metin/clam.log
Burada, tahmin edilebileceği gibi -r anahtarı tüm alt klasörleri de taramaya dahil etmesi için, -l ise /home/metin/clam.log adındaki dosyaya yapılan işlemlerin ve bulunan sonuçların loglarını yazmasını söylüyor.

Daha ayrıntılı bilgi için  

https://wiki.archlinux.org/index.php/ClamAV#OnAccessScan

https://www.ubuntupit.com/how-to-install-and-use-clamav-antivirus-on-ubuntu-linux/

1.11.2019

Windows'da kapanma olaylarının takibi

Beklenmeyen kapanma. En çok merak edilen konulardan birisi. Evde veya işte, kişisel bilgisayar veya sunucu. Soru hep aynı. Neden kapanmış?

Aşağıdaki olayları bilgisayarın açılış ve kapanış saatlerini ve hatta nedenlerini görüntülemek için kullanabiliriz (hepsi System evenlog'da).

Event ID Source Message
6005EventlogThe Event log service was started.
6006EventlogThe Event log service was stopped.
6008EventlogThe previous system shutdown at <date time> was unexpected.
6009EventlogMicrosoft (R) Windows (R) 10.00. 19042 Service Pack 1 Multiprocessor Free.
(Sistemin açışında sürüm bilgisinin kaydını düşen bir olay. 6005, 6006 ve 6009 olayları aynı anda kayda düşmüş gibi gözükür)
6013EventlogThe system uptime is <seconds> seconds.
(Aslında açılış ve kapanışla ilgisi yok, sistemin kaç saniyedir açık olduğunu bildiren periyodik bir kayıt)
1074User32The process <process> (<computer>) has initiated the power off of computer <computer> on behalf of use
 <username> for the following reason: Other (Unplanned)
12Kernel-GeneralThe operating system started at system time <date time>
13Kernel-GeneralThe operating system is shuting down at system time <date time>
109Kernel-PowerThe kernel power manager has initiated a shutdown transition.
107Kernel-PowerThe system has resumed from sleep. (fast boot etkin olan Windows 10 sistemlerde kapanma yerine)
1Kernel-GeneralThe system time has changed to <datetime> from <datetime>.
Change Reason: System time synchronized with the hardware clock. (fast boot etkin olan Windows 10 sistemlerde açılma yerine)
42Kernel-PowerThe system is entering sleep.
Sleep Reason: Application API
41Kernel-PowerThe system has rebooted without cleanly shutting down first. This error could be caused if the system stopped responding, crashed, or lost power unexpectedly.
1Power Troubleshooter    
The system has returned from a low power state.
Sleep Time: ...
Wake Time: ....... (42/Kernel-Power olayı ile düşük güç moduna girmek ve bu olayla çıkmak)
19WindowsUpdateClientInstallation Successful: Windows successfully installed the following update... (tekrar başlatma gerekmeyen durumlarda)
20WindowsUpdateClientInstallation Failure: Windows failed to install the following update...
21WindowsUpdateClientRestart Required: To complete the installation of the following updates, the computer must be restarted. Until this...
22WindowsUpdateClientRestart Required: To complete the installation of the following updates, the computer will be restarted within 15 minutes...
27WindowsUpdateClientAutomatic Updates is now paused. (güncelleştirmelerin ardından yeniden başlatılana kadar hizmet durdurulur)
43WindowsUpdateClientInstallation Started: Windows has started installing the following update...
44WindowsUpdateClientWindows Update started downloading an update.
26Application PopupBir uygulamanın hata verdmesi veya kaldırılması sebebiyle tekrar başlatma gerektiğini bildiren çeşitli mesajlar    
1000-1002    
Application Error Bir uygulama beklenmeyen bir şekilde kapandığında. (bu olay Application Event Log'a yazılır)


İlk 3 sırada listelenen 6005, 6006 ve 6008 olaylarının kaynağı neden eventlog? Çünkü bilgisayar düzgün bir şekilde başlatılırken ilk başlayan hizmet eventlog, düzgün kapanırken de en son durdurulan hizmet de eventlog hizmetidir. Ancak çalışma süresi boyunca bu hizmetler durdurulup tekrar başlatılabileceği için dikkatli davranmak gerekebilir.

Beklenmeyen bir kapanmayı (güç kesintisi, donanım arızası gibi) ile ilgili 6008/Eventlog, 1024/User32 ve 41/Kernel-Power olayları aranabilir.

Son 2 satırda yer alan 21/Windows Update Agent ve 26/Application Popup olayları ise tekrar başlatmanın kendisine değil, muhtemel sebebine dair bir bilgi içerebilir.

Powershell Get-WinEvent kullanarak sorgularken ProviderName olarak WindowsUpdateClient yerine ya "Microsoft-Windows-WindowsUpdateClient" yazmak, ya da "*WindowsUpdateClient" şeklinde wildcard kullanmak gerekir. Örneğin:
Get-WinEvent -ComputerName <bilgisayar> -FilterHashTable @{LogName="System";ProviderName="*WindowsUpdateClient"} -MaxEvents 10

Birkaç olay ID'sini ve sağlayıcı ismini bir arada kullanarak şu şekilde bir komut son 10 günde olup bitene göz atmak için faydalı olabilir.

Get-WinEvent -FilterHashTable @{LogName="System";ProviderName=("Microsoft-Windows-WindowsUpdateClient","User32","Microsoft-Windows-Kernel-General");Id=12,13,19,20,21,22,43,44,1074;StartTime=(Get-Date).AddDays(-10)} |Select TimeCreated, Id, Message |Format-Table -AutoSize -Wrap

Event ID'leri ile sınırlamadan, örneğin son 2 saatteki geniş bir olay zincirini incelemek için

Get-WinEvent -FilterHashTable @{LogName="System";ProviderName=("Microsoft-Windows-WindowsUpdateClient","User32","Microsoft-Windows-Kernel-General","Microsoft-Windows-Kernel-Power","Microsoft-Windows-Power-Troubleshooter");StartTime=(Get-Date).AddHours(-2)} |Select TimeCreated, Id, Message |Format-Table -AutoSize -Wrap

31.10.2019

KDE Plasma'da uygulamalar için açılışta başlama seçenekleri

KDE5 Plasma'da bir uygulamam bilgisayar her açıldığında otomatik başlıyordu. Sistem Ayarları>Başlatma ve Kapatma kısmında ya da ~/.config/autostart klasörünün altında bir giriş bulamadığım için bu uygulamanın nasıl her seferinde tekrar başladığını merak ettim. Biraz araştırdığımda şu linkte buldum ki bu arkadaş için otomatik başlamayı mümkün kılan şey, /usr/share/applications klasörü altında yaratılmış olan .desktop uzantılı bir dosyaymış. Bunu da buraya not etmiş olmak istedim.

Başka bir  autostart konumu da /etc/xdg/autostart (dnfdragora-updater buradan çalışıyor).

Şu adreste verildiğine göre tüm otomatik başlangıç konumlarının bir listesi şöyle olabilir:

~/.kde/Autostart
~/.kde/share/autostart
~/.config/autostart
~/.local/share/autostart
/etc/xdg/autostart
/usr/share/autostart

22.10.2019

Yeni WSUS sunucuya bağlanı sorunu

Mevcut WSUS sunucumuzu kaldırıp yerine yeni bir WSUS sunucu kurduk. Windows Workstation bilgisayarımda RSAT yüklüydü. Ama WSUS Administration Console'u açınca hata verip çıkıyordu. Sebebi eski WSUS sunucuyu bulamaması, yeni WSUS sunucunun da adını bilmemesi. Acaba benim bilgisayarımdaki WSUS MMC snap-in'ini nasıl sıfırlayabilirim diye düşünürken şu adreste verilen çözüm işime yaradı.
%appdata%\Microsoft\MMC
klasörünün altındaki wsus dosyasını silip Administration Console'u yeniden başlatınca bana tekrar yeni sunucunun adını sordu, girdim ve herşey normale döndü.

Windows komut satırı işleri

Linux'taki chown komutunun Windows'daki eşdeğeri takeown.exe. Bu araç ile komut satırından bir dosya veya klasörün, alt klasör ve dosyalarıyla birlikte sahipliğini alabiliriz. Örnek kullanım:
takeown /F <hedef> /r /d e
Burada:
/F <hedef> ile sahipliği alınacak dosya veya klasör olmalı.
/r hedefin bir klasör olması durumunda recursive olarak alt öğelerin de sahipliğinin alınması için
/d bir alt klasörde listeleme izni olmaması durumunda devam etmek için Y (veya Türkçe sistemlerde E), bu işlemi atlamak için N (veya Türkçe sistemlerde H)
Burada büyük küçük harf hassasiyeti yok, H ve h aynı.

Bir klasörü altındaki tüm öğelerle silmek için
del /f /q /s <hedef>

Buradaki
/f ile salt okunur dosyaları silmeye zorla
/q ile sessiz çalış, her silme işlemi için onay isteme!
/s altklasörleri de (subfolders) sil

Bir başka yöntem

 rmdir /s /q <hedef>

2023-09-13 Ek: Nokta ile biten bir dosyayı normal yöntemlerle silmek mümkün olmayabiliyor. Örneğin 

D:\Klasor\dosya1. 

gibi bir dosyamız varsa silmek için şu yol önerilmiş:

del "\\?\D:\Klasor\dosya1."

17.10.2019

Word'de Regular Expression ile bul ve değiştir

Varsayalım ki bir belgemiz var ve bu belgenin içinde tarihler 2019-10-17 şeklinde yazılmış. Biz bu belge içinde geçen bütün bu tarihleri 17.10.2019 şekline dönüştürmek istiyoruz. Bunlar çok sayıda olduğu için elle yapmadan, otomatik olarak yapmak istiyoruz. Bunun için Ctrl+H ile Word'ün bul ve değiştir diyaloğunu açmalı, özel karakterler (Use Wildcards) işaret kutusunu (checkbox) işaretlemeliyiz.

Bulunacak kelime kutusuna şu şekilde bir giriş yapmalıyız:
[0-9]{4}\-[0-9]{2}\-[0-9]{2}
Burada kırmızı ile yazılan ilk bölüm, 4 haneli bir sayıyı (yıl), mavi ve yeşil ile yazılan ikinci ve üçüncü bölümler de iki haneli sayıları (sırasıyla ay ve gün) bulmak için. Amacımız ayın gününü başa, yılı sona getirmek olduğu için bulunan bu tarih alanlarını bölümlere ayırmamız gerek. Bu amaçla parantezleri kullanacağız. Her parantez içi, 1'den başlayarak artan sayılarla ilişkilendirilecek. Bunun sonucunda aşağıdaki gibi ilk bulunan 4 haneli yılı gösteren sayı 1 sayısıyla, ikinci bulunan iki haneli ayı gösteren sayı 2 sayısıyla, ve sondaki ayın gününü gösteren iki haneli sayı da 3 sayısıyla ilişkilendirildi.
([0-9]{4})\-([0-9]{2})\-([0-9]{2})
 --------    --------    --------
     \1         \2          \3
Ve nihayetinde değiştirme kutusuna da şunları yazmamız gerekecek:

\3.\2.\1
Bu şekilde 3. sırada bulunan ayın gününü ilk başa, ayı ortaya ve 1. sırada bulunan yılı en sona yazıp, bunları noktalarla ayırmayı seçmiş oluyoruz.

8.10.2019

Powershell komut satırını özelleştirme

Her kabuk (shell) penceresinde olduğu gibi Powershell'de de uzunca satır çıktı üreten komutlar sonrasında komutların yazıldığı satırlar ile çıktılar birbirine karışabilir. Bunu önlemenin basit bir yolu komut satırlarını renklendirmek olabilir. Örnek olarak bu çalışmanın yapılmadığı bir Powershell penceresinde çıktı şu şekilde olur:


Ve uygun düzenlemeler sonrasında şu şekilde:


Satır genişliğindeki değişme, bu düzenlemeler sonucunda değil, bu kısmı göz ardı edelim. Odaklanmamız gereken Get-ChildItem ile başlayan satırdaki renklenme. Bunu sağlamak için öncelikle profile.ps1 dosya şu şekilde bir prompt fonksiyonu ekledim:

function Prompt
{
    $promptString = "PS " + (Get-Date -Format t) + " " + $(Get-Location) + ">"
    Write-Host $promptString -NoNewline -ForegroundColor Cyan
    return " "

}

Bunun sonucunda PS kısaltmasından hemen sonra saat ve dakikayı içeren saat bilgisi, ve dosya sistemindeki mevcut konumumu gösteren klasör yolunu renkli olarak aldım. Profile.ps1 dosyasının konumu da Belgelerim klasörümün içinde WindowsPowershell klasörünün içinde olmalıdır. Belgelerim klasörümün konumunu öğrenmek için
PS> [environment]::getfolderpath("mydocuments")
yazabilirim.

Burada yaptığım bir renklendirme de Windows 10 ile varsayılan olarak yüklü gelen PSGallery modülü PSReadLine'ı yüklemek oldu. Bunun sonucunda cmdlet'ler ile parametrelerim farklı renkli görünmeye başladı. Ayrıca kapatılmamış bir tırnak veya parantez varsa prompt'un sonundaki '>' işaretinin de rengi kırmızıya dönüşüyor. Görsel olmayan bir büyük fark da klavye kısayollarının gelmesi. cmd.exe'de var olmayan son kelimeyi silme kısayolu olarak Ctrl+Backspace varsayılan ataması geliyor. Değiştirmek için
Set-PSReadLineKeyHandler -Chord Ctrl+w -Function BackwardDeleteWord
gibi atamalar kullanılabilir.

PSReadline modülünün bir güzelliği de pencereler kapatılsa bile silinmeyen bir komut geçmişine (history)  sahip olması. Bu komut geçmişini
Get-PSReadlineOption

cmdlet'inin çıktısındaki HistorySavePath değişkeninde bulabiliriz. İlginç olan yukarı ve aşağı ok tuşlarıyla komut geçmişinde gezinmek mümkün, ama Get-History ile bu geçmişi göremiyoruz. Eğer Get-History / Invoke-History gibi komutları kullanmayı tercih ediyorsak PSReadlineHistory modülünü yükleyerek bu iki komutun eşdeğeri olan Get-PSReadlineHistory / Invoke-PSReadlineHistory gibi komutlara sahip olabiliriz. İleride bizi bekleyen bir sorun; komut geçmişinin binlerce satırdan oluşması. Bu durumda shell penceresinin açılışı çok uzun sürebilir. Bu durumlar için geliştirilen cmdlet Optimize-PSReadlinehistory. Komut geçmişinin boyutu sınırlandırılabilir, belli bir karakterden uzun olmayan komutlar silinebilir, ya da tekrarlayan komutlardan kurtulunabilir. Komut geçmişi de 

%appdata%\Microsoft\Windows\Poweshell\PSReadLine\ConsoleHost_history.txt 

dosyasında saklanır, doğrudan müdahale etmek istenirse.

BONUS: Açılan pencerenin yönetici olarak açılıp açılmadığını başlık çubuğunda yazan Administrator kelimesinden anlayabiliriz. Ama ayrıca komut satırında da bununla ilgili bir belirteç görmek istersek bu ayrımı yapabilmek için şu yöntem kullanılabilir:

if ((whoami /all | select-string S-1-16-12288) -ne $null
{
     Write-Host "#" -ForegroundColor White -BackgroundColor DarkGreen -NoNewline
}
else
{
    Write-Host ">" -ForegroundColor Green -NoNewline
}
Bu şekilde yönetici ayrıcalıklarıyla açılan pencerenin komut satırında koyu yeşil fon üzerine beyaz bir # işareti, normal kullanıcı yetkileriyle açılanda ise yeşil bir > işareti görüntülenebilir.

Şu sayfadaki
if ((New-Object Security.Principal.WindowsPrincipal(
[Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator))
{
  Write-Output "Elevated."
}
else
{
  Write-Output "Not elevated."
}

örneği gibi başka alternatifler de var. Kırmızı ile yazılan if satırı bölünmeden tek satır olmalı, ya da uygun bir bölme yöntemi ile bölünebilir.

Ek 2020-07-29: Windows 8.1 üzerinde sorun yaşamadım ama aynı yapılandırma ile Windows 10 üzerinde ufak bir sorunum vardı. PSReadLine ile gelen ve komut satırında eksik bir tırnak veya parantez olması durumunda ">" işaretini kırmızı yapan özellik çalışmıyordu. Sonradan anladım ki bunu sağlamak için Prompt fonksiyonunun içine

Set-PSReadLineOption -PromptText "> "

eklenmeli.

2021-12-27 ek: Windows Terminal ve özel karakterler (glyph) desteği olan bir font, örneğin Cascaydia Nerd Font gibi, bir font yüklü olduğunu varsayarak aşağıdaki gibi bir Prompt fonksiyonu fena olmuyor.

function Prompt
{
    $clockGlyph = [char]0x23F0
    $hourglassGlyph = [char]0x23F3
    $winlogo = [char]0xE70F
    
    Write-Host "$clockGlyph"(Get-Date -Format "(dd, dddd) HH:mm") " " -ForegroundColor Red -BackgroundColor White -NoNewline
    if ((Get-History).Length -gt 0)
    {
        $LastExecutionTime = "{0:N0}" -f ((Get-History)[-1].EndExecutionTime - (Get-History)[-1].StartExecutionTime).TotalMilliSeconds
    }
    else
    {
        $LastExecutionTime = "0"
    }
    Write-Host "$hourglassGlyph $LastExecutionTime ms " -ForegroundColor Red -BackgroundColor Yellow -NoNewLine
    Write-Host (Get-Location) -ForegroundColor Cyan
    Set-PSReadLineOption -PromptText "$winlogo > "
    Write-Host "$winlogo >" -NoNewline
    # if required to diplay path in the title bar:
    # $host.ui.rawui.WindowTitle = (Get-Location)
    return " "
}
 

2023-05-18 ek: Tebdil-i terminalde ferahlık vardır;

oh-my-posh kullanmayan bir terminal yapmak istedim. İki satırlık bir prompt, uzun komutlarda ekrana sığması açısından faydalı oluyor. Solda bulunduğumuz klasörün tam yolunu yazan, sağda ise batarya durumumuzla tarih ve saati yazan, ikinci satırda ise bir önceki işlemin ne kadar sürdüğünü (ekran görüntüsünde 10ms'den az olduğu için gözükmemiş), eğer yükseltilmiş yetkilerle açılmış bir terminal penceresi ise bir pacman canavarı ile bunu belirten ve sonrasında prompt karakterlerini gösteren bir prompt fonksiyonunu şu şekilde özelleştirdim:

function Prompt
{
    $prompt_path = Get-Location
    $prompt_right = Get-Date -Format " dd, ddd | HH:mm "
    $winlogo = [char]0xE70F
    $prompt_char = [char]0x276f
    $elevated = [char]0xF79F

    $battery = gcim Win32_Battery
    $BatteryGlyph = ""

    if ($battery.Status -ne "OK") { $BatteryGlyph = [char]0xf12a }

    if ($battery.BatteryStatus -eq 1) { $BatteryGlyph += [char]0xf063 }
    elseif ($battery.BatteryStatus -eq 2) { $BatteryGlyph += [char]0xf062 }

    if ($battery.EstimatedChargeRemaining -ge 80) { $bcolor = "green"}
    elseif ($battery.EstimatedChargeRemaining -ge 50) { $bcolor = "cyan"}
    elseif ($battery.EstimatedChargeRemaining -gt 30) { $bcolor = "blue"}
    else { $bcolor = "red"}
    $prompt_battery = "[$BatteryGlyph $($battery.EstimatedChargeRemaining)] "

    # leftmost: Path
    Write-Host $prompt_path -ForegroundColor Cyan -NoNewline
    $current_Y = [Console]::CursorTop
    $console_width = [Console]::BufferWidth
    [Console]::SetCursorPosition($console_width-($prompt_battery.Length + $prompt_right.length + 1),$current_Y)

    # Rightmost: Battery + date&time
    Write-Host $prompt_battery -ForegroundColor $bcolor -NoNewline
    Write-Host $prompt_right -ForegroundColor Gray -BackgroundColor DarkMagenta

    if ((Get-History).Length -gt 0)
    {
        $LastExecutionTime = [long]((Get-History)[-1].EndExecutionTime - (Get-History)[-1].StartExecutionTime).TotalMilliSeconds
    }
    else
    {
        $LastExecutionTime = "0"
    }

    if ($LastExecutionTime -gt 3600000) {
        $LastExecutionTime = $LastExecutionTime/3600000
        $Duration = "{0:n1}" -f $LastExecutionTime
        $Duration = "($Duration hour) "
    }
    elseif ($LastExecutionTime -gt 60000) {
        $LastExecutionTime = $LastExecutionTime/60000
        $Duration = "{0:n1}" -f $LastExecutionTime
        $Duration = "($Duration min) "
    }
    elseif ($LastExecutionTime -gt 2000)
    {
        $LastExecutionTime = $LastExecutionTime/1000
        $Duration = "{0:n1}" -f $LastExecutionTime
        $Duration = "($Duration sec) "
    }
    elseif ($LastExecutionTime -gt 10) {
        $Duration = "($LastExecutionTime ms) "
    }
    else { $Duration ="" }
   
    # second line: elevation + duration + prompt
    if ((New-Object Security.Principal.WindowsPrincipal(
        [Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(
        [Security.Principal.WindowsBuiltInRole]::Administrator))
        {
            Write-Host "$elevated " -ForegroundColor White -BackgroundColor Red -NoNewline
            Write-Host "$Duration" -ForegroundColor Magenta -NoNewline
            Write-Host "$winlogo $prompt_char" -ForegroundColor White -NoNewline
        }
    else {
        Write-Host "$Duration" -ForegroundColor Magenta -NoNewline
        Write-Host "$winlogo $prompt_char" -ForegroundColor White -NoNewline
    }

    Set-PSReadLineOption -PromptText "$winlogo $prompt_char "

    # if required to diplay path in the title bar:
    $host.ui.rawui.WindowTitle = (Get-Location)
    return " "
}


---
https://docs.microsoft.com/en-us/powershell/module/psreadline/?view=powershell-6

16.09.2019

Linux komut satırından kullanıcı yönetimi

Yeni kullanıcı oluşturmak için:
# useradd  <username>
Bu şekilde /etc/passwd dosyasına aşağıdaki gibi bir satır eklenir:

username:x:user-id:group-id:userinfo:homedirectory:shell

Her ne kadar dosyanın adı passwd olsa da parolalar x ile gösterilir. useradd komutu varsayılan olarak etkinleştirilmemiş bir kullanıcı yaratır. Etkinleştirmek için kullanıcı parolası değiştirimelidir:
# passwd <username>
Daha fazla veri ile kullanıcı yaratmak için
# useradd -m # home klasörünü yarat
          -d /data/projects # home klasörünün konumunu
          -c "Tam Adı" # kullanıcının tam adı
          -e 2019-10-01 # hesap son kullanma tarihi, ya da -f 45 ile kaç gün kullanılabileceği
          -G webadmin,powerusers # kullanıcının üye olacağı grupları
          -g developers # birincil üye olacağı grup

          <username> kullanıcı adı
Yaratılan hesabın kullanıcı ve grup ID'lerini görmek için
# id
uid=1015(username) gid=1039(developers),...
Aynı amaçla kullanılabilecek, bu bilgileri anahtarlarla değil, sorulara verilecek yanıtlarla girebileceğimiz benzer bir komut daha var:
#  adduser <username>

Ya da birden fazla kullanıcıyı bir dosyadan bakarak yaratmak için
# newusers kullanicilar
kullanicilar dosyasının içinde şunun gibi satırlar olmalı:

ahmet:HcZ600a9:1008:1000:Ahmet Özhan:/home/ahmet:/bin/bash


Var olan bir kullanıcı hesabını silmek için
# userdel <username>
Bu komut ile kullanılabilecek bazı anahtarlar:

-r: home klasörünü de sil
-f: sahibinin <username> olmadığı da silmeye zorla
-Z: tüm SELinux bağlantılarını kaldır

Silme öncesinde kullanıcının sahibi olduğu dosyaları aramak için
# find /mnt/shared -user <username> -print
Hatta bulunan dosyaların sahibini değiştirmek için
# find /mnt/shared -user <username> -exec chown mehmet:mehmet {} \;
userdel komutuna alternatif de deluser var:
# deluser <username> -force # silmeye zorla
-remove-home # home klasörünü de sil
-remove-all-files # tüm dosyalarını sil
-backup-to /backup/2018 # silmeden önce yedeğini /backup/2018'e al
Bir grup yaratmak için
# groupadd muhendislik
Bu komut da /etc/groups dosyasına aşağıdaki gibi bir satır ekler

muhendislik:x:1009:

Bir kullanıcıyı bu grubun üyesi yapmak için
# usermod -aG muhendislik ahmet
ya da (kullanıcı ve grup isimlerinin yer değiştirdiğine dikkat!)
# gpasswd -a ahmet muhendislik
Grubu silmek için
# groupdel muhendislik
Kullanıcımızın üyesi olduğu tüm grupların listesini almak için
$ groups
Kullanıcıyı grup üyeliğinden çıkarmak için
# gpasswd -d ahmet muhendislik
Kullanıcıyı grubun yöneticisi yapmak için
# gpasswd -A ahmet muhendislik

2023-07-17 Ek: Linux'ta bir kullanıcının admin yetkilerine sahip olması, sudo veya wheel gruplarına üye olması ile mümkün olur. Debian ve türevlerinde sudo grubu üyeliği, Fedora ve CentOS ailesinde ise wheel grubu ile. Ahmet adlı bir kullanıcıyı admin yapmak için örneğin Fedora'da

    # usermod -aG wheel ahmet 

ya da Debian tüvevlerinde bir kullanıcının admin olup olmadığını sorgulamak için 

    # id ahmet

komutunun çıktısında sudo grubunun varlığını kontrol etmek gerek.

 

Linux komut satırı araçları

uptime
Bilgisayar ne kadar süredir açık görmek için. Yanında ek bilgiler de var.
$ uptime
16:07:00 up 50 min1 userload average: 0,05, 0,02, 0,00
Burada mavi ile verilen ilk bölüm mevcut yerel saati gösteriyor. Kırmızı ile verilen ikinci bölüm ne kadar süredir açık olduğunu, sonraki yeşil bölüm kaç kullanıcının oturum açtığını, en son turuncu bölüm ise son 1, 5 ve 10 dakikalık zaman dilimindeki iş yükü ortalamasını gösteriyor, yüzdesel olarak.

Üçüncü bölümde yeşil olarak verilen şu anda oturum açmış kullanıcıların kimler olduğunu görmek için kullanılabilecek birkaç komut var. İlki en basit şekliyle kaç kullanıcının ne zaman oturum açtığını gösteren who:
$ who
usern    tty1         2019-09-08 21:43 (:0)
Bu komuttan biraz daha fazla bilgi veren w komutu var, bir miktar uptime ile birleştirilmiş who gibi:
$ w
21:59:28 up 16 min,  1 users,  load average: 0,79, 1,00, 0,78
USER     TTY       LOGIN@   IDLE   JCPU   PCPU   WHAT
usern    tty1      21:43    16:18  1:02   0.02s  /bin/bash
Ya da ps komutunu u parameteresiyle kullanabiliriz. Bunun avantajı, eğer oturumunu sonlandırmayı istediğimiz bir kullanıcı varsa bu komut aracılığıyla PID sütunundaki kimlik numarası kullanarak yapabiliriz.
$ ps u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usern      1447  0.0  0.0  10444  4524 pts/2    Ss   21:43   0:00 /bin/bash
Örneğin tek kullanıcımız usern'in oturumunu
$ kill 1447
ile sonlandırabiliriz.

last
Bilgisayar ilk kurulduğu günden beri açılış ve oturum açma işlemlerini listeler.
$ last
usern    tty1         :0               Fri Sep  6 15:18   still logged in
usern    :0                            Fri Sep  6 15:18   still logged in
reboot   system boot  5.2.5-200.fc30.x Fri Sep  6 15:16   still running
usern    tty1         :0               Thu Aug  8 16:16 - 18:03  (01:46)
usern    :0                            Thu Aug  8 16:16 - down   (01:48)
reboot   system boot  5.1.18-300.fc30. Thu Aug  8 16:05 - 18:05  (02:00)
Çok geriye gitmeden son birkaç satırı aldım. İşletim sisteminin açılışı reboot ile başlayan satırlarda belirtiliyor:
reboot   system boot  5.2.5-200.fc30.x Fri Sep  6 15:16   still running
Bu gibi satırlarda 2. sütunda hep system boot yazıyor. 3. sütunda ise yükleme işleminden sorumlu çekirdek sürüm numarası var. Son sütunda ise sistemin açılış tarihi ve saati ile kapanış saati ve parantez içinde de sistemin açık kalma süresi var.

Kullanıcı adıyla (usern) başlayan satırlar kullanıcının şifresini girerek oturum açması ile ilgili olan satırlar.
usern    :0                            Fri Sep  6 15:18   still logged in
Burada tty1 (veya genel olarak tty*) yerel olarak terminal etkileşimini, pts0 (veya pts*) uzaktan ssh gibi yöntemlerle terminal etkileşimini gösterir. Bu satırların sonunda ise kullanıcının oturumu açık olarak kaldığı süre gösterilir.

Sadece sistemin başlatma olaylarını listelemek için
$ last reboot
sadece belli bir kullanıcının oturum açma olaylarını listelemek için de
$ last usern
Kapanma olaylarını ve çalışma seviyesi (runlevel) değişikliklerini görebilmek için -x kullanılır.
$ last -x
kullanılabilir. Belli bir tarihten sonra gerçekleşen olayların listesi için -s anahtarı (since), bir tarihe kadar olan bir olayları görmek için -t (until) veya son 10 sayıda olayı görmek için -n 10 gibi anahtarlar kullanılabilir.
$ last -s 2019-03-01 -t 2019-05-31
$ last -n 10
Belirtilen bir tarihteki olayları görmek için -p (present)
$ last -p 2019-05-19
awk
Çok faydalı bir araç. İsmini geliştiricilerinin soyisimlerinin başharflerinden alıyor. Örneğin last komutu ile 01.05.2019 tarihinden sonra kimler giriş yapmış, kullanıcı adlarını görüntülemek için şöyle bir komut kullanılabilir:
$ last -s 2019-05-01 | awk '{print $1}'
reboot yazılan satırlar sistem açılışları, gerçek kullanıcı değil. Varsayılan olarak boşluk karakterlerini alan ayraçı olarak kullanır. Bunu değiştirmek için -F anahtarı kullanılır. Örneğin /etc/passwd dosyasındaki kullanıcı isimlerini ve tire "-" karakteri ile ayrılan açıklamalarını yazmak için şöyle bir komut kullanılabilir:
$ awk -F: '{print $1 " - " $5}' /etc/passwd
Örnek olarak aşağıdaki gibi notlar.txt dosyamız olsun.

Arda 80
Batu 60
Deniz 40
Caner 30

Bu verilere göre 50 geçer notun üzerinde not alan öğrencilerin geçtiğini açıklamak istiyoruz. Şöyle bir satır işimizi görür:
$ awk '{if ($2>50) print $1 " geçti"}' notlar.txt
Arda geçti
Batu geçti
Bir sonraki aşama, notlar.txt dosyasında her satırda isim ve 2 sınav notu yer alıyor.

Arda 80 60
Batu 60 70
Deniz 40 80
Caner 30 50


Bu 2 notun ortalamasını ekrana yazmak istiyoruz.
$ awk '{
total = 0
for (i=2; i<4; i++)
{ total += $i }
avg = total/(i-2)
print $1 ": " avg
}' notlar.txt
Şöyle bir sonuç verecek:

Arda: 70
Batu: 65
Deniz: 60
Caner: 40


Notlar dosyasında sadece Deniz'in ilk sınav notunu merak ettik diyelim. Bunu yapmanın başka yolları var elbette, ama awk örneği olsun diye böyle yapalım.
$ awk ' /'Deniz'/ {print $2}' notlar.txt
40
Başka bir örnek; adı sayilar.txt ve her satırında 10, 20, 30 ve 40 olan bir metin dosyasındaki tüm sayıların toplamını hesaplamak için
cat sayilar.txt | awk '{toplam+=$1} END {print toplam}' 
Veya kısa bir oran hesaplaması yapmak için
cat sayilar.txt | awk 'BEGIN {adet=0} {toplam+=$1; adet++} END {print toplam " / " adet " = " toplam/adet}'
Daha fazla ayrıntı için [1] ve [2] ye bakılabilir.

sed
Stream EDitor kısaltması. Bu aracın da ilginç kullanım alanları var. Örneğin bir dosyamız olsun, aşağıdaki gibi.

Bu birinci satır
Sonra gelir ikinci
Sondan bir önceki üçüncü
En sonda da dördüncü

Bu dosyanın örneğin 2. satırını silmek istiyoruz
$ sed '2d' ornek.txt
Bu birinci satır
Sondan bir önceki üçüncü
En sonda da dördüncü
Ya da en son satırını
$ sed '$d' ornek.txt
Bu birinci satır
Sonra gelir ikinci
Sondan bir önceki üçüncü
2. ve 4. satırlar arasını da silebiliriz
$ sed '2,4d' ornek.txt
Bu birinci satır
Dosyanın sadece 2. satırını yazdırmak istersek
$ sed -n 2p ornek.txt
Sonra gelir ikinci
Dosyanın içinde "önceki" kelimesini "evvelki" ile değiştirmek için
$ sed 's/önceki/evvelki/' ornek.txt
Bu birinci satır
Sonra gelir ikinci
Sondan bir evvelki üçüncü
En sonda da dördüncü

Eğer son kesmeden sonra bir sayı gelmiyorsa sadece ilk görülen "önceki" kelimesi "evvelki" ile değiştirilir. En son kesme işaretinden sonra bir sayı geliyorsa, örneğin 2, "önceki" kelimesinin sadece 2. tekrarını "evvelki" ile değiştirir. Eğer kesmeden sonra g geliyorsa tüm tekrarlar değiştirilir.

Bir dosyanın içindeki boşluk karakterlerini yeni satır (carriage return) karakteriyle değiştirmek için

$ sed s/" "/\\n/g ornek.txt

Tüm satırların öncesinde satır numaralarını yazmak için '=' kullanılır (ki bunun alternatifi cat -n dir)

$ sed '=' ornek.txt
1
Bu birinci satır
2
Sonra gelir ikinci

3
Sondan bir önceki üçüncü

4
En sonda da dördüncü
İkinci satırın içeriğini tümüyle değiştirmek istersek
$ sed '3c\BURASI ÜÇÜNCÜ SATIR' ornek.txt
Bu birinci satır
Sonra gelir ikinci
BURASI ÜÇÜNCÜ SATIR
En sonda da dördüncü
Birkaç karakteri değiştirmek:
$ sed 'y/ioü/104/' ornek.txt
B1r1nc1 satır
S0nra gel1r 1k1nc1
S0ndan b1r öncek1 4ç4nc4
En s0nda da dörd4nc4

cut

Bu da çok yetenekli bir metin aracı. Aşağıdaki farazi personel.txt dosyası üzerinden birkaç örnek yapalım.
 
personel.txt
Mazhar Alonson 1950 Ankara
Fuat Güner 1948 İstanbul
Özkan Uğur 1953 İstanbul
 
Bu dosyada boşluk karakteriyle ayrılmış bazı alanlar var; isim, soyisim, doğum yılı, doğum yeri.
 
Sadece isim ve doğu yılını almak için
 
$ cut -d " " -f 1,3 personel.txt
Mazhar 1950
Fuat 1948
Özkan 1953
 
Her satırdan sadece ilk 3 karakteri (byte) almak için
 
$ cut -b 1,3 personel.txt
Maz
Fua
Özk 

-b (byte) ve -c (character) komutlarının farkını göremedim. İkisi de belli sayıda karakter veya byte okumak için kullanılıyor. -d "AYRAÇ" ile alan ayracı belirtilebiliyor. Varsayılan ayraç TAB. -f ile ayrılan alanlardan istenilen numaralı olan (indeksleme 1'den başlıyor) seçilebiliyor.

Bazı ls parametreleri
Bulunduğumuz klasördeki sadece klasörleri görüntülemek için

$ ls -ld */

Listelemede önce klasör isimlerini görmek için
$ ls --group-directories-first

Bir klasörde yer alan dosyaları en son değiştirilme tarihine göre listelemek istersek:
$ ls -lt
kullanabiliriz. Bu şekilde en yeniler en üstte yer alır. Sıralamayı tersine çevirmek için -r (reverse) anahtarını eklemek gerek:
$ ls -ltr
Bunu bütün alt klasörler için yapmak istesek -R anahtarını kullanmak gerek (büyük/küçük harf hassasiyetine dikkat!):
$ ls -ltR

Klasördeki dosyaları boyutlarına göre sıralamak için -S (varsayılan olarak büyükten küçüğe) anahtarı kullanılır:

$ ls -lS | head -5

ile mevcut klasördeki en büyük 5 dosyayı görebiliriz. 

Bir sürecin başlama zamanını ve açık kalma süresini görmek için aşağıdaki komut kullanılabilir [8]:

# ps -eo comm,lstart,etime,user | grep firefox

En çok işlemci kullanan 3 uygulamayı görmek için

# ps -e –sort=-pcpu -o pid,pcpu,comm | head -n 4

Aynı şekilde en çok bellek kullanan 3 uygulamayı görmek için

# ps -e –sort=-pmem -o pid,pmem,comm | head -n 4

find

Bir klasör ve alt klasörlerinde son 24 saatte değişen dosyaları ve klasörleri bulabilmek için şu komut kullanılabilir:

$ find /klasor -mtime -1 -ls
Burada -1 son 24 saat içinde değişenler demek. +1 kullansaydık son 24 saatten önce değişenler anlamına gelecekti. Ayrıca şunun gibi "daha insani" yollar da önerilmiş:
$ find /klasor -newermt "-24 hours" -ls
$ find /klasor -newermt "5 days ago" -ls
$ find /klasor -newermt "yesterday" -ls
Daha iyi bir çıktı için:
$ find /klasor -mtime 0 -printf '%T+\t%s\t%p\n' 2>/dev/null | sort -r | more

gibi bir komuttan bahsedilmiş ki burada dosyalar son değiştirilme tarihi ile listelenecek, bu tarihe göre sıralanacak ve sayfalanacak. Sadece dosyaları görmek istersek -type f ile listelenecek öğe tipini dosya (f) olarak kısıtlayabiliriz. Burada -prinf sonrasındaki alanlar şöyle verilmiş:

%T : Dosyanın son değiştirilme tarihi (yerel saatte)

%s : Byte olarak dosya boyutu

%p : Dosya adı

aralardaki \t tab karakteri, \n ise tahmin edilebileceği gibi yeni satır karakteri.

Bir klasör ve alt klasörleri içinde son 6 ay içinde üzerinde değişiklik yapılmamış dosyaları silmek için

find /hedef -type f -mtime +180 -exec rm -f {} \+

Burada
-type f : sadece dosyaları hedef al
-mtime +180: değiştirilme tarihi 180 günden önce (-180 olsaydı 180 günden sonra olurdu)
-exec rm -f {} : bulunan her öğe için rm (remove) komutunu çalıştır, bunu -f ile (force) destekle
\+ : bunları tek bir satırda toplayarak rm -f dosya1 dosya2 ... dosyaN şeklinde çalıştır
\; olsaydı bu her bir exec işlemini ayrı ayrı yap anlamına gelecekti (rm -f dosya1, rm -f dosya2, .... gibi). Burada \ escape karakteri.

Bir klasörün altındaki tüm boş dosyaları bulmak için

    $ find . -type f -empty

Hatta boş klasörler için

    $ find . -type d -empty

Veya 2 KB'tan büyük dosyaları bulmak için

    $ find . -type f -size +2K

Bir kullanıcının sahip olduğu dosyaları aramak için

    $ find . -user metin
 
lsof (list open files)
Açık dosyaları sorgulamak çoğu durumda çok faydalı olabilir. Hiçbir parametre olmaksızın aşağıdaki gibi bir çıktı üretir.
# lsof
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1               root cwd DIR 8,3       4096     2 /
systemd 1               root rtd DIR 8,3       4096     2 /
systemd 1               root txt REG 8,3    1640496 14161 /usr/lib/systemd/systemd


Çıkışta geçen FD dosya tanımlayıcısıdır (file descriptor) ve şu değerleri alabilir:
cwd: şimdi bulunulan klasör (current working directory)
rtd : root'un klasörü, yani /root (root directory)
txt : program metni
mem : memory mapped file
r: bir sayı eşliğinde geçen r okuma (read) kipinde açılmış dosyayı gösterir
w: bir sayı eşliğinde geçen w yazma (write) kipinde açılmış dosyayı gösterir
u: yine bir sayı eşliğinde geçer ve yazma ve okuma modunda açılmış dosyayı gösterir
 
TYPE alanı dosya tipini gösterir şu değerleri alabilir:
REG: normal dosya (regular file)
DIR: klasör (directory)
CHR: karakter tipi cihaz (character special file)
FIFO: ilk giren ilk çıkar tipi yapı (first in first out)

Birkaç örnek üzerinden gidelim.

Belli bir kullanıcı tarafından açılan dosyaların listesini almak için
# lsof -u metin
hatta bu kullanıcının açtığı tüm süreçleri sonlandırmak için
# kill -9 `lsof -t -u metin`
veya belli bir kullanıcıyı hariç tutmak için
# lsof -u^root
Ağ bağlantıları içinde dinleme durumunda (listening) ve kurulmuş (established) bağlantıları görmek için
# lsof -i
TCP 25 portunu kullananlar
# lsof -i TCP:25
Protokol farketmeksizin 53 portunu kullanan uygulamalar için
# lsof -i :53
Sadece IPv4 bağlantıları listelemek için
# lsof -i 4
PID'si 1135 olan süreç tarafından açılan dosyaları görmek için
# lsof -p 1135
/var/log/clamav/freshclam.log dosyasını açan prosesi bulmak için
# lsof /var/log/clamav/freshclam.log
/var/log klasöründeki dosyalarla ilgileniyorsak
# lsof +D /var/log

du (disk usage)
Komut satırında çalışırken bir klasörün alt klasörleri ile birlikte diskte ne kadar yer kapladığını bulmak için bu komut ideal. Örneğin Fedora'nın dnf yerel önbelleğinde tutulan dosyaların boyutunu öğrenmek için

$ sudo du -sh /var/cache/dnf/
kullanabiliriz. Burada

-s : tek satırda tüm alt klasörlerle boyutu yaz
-h : byte cinsinden değil, otomatik olarak hangi ölçekteyse KB, MB veya GB cinsinden yaz.

Faydalı bir anahtarı daha var; örneğin tmp uzantılı dosyalar hariç boyutu görmek istiyorsak --exclude="*.tmp" yazabiliriz. 
Bunun sonucunda görülecek sayı dosya yöneticisi ile bakıldığında görülecek sayı ile bir olmayabilir. Bunun sebebi du'nun dosyanın diskte kapladığı yeri göstermesi, dosya yöneticisinin ise dosyaların toplam boyutlarını göstermesidir (aradaki fark; 300 byte'lık bir dosya diskte asgari bir blocksize yer kaplar ki o da muhtemelen 4KB'dır. Sizinkini görmek için blocksize --getbsz /dev/sdaX). Bu durumda dosya yöneticisinin verilerini doğrulamak için
$ find /var/cache/dnf/ -type f -exec ls -l {} \; | awk '{toplam+=$1} END {print toplam}'
kullanılabilir. Bu byte cinsinden verir. du -h anahtarı ile bunu MB veya duruma göre GB cinsinden gösterebilir.

df
Dosya sistemi kullanım oranlarını gösterir. Hiçbir parametre kullanmadan çalıştırınca tüm dosya sistemlerini listeler. Listelenen dosya sistemi türlerini de ayrı bir sütunda görmek için -T anahtarı kullanılabilir.

$ df -T
Dosyasistemi                            Tür       1K-blok     Dolu      Boş Kull% Bağlanılan yer
devtmpfs                                devtmpfs   469808        0   469808    0% /dev
tmpfs                                   tmpfs      488044        0   488044    0% /dev/shm
tmpfs                                   tmpfs      488044     1284   486760    1% /run
/dev/mapper/fedora_localhost--live-root ext4     37868960 10927560 24988020   31% /
tmpfs                                   tmpfs      488044      164   487880    1% /tmp
/dev/sda1                               ext4       999320   235008   695500   26% /boot
tmpfs                                   tmpfs       97608       36    97572    1% /run/user/1000


Listelenecek dosya sistemlerini dosya sistemi türüne göre sınırlandırmak için -t anahtarı ve sonrasında dosya sistemi tipi kullanılabilir:

$ df -t ext4
Dosyasistemi                             1K-blok     Dolu      Boş Kull% Bağlanılan yer
/dev/mapper/fedora_localhost--live-root 37868960 10927560 24988020   31% /
/dev/sda1                                 999320   235008   695500   26% /boot


Veya tam tersi olarak bir dosya sistemini hariç tutarak listelemek için -x ve sonrasında dosya sistemi tipi kullanılabilir.

$ df -T -x tmpfs
Dosyasistemi                            Tür       1K-blok     Dolu      Boş Kull% Bağlanılan yer
devtmpfs                                devtmpfs   469808        0   469808    0% /dev
/dev/mapper/fedora_localhost--live-root ext4     37868960 10927584 24987996   31% /
/dev/sda1                               ext4       999320   235008   695500   26% /boot


less
Bir komutun çıktısını sayfalayarak göstermeye yarayan more komutuna benzer yapıda çalışıyor. Bu komutla ilgili çok sık yapılan bir espri var: "The less is more, more or less". More'a göre daha işlevsel. Kısayollar şöyle:


Kısayol Tuşu
İşlevi
aşağı ok, enter, e, veya j Bir satır aşağı
yukarı ok, y, veya k Bir satır yukarı
boşluk çubuğu
Bir sayfa aşağı
b Bir sayfa yukarı
sağ ok
Yatay sağa kay
sol ok
Yatay sola kay
g İlk satıra git
G Son satıra git
10g 10. satıra git. Farklı sayıla ile istenen satıra gidilebilir
50p veya 50% Tam ortaya (veya başka bir sayı verilerek istenen yüzdelik noktaya) git
/search terim Şu anki noktadan aşağıya doğru terimi ara
?search terim Şu anki noktadan yukarıya doğru terimi ara
n Arama sırasında bir sonraki bulunan noktaya git
N Arama sırasındaki bir önceki bulunan noktaya git
m<c> m'den sonra herhangi bir karakter girerek şu anki konumu işaretle
'<c> Tek tırnak tuşu ile yukarıdaki gibi işaretlenen noktaya git   
q çıkış yap


---
[1] https://likegeeks.com/awk-command/
[2] https://linuxconfig.org/learning-linux-commands-awk
[3] https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/
[4] https://www.linuxtechi.com/20-sed-command-examples-linux-users/
[5] https://likegeeks.com/sed-linux/
[6] https://www.howtogeek.com/562941/how-to-use-the-awk-command-on-linux/ 
[7] https://www.linuxteck.com/find-command-in-linux-with-examples/
[8] https://www.linuxteck.com/ps-command-in-linux-with-examples/
[9] https://medium.com/techtofreedom/8-uses-of-sed-in-linux-e61678b04114

[10] https://medium.com/@hicransevik/some-text-processing-tools-aaac89e89a16