如果出现 telnet: Unable to connect to remote host: Connection refused,则在 /etc/inetd.conf 增加一句
xxx #: STANDARD: These are standard services. telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd xxx系统至少得安装有 telnet 以及 telnetd netstat -a | grep telnet netstat -pant | grep 23,能看到 23号端口被使用了。
典型的unix系统可能存在许多服务器,它们只是等待客户请求的到达,如 FTP、Telnet、Rlogin、TFTP 等。最开始,所有的这些服务都与一个进程相关联,这些进程在系统启动时开始运行,而且执行几乎相同的启动任务:创建一个套接口,把本服务的众所周知的端口捆绑到该套接口,等待一个连接(TCP)或是一个数据报(UDP),然后派生子进程。子进程为客户提供服务,父进程则等待下一个客户请求。这个模型存在两个问题:
所有这些守护进程含有几乎相同的启动代码(套接口的创建以及成为守护进程)。每个守护进程在进程表中占据一项,并且大部分时间处于睡眠状态inetd 超级服务器使上述的问题得到简化:
通过 inetd 处理普通进程的大部分细节以简化守护程序的编写。单个进程(inetd)就能为多个服务等待外来的客户请求,以此取代每个服务一个进程的做法,减少了系统中的进程数。 在启动阶段,读入/etc/inetd.conf文件并给该文件中指定的每个服务创建一个适当类型的套接口。 为每个套接口调用bind,指定捆绑相应服务器的众所周知端口和通配IP地址。 对于每个TCP套接口,调用 listen 以接受外来的连接请求。对于数据报套接口则不执行本步骤。 创建完毕所有套接口后,调用select等待其中任何一个套接口变为可读。 当select返回指出某个套接口已可读之后,如果该套接口是一个TCP套接口,而且其服务器的wait-flag值为nowait, 那就调用accept接受这个新连接。 inetd守护进程调用fork派生进程,并由子进程处理服务请求。 如果第5步中select返回的是一个字节流套接口,那么父进程必须关闭接受了的已连接套接口, 父进程再次调用select,等待下一个变为可读的套接口。inetd.conf 是/usr/sbin/inetd的初始化文件,告诉/usr/sbin/inetd所需要监听的 inet 服务及有关信息。
每行有七个单元,对于socket类的服务各单元依次是: <服务名称> <协议(tcp或udp)> <标志(wait或 nowait)> <属主> <真实服务程序全路径> <真实服务程序名称及参数
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
表示 /usr/sbin/inetd 监视 ftp 服务(端口21),为此服务创建的socket为流类型的,遵从 tcp协议,当ftp客户请求到来并且与 /usr/sbin/inetd 监视的ftp服务端口连接成功后, /usr/sbin/inetd 就fork一个子进程,该子进程的主人被置为root,同时继承了一个父进程与客户方连接成功而生成的子socket,然后该子进程将该子socket复制(dup2调用) 为文件号0,1, 2(标准输入输出标准出错)并且发 execl("/usr/sbin/in.ftpd", "in.ftpd") 使 in.ftpd 接管标准输入输出的处理,也就是接管父进程连接成功生成的子socket, 父进程不会等待子进程的退出(exit)状态,即 nowait。
https://blog.csdn.net/u012103747/article/details/45338571 ↩︎