inetd este un super-server daemon pe multe sisteme UNIX. A apărut pentru prima dată în 4.3BSD și se află de regulă în /usr/sbin/inetd
.
Numit adeseori super-server, inetd monitorizează conexiunile pe un număr de porturi TCP sau UDP des folosite pentru servicii internet precum FTP, POP3, sau telnet. Când sistemul de operare primește un pachet TCP sau UDP pe un anumit port, inetd pornește programul server corespunzător. Pentru serviciile care nu sunt așteptate să genereze trafic prea mare, această metodă de pornire utilizează memoria calculatorului într-un mod mai eficient, întrucât serviciul respectiv este rulat numai dacă este necesar. Mai mult, aplicațiile server nu au nevoie să includă cod de networking, inetd face redirectarea socketului către stdin, stdout și stderr. Pentru protocoale care rulează un trafic de date mare, cum ar fi HTTP și POP3, un server dedicat ar fi mai eficient.
Fișierul /etc/services
este folosit pentru maparea numărului portului, numele protocolului și numelor serviciilor, în timp ce fișierul /etc/inetd.conf
specifică ce program este rulat pentru fiecare serviciu în parte. De exemplu, pentru o conexiune TCP/telnet /etc/services
are o intrare
telnet 23/tcp
Linia corespunzătoare în /etc/inetd.conf
este
telnet stream tcp6 nowait root /usr/sbin/telnetd telnetd -a
Aceasta îi spune lui inetd să pornească programul /usr/sbin/telnetd
cu argumentele telnetd -a
. inetd redirecționează automat socketul către stdin, stdout și stderr.
În general, un nou proces este pornit pentru fiecare conexiune TCP. Pentru UDP se preferă folosirea aceluiași proces pentru toate pachetele primite de un port dat.
Unele servicii simple precum echo sunt implementate direct de inetd, fără a porni un proces separat.
Acesta este un simplu serviciu scris în limbajul de programare C. Programul acceptă un argument pe linia de comandă, acest argument este un fișier în care sunt scrise toate datele care vin pe socket.
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { const char *fn = argv[1]; FILE *fp = fopen(fn, "a+"); if(fp == NULL) exit(EXIT_FAILURE); char str[4096]; //inetd passes its information to us in stdin. while(fgets(str, sizeof(str), stdin)) { fputs(str, fp); fflush(fp); } fclose(fp); return 0; }
Programul este compilat sub numele errorLogger. Presupunem că pachetele de date vin pe portul UDP 9999. În /etc/services
trebuie să adăugăm
errorLogger 9999/udp
iar în /etc/inetd.conf
errorLogger dgram udp wait root /usr/local/bin/errlogd errlogd /tmp/logfile.txt
Notă: exemplul de mai sus nu are nicio legătură cu funcționalitatea de logging sub UNIX, care este în general implementată de syslog. Acesta rulează în paralel cu inetd și nu este un serviciu inetd.
Datorită limitărilor de securitate în designul original, inetd este adeseori înlocuit de xinetd, rlinetd, ucspi-tcp și multe altele. Distribuțiile Linux și Mac OS X folosesc implicit xinetd (inetd este de asemenea disponibil).
Unix (mai multe) | Programe în linia de comandă pentru|||
Management de fișiere: | cat | cd | chmod | chown | chgrp | cksum | cmp | cp | du | df | file | fsck | ln | ls | lsof | mkdir | mount | mv | pwd | rm | rmdir | split | touch | ||
Management de procese: | at | chroot | cron | exit | kill | killall | nice | pgrep | pidof | pkill | ps | pstree | sleep | time | top | wait | ||
Management utilizator/mediu: | env | finger | id | mesg | passwd | su | sudo | uname | uptime | w | wall | who | whoami | write | ||
Procesare text: | awk | comm | cut | ed | ex | fmt | head | iconv | join | less | more | paste | sed | sort | tac | tail | tr | uniq | wc | xargs | ||
Programare Shell: | basename | echo | expr | false | printf | test | true | unset | Imprimare: lp | |
Communicații: inetd | netstat | ping | rlogin | traceroute |
Căutare: find | grep | strings |
Diverse: banner | bc | cal | dd | man | size | yes |