12. Exam from basic topics

12.1. Parsowanie /etc/passwd

  • Filename: exam-foundations.py
  • Lines of code to write: 60 lines
  • Estimated time of completion: 60 min
  1. Poniższe listingi prezentują zawartość plików:

  2. Skopuj ich zawartość każdego z tych plików na dysk (uwaga: komentarze i puste mają również być skopiowane)

  3. Sparsuj plik i przedstaw go w formacie List[dict]

  4. Zwróć listę użytkowników, których UID jest większy niż 1000

  5. W ramach dicta połącz dane, tak aby uzyskać wynik:

    [
        {
            'username': 'jimenez',
            'uid': 1001,
            'gid': 1001,
            'home': '/home/jimenez',
            'shell': '/bin/bash',
            'algorithm': 'SHA-512',
            'password': 'P9zn0KwR...k4kijuhE50',
            'groups': ['staff', 'sysadmin'],
            'last_changed': datetime.date(2015, 7, 16),
            'locked': False,
        },
        ...
    ]
    
The whys and wherefores:
 
  • czytanie i parsowanie pliku
  • łączenie danych z różnych plików w jeden format wynikowy
  • nieregularne pliki konfiguracyjne (struktura może się zmieniać)
  • filtrowanie elementów
  • korzystanie z pętli i instrukcji warunkowych
  • parsowanie stringów
  • praca ze ścieżkami w systemie operacyjnym
  • różna reprezentacja danych (podmienianie wartości)
Code Listing 12.1. Przykładowa zawartość pliku /etc/passwd
##
# ``/etc/passwd`` structure:
#   - Username
#   - Password: ``x`` indicates that shadow passwords are used
#   - UID: User ID number
#   - GID: User's group ID number
#   - GECOS: Full name of the user
#   - Home directory
#   - Login shell
##

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nobody:x:99:99:Nobody:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
watney:x:1000:1000:Max Peck:/home/peck:/bin/bash
jimenez:x:1001:1001:Jose Jimenez:/home/jimenez:/bin/bash
ivanovic:x:1002:1002:Ivan Ivanovic:/home/ivanovic:/bin/bash
Code Listing 12.2. Przykładowa zawartość pliku /etc/shadow
##
# ``/etc/shadow`` structure
#   - Username: from ``/etc/passwd``
#   - Password
#   - Last Password Change: Days since 1970-01-01
#   - Minimum days between password changes: 0 - changed at any time
#   - Password validity: Days after which password must be changed, 99999 - many, many years
#   - Warning threshold: (Days to warn user of an expiring password, 7 - full week
#   - Account inactive: Days after password expires and account is disabled
#   - Time since account is disabled: Days since 1970-01-01 that an account has been disabled
#   - A reserved field for possible future use
#
# Password field (split by ``$``):
#   - algorithm
#   - salt
#   - password hash
#
# Password algorithms:
#   - ``$1$`` - MD5
#   - ``$2a$`` - Blowfish
#   - ``$2y$`` - Blowfish
#   - ``$5$`` - SHA-256
#   - ``$6$`` - SHA-512
#
# Password special chars:
#   - `` `` (blank entry) password is not required to log in
#   - ``*`` (asterisk) - account is disabled, no password has ever been set
#   - ``!`` (exclamation mark) - account is locked, no password has ever been set
#   - ``!<password_hash>`` - password is locked, but password is set
#   - ``!!`` (two exclamation marks) - account has been created, waiting for initial password to be set by admin
##

root:$6$Ke02nYgo.9v0SF4p$hjztYvo/M4buqO4oBX8KZTftjCn6fE4cV5o/I95QPekeQpITwFTRbDUBYBLIUx2mhorQoj9bLN8v.w6btE9xy1:16431:0:99999:7:::
adm:$6$5H0QpwprRiJQR19Y$bXGOh7dIfOWpUb/Tuqr7yQVCqL3UkrJns9.7msfvMg4ZO/PsFC5Tbt32PXAw9qRFEBs1254aLimFeNM8YsYOv.:16431:0:99999:7:::
watney:!!:16550::::::
jimenez:$6$P9zn0KwR$tgfvvFWJJ5FKmoXiP5rXWOjwoEBOEoAuBi3EphRbJqqjWYvhEM2wa67L9XgQ7W591FxUNklkDIQsk4kijuhE50:16632:0:99999:7:::
ivanovic:$1$.QKDPc5E$SWlkjRWexrXYgc98F.:12825:0:90:5:30:13096:
Code Listing 12.3. Przykładowa zawartość pliku /etc/group
##
# ``/etc/group`` structure
#   - Group Name: from ``/etc/passwd``
#   - Group Password: ``x`` indicates that shadow passwords are used)
#   - GID: Group ID
#   - Members: usernames from ``/etc/passwd``
##

root::0:root
other::1:
bin::2:root,bin,daemon
sys::3:root,bin,sys,adm
adm::4:root,adm,daemon
mail::6:root
staff::10:jimenez,watney,ivanovic
daemon::12:root,daemon
sysadmin::14:jimenez,ivanovic
nobody::60001:
noaccess::60002:
nogroup::65534: