320 likes | 445 Views
System Programming. Chapter 6. Administration Misc. The mid-term will be held on April 26, 2006 in class. It will cover Chapters 1 to 6. MP2 is due on April 28, 2006 (Friday). Fun Stuff. SuperCilia Skin (e.g., glass blowing in the wind, tactile interface) Fuzzmail (http://www.fuzzmail.org/)
E N D
System Programming Chapter 6
Administration Misc. • The mid-term will be held on April 26, 2006 in class. It will cover Chapters 1 to 6. • MP2 is due on April 28, 2006 (Friday).
Fun Stuff • SuperCilia Skin (e.g., glass blowing in the wind, tactile interface) • Fuzzmail (http://www.fuzzmail.org/) • Pendland’s social network • You are in control?
Simple Chapter! • What is system data files? • Commonly used “system files” by programs • What are they? • Where are they? • How to access them (data structure)? • Password file / Shadow passwords file • Group file (Primacy group vs. supplementary groups)
What/where are they? • User identification • Password & shadow passwords • Group file (Primacy group vs. supplementary groups) • System identification • Networks, services, protocols, OS, etc. • Time information
Where? /etc/passwd /etc/group /etc/passwd – local machine or NIS DB User database in POSIX.1 <pwd.h> Login-name, encrypted passwd, numeric user-ID, numeric group ID, comment, home dir, shell program linux1:~> cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh User IdentificationPassword file
/etc/passwd (continue) Superuser root – UID = 0 Command finger linux1:~> finger hchu Login: hchu Name: Directory: /home/professor/hchu Shell: /bin/tcsh On since Sun Apr 16 15:21 (CST) on pts/25 from 61-229-102-75.dynamic.hinet.net Mail last read Sun Dec 11 17:38 2005 (CST) No Plan. User IdentificationPassword file
#include <sys/types.h> #include <pwd.h> structpasswd *getpwuid(uid_t uid); get password by uid structpasswd *getpwnam(const char *name); getpwuid() used by Command ls getpwnam() used by the login program Both use a static variable for returning POSIX.1 structpasswd *getpwent(void); void setpwent(void); void endpwent(void); No order in the returned pwd entries. setpwent()/endpwent rewind/close these files. Non-POSIX.1 but XSI extension User Identificationaccess password file
User Identificationaccess password file? struct passwd { char *pw_name; /* user name */ char *pw_passwd; /* encrypted password */ uid_t pw_uid; /* user uid */ gid_t pw_gid; /* user gid */ time_t pw_change; /* password change time */ char *pw_class; /* user access class */ char *pw_gecos; /* Honeywell login info */ char *pw_dir; /* home directory */ char *pw_shell; /* default shell */ time_t pw_expire; /* account expiration */ int pw_fields; /* internal: fields filled in */ };
Figure 6.2 #include <pwd.h> #include <stddef.h> #include <string.h> struct passwd * getpwnam(const char *name) { struct passwd *ptr; setpwent(); while ((ptr = getpwent()) != NULL) if (strcmp(name, ptr->pw_name) == 0) break; /* found a match */ endpwent(); return(ptr); /* ptr is NULL if no match found */ }
User IdentificationShadow Passwords • /etc/shadow – shadow passwd file • /etc/passwd • root:x:0:1:Super-User:/root:/bin/tcsh • with “x” indicated for passwd • Store encrypted password in the shadow file • Username, passwd, passwd aging • Not readable by the world • Readable by set-user-ID login/passwd programs • Why? avoid a brute force approach in trying to guess passwds
Cryptography 101 (MD5) • Basically a hash function producing 128 bits value • User enters a plaintext password K (after login: prompt) • System applies a hash function MD5 to generate crypotext C • E.g., MD5(“quickbrownfox") = 9e107d9d372bb6826bd81d3542a419d6 • System matches C to encrypted password on /etc/shadow • Very computationally expensive (infeasible) to get K from MD5 & C
User Identificationaccess shadow file #include <shadow.h> structspwd *getspnam(const char *name); structspwd *getspent(void); void setspent(void); void endspent(void); • No order in the returned pwd entries. • setspent()/endspent rewind/close these files. • Non-POSIX.1 but XSI extension
User Identificationaccess shadow passwords struct spwd { char *sp_namp; /* Login name */ char *sp_pwdp; /* Encrypted password */ long sp_lstchg; /* Date of last change */ long sp_min; /* Min #days between changes */ long sp_max; /* Max #days between changes */ long sp_warn; /* #days before pwd expires to warn user to change it */ long sp_inact; /* #days after pwd expires until account is disabled */ long sp_expire; /* #days since 1970-01-01 until account is disabled */ unsigned long sp_flag; /* Reserved */ };
/etc/group – the group database nuucp::9:root,nuucp Figure 6.2 – Page 149 gr_passwd not in POSIX.1 (in SVR4 & 4.3+BSD) #include <sys/types.h> #include <grp.h> structgroup *getgrgid(gid_t gid); structgroup *getgrnam(const char *name); A static variable for returned values. structgroup *getgrent(void); void setgrent(void); void endgrent(void); setgrent() open (if not) and rewind the group file. endgrent() close the group file. User Identificationgroup file
Supplementary Group IDs • Introduction of supplementary group ID’s – 4.2BSD • newgrp is the way to change gid since Version 7 • They all can be used to check for file access permissions • Optional in POSIX.1, NGROUP_MAX (16 in common)
Supplementary Group IDs #include <sys/types.h> #include <unistd.h> intgetgroups(int gidsetsize, gid_t grouplist[]); • Up to gidsetsize elements stored in grouplist[] • Special case: gidsetsize = 0 only number is returned. int setgroups(int ngroups, const gid_t grouplist[]); int initgroups(const char *usrname, gid_t basegid); • Only superusers can call setgroups() and initgroups() • Called by the login program
Other System Data Files and Info • BSD Networking Software • /etc/services – getservbyname, getservbyport • /etc/protocols – getprotobyname, getprotobynumber • /etc/networks – getnetbyname, getnetbyaddr • /etc/hosts – gethostbyname, gethostbyaddr • General Principle to the Interfaces • A get function to read the next record • A set function to rewind the file • An end function to close the file • Keyed lookup functions if needed. • Figure 6.3 – Page 153 • Routines for System File Access
linux1:~> cat /etc/hosts 127.0.0.1 localhost.localdomain localhost 140.112.30.32 linux1.csie.ntu.edu.tw linux1 linux1:~> more /etc/networks localnet 140.112.28.0 linux1:~> more /etc/protocols ip 0 IP # internet protocol, pseudo protocol number #hopopt 0 HOPOPT # IPv6 Hop-by-Hop Option [RFC1883] icmp 1 ICMP # internet control message protocol igmp 2 IGMP # Internet Group Management tcp 6 TCP # transmission control protocol pup 12 PUP # PARC universal packet protocol udp 17 UDP # user datagram protocol linux1:~> more /etc/services tcpmux 1/tcp # TCP port service multiplexer echo 7/tcp echo 7/udp systat 11/tcp users daytime 13/tcp daytime 13/udp
Login Accountingutmp • Track all current logins • /etc/utmp: • /var/adm/utmp in SVR4 • /var/run/utmp in 4.3+BSD and Linux • Updated by the login program, erased by init • tty is a Unixcommand that prints to standard output the name of the file connected to standard input. struct utmp { char ut_line[8]; // tty line char ut_name[8]; // login name long ut_time; // seconds since epoch }
who cmd reads from utmp linux1:~> who b93043 pts/1 2006-04-07 13:39 (council:S.0) r89033 pts/4 2006-04-15 02:31 (bsd5.csie.ntu.edu.tw) b89013 pts/10 2006-04-07 14:51 (218-174-143-212:S.0) b89013 pts/11 2006-04-07 14:51 (218-174-143-212:S.1) b89013 pts/5 2006-04-07 16:13 (218-174-143-212:S.2)
Login Accountingwtmp • Track all logins and logouts • /etc/wtmp: • var/adm/wtmp in SVR4 • /var/log/wtmp in 4.3+BSD and Linux • Updated by the login and init programs, reboot linux1:~> last | grep hchu hchu pts/43 61-229-102-75.dy Sun Apr 16 17:43 still logged in hchu pts/25 61-229-102-75.dy Sun Apr 16 15:21 - 17:43 (02:21) hchu pts/32 140.112.29.47 Sat Apr 15 20:57 - 21:15 (00:17) hchu pts/28 140.112.29.47 Tue Apr 11 20:17 - 04:02 (07:45) hchu pts/28 140.112.29.47 Tue Apr 11 20:11 - 20:16 (00:04)
System Identification #include <sys/utsname.h> intuname(struct utsname *name); struct utsname { char sysname[9] /* name of OS */ char nodename[9]; /* name of the node */ char release[9]; /* current release of the OS */ char version[9]; /* current ver of the release */ char machine[9]; /* name of the HW type */ } • sysconf() linux1:~> uname -a Linux linux12.6.16-1-686-smp #1 SMP Mon Apr 3 13:02:49 UTC 2006 i686 GNU/Linux
#include <sys/utsname.h> intgethostname(char *name, int namelen); • Name of the host on a TCP/IP network – BSD systems • MAXHOSTNAMELEN in <sys/param.h> linux1:~> hostname linux1 linux1:~> hostname -d csie.ntu.edu.tw linux1:~> hostname -i 140.112.30.32
System Identification • Commands: hostname, sethostname (/etc/rc), uname • $ uname –a SunOS ntucsa 5.6 Generic_105181-26 sun4u sparc sun4u • Nodename is not good to reference on a network. • Most versions of System V has this info compiled into the kernel when the kernel is built.
Time and Date Routines • Time Values • Calendar time • In seconds since the Epoch (00:00:00 January 1, 1970, Coordinated Universal Time, i.e., UTC) • type time_t • Remark: Times in Unix • Keeping time in UTC • Automatic handling of conversions, such as daylight saving time • Keeping of time and date as a single quantity.
Time and Date Routines • Time Values (continued) • Process time • In clock ticks (divided by CLK_TCK -> secs) • type clock_t • Clock time, user/system CPU time > time grep _POSIX_SOURCE */*.h > /dev/null 0.25u 0.25s 0:03.51 14.2%
Calendar Time #include <time.h> time_ttime(time_t *calptr); • As a func in BSD, call gettimeofday (1us) • Time initialization: settimeofday (BSD, 1us), stime (SVR4) (broken-down time) string struct tm formatted string asctime strftime localtime gmtime mktime ctime (calendar time) time_t time kernel Affected by env var TZ
Calendar Time to GMT/Local #include <time.h> struct tm *gmtime(const time_t *calptr); struct tm *localtime(const time_t *calptr); struct tm { /* borken-down time */ int tm_sec; /* [0, 61], >= 59 for leap seconds*/ int tm_min; /* [0, 59] */ int tm_hour; /* [0, 23] */ int tm_mday; /* [1, 31] */ int tm_mon; /* [0, 11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday: [0, 6] */ int tm_yday; /* days since January 1: [0, 365] */ int tm_isdst; /* daylight saving time flag: > 0, 0, < 0 (not available) */ }; • localtime() local time, gmtime() UTC time
More calendar time conversion functions time_t mktime(struct tm*tmptr) // convert tm to time_t char *asctime(const struct tm *tmptr); char *ctime(const time_t *calptr); size_t strftime(char *buf, size_t maxsize, const char *format, const struct tm *tmptr); $ date Sun Apr 16 18:39:21 2006 // char format in asctime & ctime • strftime produces formatted string, like printf (see conversion specifiers in Figure 6.9 )
Process time • Higher resolution (microseconds) #include <sys/time.h> int gettimeofday(struct timeval * restrict tp, void *restrict tzp); struct timeval { time_t tv_sec; long tv_usec; }