3 Ekim 2019 Perşembe

hostnamectl komutu

Giriş
Açıklaması şöyle. Yani Ubuntu'da bilgisayarın ismini değiştirmek için kullanıyoruz.
hostnamectl is part of systemd, and provides a proper API for dealing with setting a server's hostnames in a standardized way.

Previously each distro that did not use systemd, had their own methods for doing this which made for a lot of unnecessary complexity.
Hangi Dosyaları Okur
Ubuntu'da hostname'in yazıldığı iki dosya var. Bunlar şöyle.
/etc/hostname
/etc/hosts
/etc/hosts dosyası yazısına bakabilirsiniz.

Bu komuta benzer hostname komutu yazısına bakabilirsiniz.

Seçeneksiz Kullanım
hostname status seçeneği ile kullanım ile aynıdır.

set-hostname seçeneği
Şöyle yaparız.
hostnamectl set-hostname whatever
status seçeneği
Örnek
Şöyle yaparız.
hostnamectl             # equivalent to hostnamectl status
Örnek
Bu komut çıktısısında bir sürü bilgiyi birleştirip veriyor. Görmek için şöyle yaparız.
$ hostnamectl status
   Static hostname: mint
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
           Boot ID: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  Operating System: Linux Mint LMDE
            Kernel: Linux 3.16.0-6-amd64
Örnek
Bu komut çıktısısında bir sürü bilgiyi birleştirip veriyor. Görmek için şöyle yaparız.
$ hostnamectl
   Static hostname: centos7
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 1ec1e304541e429e8876ba9b8942a14a
           Boot ID: 37c39a452464482da8d261f0ee46dfa5
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-693.21.1.el7.x86_64
      Architecture: x86-64
Örnek
Sadece bize gereken hostname bilgisini görmek için şöyle yaparız.
sudo hostnamectl | grep hostname

uniq komutu

Giriş
Not : Eğer amacımızı tekil değerleri bulup sıralamaksa, direkt sort komutu da kullanılabilir. Şöyle yaparız
$ printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort --unique

bar
foo
lol

Girdinin Sıralı Olmasını Bekler
Açıklaması şöyle
Filter adjacent matching lines from INPUT (or standard input), writing to OUTPUT (or standard output).
Örnek - sıralı olmayan veri
Elimizde şöyle bir kod olsun
printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | uniq --unique
Çıktı olarak şunu alırız. Tekil değerleri vermez, çünkü girdi sıralı değildir.
foo
bar
foo
lol
foo
Doğru çıktı için şöyle yaparız
printf "lol\nlol\nfoo\n\n\n\n\nbar\nlol\nlol\nfoo\nlol\nfoo" | sort | uniq
Çıktı olarak şunu alırız
bar
foo
lol
Karşılaştırma Algortiması
Açıklaması şöyle. Yani bu komut aslında string karşılaştırması yapar.
Note that some uniq implementations like GNU uniq will give you the first of a sequence of lines that sort the same (where strcoll() returns 0) as opposed to are byte-to-byte identical (where memcmp() or strcmp() returns 0). To force a byte to byte comparison regardless of the uniq implementation, you can force the locale to C with:
Byte karşılaştırması için şöyle yaparız.
LC_ALL=C uniq your-file
Eğer hiçbir seçenek kullanmazsak tekil olmayan satır bulursa ilk bulduğunu çıktı olarak verir. Açıklaması şöyle
 With no options, matching lines are merged to the first occurrence.
-c seçeneği
count anlamına gelir. Satırın başına o satırın kaç kere bulunduğunu yazar. Elimizde şöyle bir dosya olsun
bird
bird
dog
rabbit
dog
cat
rabbit
dog
bird
cat
bird
bird
Şöyle yaparız.
uniq -c <(sort animal.txt) | awk '{print $2,$1}' 
Çıktı olarak şunu alırız.
bird 5
cat 2
dog 3
rabbit 2
-d seçeneği - Sadece birden fazla olan satırı çıktı verir
duplicate anlamına gelir. İki veya daha fazla olan satırları çıktı olarak verir. Şöyle yaparız.
sort input.txt | uniq -d
-u seçeneği - Sadece tekil olan satırı çıktı verir, duplicate olanları da eler
Bu seçenek zaten varsayılan davranış olduğu için aslında komuta eklemeye gerek yoktur. GNU uniq komutunda -u seçeneği yerine --unique olarak kullanılır.

Örnek
Elimizde şöyle bir dosya olsun
$ cat file
1
2
3
3
4
4
Eğer seçeneksiz kullanırsak çıktı olarak şunu alırız
$ uniq file
1
2
3
4
Eğer -u seçeneği ile kullanırsak çıktı olarak şunu alırız. Burada 3 ve 4 tekil olmadıkları için çıktıya dahil edilmezler.
$ uniq -u file
1
2


bash kodlama - $RANDOM Değişkeni

Örnek
Şöyle yaparız.
[ "$RANDOM" -lt 3277 ] && do_stuff

openssl req aracı

Giriş
Üç tane temel amacı var.
1. Certificate Signing Requests (CSR) Üretmek içindir
2. Self Signed Certificate Üretmek içindir

1 Ekim 2019 Salı

LANG Ortam Değişkeni - Temel Yerelleştirme Değişkenidir

Giriş
LANG ortamı değişkeninin açıklaması şöyle.
the "LANG" environment variable determines the language in which software programs communicate with the user.
Benim sistemimde LANG'ın değeri şu
tr_TR.UTF-8
Localization Değişkenlerinin Öncelik Sırası
Localization değerlerini değiştirmek için bir sürü değişken var. Bunların öncelik sırası şöyle
1. LANG_ALL - Her şeyi ezer
2. LC_XYZ değişkenleri - Eğer varsa bu değişkenler kullanılır
3. LANG - En düşük sıradaki değişken budur.
Örnek
Elimizde şöyle bir kod olsun. Burada LC_NUMERIC değişkeni LANG'dan önce gelir. Bu yüzden printf Almanca'da ayraç olarak virgül kullanıldığı için 3.14 değerini algılayamaz ve hata verir.
$ export LC_NUMERIC="de_DE.UTF-8"
$ export LANG=C
$ printf "%.2f\n" 3.14
-bash: printf: 3.14: invalid number
3,00
Ancak kodu şöyle değiştirelim. Bu durumda LC_ALL her şey ezecek ve yerelleştirmeyi C yapacaktır. Böylece printf çalışır.
$ export LC_NUMERIC="de_DE.UTF-8"
$ export LC_ALL=C
$ printf "%.2f\n" 3.14
3.14
C
Şöyle yaparız.
LANG=C 
en_US (Amerikan İngilizcesi)
Şöyle yaparız.
LANG=en_US
en_IE (İrlanda İngilizcesi)
Şöyle yaparız.
>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png

>LANG=C ls -1 foo* 
foo.png
foopa.png
fooqa.png
Diğer

1. LANG Dışında Bazı Özel Ayarlar Yapmak
LANG değişkeninden memnunuz diyelim ancak örneğin zamanı kendi bölgemizin ayarından daha farklı bir şekilde görmek istiyoruz. Bu durumda LC_XYZ ortam değişkenlerini kullanmak gerekir.

Örnek
Açıklaması şöyle.
For example, I use LANG=en_US.utf8 on my Linux box, but I override LC_TIME=en_GB.utf8 to get 24-hour time in English. This would not be possible to do if LC_ALL were set.
2. Java
Elimizde şöyle bir kod olsun.
import java.io.File;

public class Test {
  public static void main(String[] args) {
    File f = new File("\u2026");
    f.toPath();
  }
}
LANG'ı C yaparsak exception fırlatır.
$ LANG=C java Test
Exception in thread "main" java.nio.file.InvalidPathException: Malformed input...
    at sun.nio.fs.UnixPath.encode(UnixPath.java:147)
    at sun.nio.fs.UnixPath.<init>(UnixPath.java:71)
    at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:281)
    at java.io.File.toPath(File.java:2234)
    at Test.main(Test.java:6)
LANG'ı  en_US.UTF-8 yaparsak çalışır
$ LANG=en_US.UTF-8 java Test
# No crash!





modprobe komutu

Giriş
modprobe komutu insmod komutu gibi modül eklemek için kullanılır. Farklı olarak modülün tüm bağımlı olduğu modülleri de otomatik ekler.

/etc/modprobe.d/blacklist.conf Dosyası
Bir modülü kalıcı olarak etkizileştirmek istiyorsak bu dosyaya ekleriz.

/etc/modprobe.d/snd-blacklist.conf Dosyası
Bazı modüller kendi dosyalarını kullanırlar.

Örnek
Alsa ile sesi etkinsizleştirmek için şöyle yaparız
blacklist soundcore
blacklist snd
blacklist snd_pcm
blacklist snd_hda_codec_hdmi
blacklist snd_hda_codec_realtek
blacklist snd_hda_codec_generic
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core
blacklist snd_hwdep
blacklist snd_timer

Yüklemek İçin
Örnek
Şöyle yaparız.
$ sudo modprobe ath10k_pci
Eğer hata olursa şuna benzer bir çıktı alırız.
modprobe: ERROR: could not insert 'ath10k_pci': Required key not available
Örnek
Modüle paramete geçmek için şöyle yaparız.
# add 2 virtual video devices
modprobe v4l2loopback devices=2 exclusive_caps=1,1
-r seçeneği
Oturum boyunca bir modülü etkisizleştirir. Şöyle yaparız.
modprobe -r uvcvideo

24 Eylül 2019 Salı

Linux Loader

Giriş
Bazı notlarım şöyle

1. Loader Nedir?
Açıklaması şöyle.
The shell invokes the loader function, which copies the code and data in the executable file a.out into memory, and then transfers control to the beginning of the program. The loader is a program called execve, which loads the code and data of the executable object file into memory and then runs the program by jumping to the first instruction.
2. Loader Tarafından Kullanılan Path
Loader'ın yükleyeceği path'ler şurada dizinde tanımlı ve sıraları önemli.
/etc/ld.so.conf.d/
Bu dosyalarda değişiklik yaparsak şu komutu çalıştırmak gerekli.
ldconfig
3. Loader Nerede?
Loader şudur.
/lib64/ld-linux-x86-64.so.2
Örnek
Şöyle yaparız
$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked
Örnek
ld-linux.so.2 aslında bir loader. Centos 6'da uygulamadan çıkmak yeterli değil. Bir sebepten ld-linux.so.2 loader'ını da kill etmek gerekir.

Örnek
Loader ile bir uygulama çalıştırmak için şöyle yaparız.
# /lib64/ld-linux-x86-64.so.2 ./chmod
chmod: missing operand
4. loader ve malloc
loader libc.so dosyasını yüklemeden kendi içindeki malloc metodunu kullanır. Açıklaması şöyle.
Technically the dynamic linker doesn’t need object resolution and relocation for itself, since it’s fully resolved as-is, but it does define symbols and it has to take care of those when resolving the binary it’s “interpreting”, and those symbols are updated to point to their implementations in the loaded libraries. In particular, this affects malloc — the linker has a minimal version built-in, with the corresponding symbol, but that’s replaced by the C library’s version once it’s loaded and relocated (or even by an interposed version if there is one), with some care taken to ensure this doesn’t happen at a point where it might break the linker.
Örnek
Bir projede Centos 7 ile derlenmiş binary dosyayı Centos 6 üzerinde çalıştırmak gerekti.
Nasıl yapacağımı buradan okudum.

Şöyle yaptık.

1. ldd komutu ile binary dosyanın bağımlı olduğu tüm .so dosyalarını buldum. Bağımlılıklar arasında ld-linux.so.2 dosyası da vardı.
2. Bu dosyaları ve binary dosyayı Centos 6'da açtığım bir dizine kopyaladım.
3. env PRE_LOAD= ... ld-linux.so myprogram şeklinde çalıştırdım