27 Kasım 2019 Çarşamba

execve metodu

Giriş
Şu satırı dahil ederiz.
#include <unistd.h>
İmzası şöyle. pathname parametresi null terminates string olmalı
int execve(const char *pathname, char *const argv[], char *const envp[]);
Bu çağrının ismini "execv with environment" olarak düşünmek lazım. execve ile execv çok benziyorlar. Aralarındaki en önemli fark execve çağrısının en son parametre olarak "ortam değişkenlerinin" tanımlanmasına izin vermesi. Bu parametreyi null geçersek aralarında bir fark kalmıyor.

Örnek
Şöyle yaparız.
int main (int argc, char** argv) {

  int count = atoi(argv[1]);
  char buf[20];
  sprintf(buf, "%d", count);

  char* newargv[3];
  newargv[0] = argv[0] //veya başka bir uygulama yol + adı;
  newargv[1] = buf;    //parametreler
  newargv[2] = NULL;   //environment

  execve(argv[0], newargv, NULL);
  ...
}

26 Kasım 2019 Salı

bash kodlama - gömülü metodlar veya komutlar

Giriş
built-in commands için Kısıtlı bir liste şöyle.
.               continue        getopts         readonly        type
:               echo            hash            return          ulimit
[               eval            jobs            set             umask
alias           exec            kill            shift           unalias
bg              exit            local           test            unset
break           export          printf          times           wait
cd              false           pwd             trap
command         fg              read            true
Bir komutun gömülü metod olup olmadığını anlamak için şöyle yaparız.
bash-4.3$ type :
: is a shell builtin
veya şöyle yaparız.
$ command -V true false
true is a shell builtin
false is a shell builtin
alias built-in komutu
alias built-in komutu yazısına taşıdım.

. built-in komutu
Type komutu ile kontrol edersek şu çıktıyı alırız.
. is a shell builtin
: built-in komutu
: (No Effect) built-in komutu yazısına taşıdım

command built-in komutu
command built-in komutu yazısına taşıdım

echo built-in komutu
echo built-in komutu yazısına taşıdım.

exec built-in komutu
exec built-in komutu yazısına taşıdım.

exit built-in komutu
exit built-in komutu yazısına taşıdım.

false built-in komutu
true ve false built-in komutları yazısına taşıdım.

local built-in komutu
değişkenin scope'unu metod yapar. Bu komutu kullanırken her zaman "declare and assign separately" kuralına dikkat etmek gerekir.
Örnek
Şu kod yanlış.
function my_fun() {
  ocal output=$(ls no_file_here_buddy)
  cho $?  # returns 0

  on_local_var=$(ls no_file_here_buddy)
  echo $? # returns 2
}
Açıklaması şöyle.
The exit status of the command is overridden by the exit status of the creation of the local variable.
Şöyle yaparız.
local output
output=$(ls no_file_here_buddy)
echo $?
Örnek
Şöyle yaparız.
foo(){
  local name
  name="$1"
  echo "$name"
}
Eğer global olsun istersek şöyle yaparız.
#!/bin/bash
name="$1"
echo "$name"
printf komutu
printf built-in komutu yazısına taşıdım.

read built-in komutu
read built-in komutu yazısına taşıdım.

shift built-in komutu
shift built-in komutu yazısına taşıdım.

set built-in komutu
set built-in komutu yazısına taşıdım.

trap built-in komutu
trap built-in komutu yazısına taşıdım.

true built-in komutu
true ve false built-in komutları yazısına taşıdım.

unset built-in komutu
Örnek
Şöyle yaparız.
unset myvariable    # unset so that it doesn't inherit a value from the environment
wait built-in komutu
Çalıştırılan komutların bitmesini bekler. Açıklaması şöyle.
f ID is not given, waits for all currently active child processes, and the return status is zero.
Örnek
Şöyle yaparız. Bu örnekte çalıştırılan perl komutuna üst sınır konulmuyor. Kaç tane txt dosyası varsa o kadar perl çalıştırılıyor.
for f in file*.txt; do
    perl dataProcessing.pl "$f" &
done
# wait for them to complete
wait
echo "All done."
-n seçeneği
Açıklaması şöyle. Bu seçenek yerine sanırım wait "$!" seçeneği de kullanılabilir.
If the -n option is supplied, waits for the next job to terminate and returns its exit status.
Örnek
Şöyle yaparız.
$ bash -exc '(sleep 1; exit 1) & wait -n; echo $?:done'
+ wait -n




25 Kasım 2019 Pazartesi

cat komutu

Giriş
Açıklaması şöyle. Belirtilen dosyadan veya stdin'den okuyabilir.
SYNOPSIS
       cat [OPTION]... [FILE]...

DESCRIPTION
       Concatenate FILE(s) to standard output.

       With no FILE, or when FILE is -, read standard input.
Örnek - redirect
Şöyle yaparız. Burada shel dosyayı açar, dosyanın file decriptor'ı cat komutunun stdin decriptor'ı ile değiştirilir. 
cat < file.txt

/dev/disk Özel Dizini

Giriş
Açıklaması şöyle. /dev/sda her seferinde farklı bir isim alır. Bundan kaçınmak için /dev/disk/by-label/ altındaki isimler kullanılır.
While the /dev/sd* and /dev/hd* device files represent the traditional way to refer to drives and partitions, there is a significant disadvantage of in using these values by themselves. The Linux kernel decides which device gets which name on each boot, so this can lead to confusing scenarios where your devices change device nodes.

To work around this issue, the /dev/disk directory contains subdirectories corresponding with different, more persistent ways to identify disks and partitions on the system. These contain symbolic links that are created at boot back to the correct /dev/[sh]da* files. The links are named according to the directory’s identifying trait (for example, by partition label in for the /dev/disk/by-partlabel directory). These links will always point to the correct devices, so they can be used as static identifiers for storage spaces.

Some or all of the following subdirectories may exist under /dev/disk:

by-label: Most filesystems have a labeling mechanism that allows the assignment of arbitrary user-specified names for a disk or partition. This directory consists of links that named after these user-supplied labels.

by-uuid: UUIDs, or universally unique identifiers, are a long, unique string of letters and numbers that can be used as an ID for a storage resource. These are generally not very human-readable, but are pretty much guaranteed to be unique, even across systems. As such, it might be a good idea to use UUIDs to reference storage that may migrate between systems, since naming collisions are less likely.

by-partlabel and by-partuuid: GPT tables offer their own set of labels and UUIDs, which can also be used for identification. This functions in much the same way as the previous two directories, but uses GPT-specific identifiers.

by-id: This directory contains links generated by the hardware’s own serial numbers and the hardware they are attached to. This is not entirely persistent, because the way that the device is connected to the system may change its by-id name.

by-path: Like by-id, this directory relies on the storage devices connection to the system itself. The links here are constructed using the system’s interpretation of the hardware used to access the device. This has the same drawbacks as by-id as connecting a device to a different port can alter this value.
Örnek
Tüm diskleri silmek için şöyle yaparız.
cat /dev/zero > /dev/disk
cat /dev/urandom > /dev/disk

17 Kasım 2019 Pazar

14 Kasım 2019 Perşembe

/etc/shadow Dosyası

Giriş
Eskiden şifreler /etc/passwd dosyası içinde saklanırdı. 1990'lardan itibaren şifreler /etc/shadow dosyasında hash'lenerek saklanmaya başladılar. Açıklaması şöyle.
Password shadowing first appeared in Unix systems with the development of SunOS in the mid-1980s,[10] System V Release 3.2 in 1988 and BSD4.3 Reno in 1990. 
Bir başka açıklama şöyle.
Originally the password hash was in the publicly-readable file /etc/passwd. Putting the hash in a separate file /etc/shadow that only the system (and the system administrator) was one of the many innovations to come from Sun, dating from around SunOS 4 in the mid-1980s. It spread out gradually to other Unix variants (partly via the third party shadow suite whose descendent is still used on Linux today) and wasn't available everywhere until the mid-1990s or so.
Gerekçe olarak ta passwd dosyasının okunabilir olmasının gerekmesi gösteriliyor. Okunabilir olunca şifreler kırılmaya daha açık hale geliyordu.

Permission
Bu dosyaya haklar 000 olmalı. Açıklaması şöyle.
The idea behind setting /etc/shadow permissions to 000 is to protect that file from being accessed by daemons, even when running as root, by ensuring that access is controlled by the DAC_OVERRIDE capability.
Açıklaması şöyle.
000 only grants access to processes with the DAC_OVERRIDE capability.
Format
shadow dosyasının formatı şöyle. type = 1 ise MD5 hash kullanıldığını belirtir.
$ type $ salt $ hash
Şifre Sütunu
Örnek - * Olması
Şöyle olsun
sys:*:19101:0:99999:7:::
Açıklaması şöyle
That * is where the password hash would be if the user had a password. But * is an invalid password hash, no password will produce it, so there is no password the user could log in with.

Note that if the password hash field was empty, it might allow login without entering a password.


10 Kasım 2019 Pazar

/dev/zero Özel Dosyası

Giriş
Açıklaması şöyle.
/dev/zero discards writes like /dev/null but reads as zero instead of EOF.

timedatectl komutu - Sistem saatini ayarlamak ve görmek için kullanılır

Giriş
Sistem saatini ayarlamak için kullanılır. Şöyle yaparız.
# timedatectl
      Local time: Tue 2018-04-17 20:21:29 IST
  Universal time: Tue 2018-04-17 14:51:29 UTC
        RTC time: Tue 2018-04-17 14:51:29
       Time zone: Asia/Kolkata (IST, +0530)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
list-timezones seçeneği
Şöyle yaparız.
$ timedatectl list-timezones
UTC
set-timezone seçeneği
Şöyle yaparız.
$ timedatectl set-timezone Etc/UTC
status seçeneği
Örnek
Şuna benzer bir çıktı alırız. NTP servisi çalışmıyor gösteriyor.
$ sudo timedatectl status
               Local time: Wed 2020-08-05 15:31:34 EDT
           Universal time: Wed 2020-08-05 19:31:34 UTC
                 RTC time: Wed 2020-08-05 19:31:34
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no
Örnek
Şuna benzer bir çıktı alırız. NTP servisi çalışmıyor gösteriyor.
$ timedatectl status
      Local time: Mon 2016-09-19 06:41:46 PDT
  Universal time: Mon 2016-09-19 13:41:46 UTC
        Timezone: America/Los_Angeles (PDT, -0700)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  Sun 2016-03-13 01:59:59 PST
                  Sun 2016-03-13 03:00:00 PDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2016-11-06 01:59:59 PDT
                  Sun 2016-11-06 01:00:00 PST