之前一直好奇,telnet和linux系统等,登录功能到底是哪个模块负责的。
比如,对于telnet连接,是telnet负责吗,还是telnet启动的shell进程负责。
启动一个telnet服务进程:
# telnetd
然后在另外一个主机登录,弹出登录提示:
Xrouter login:
此时在telnet服务设备执行pstree:
# pstree
init-+-boa
|-endpointd
|-led
|-logd
|-netd-+-dhcp6c
| |-dnsmasq
| |-2*[hostapd]
| `-udhcpc
|-ntpd
|-sh---pstree
|-telnetd---login
`-ubusd
可以看到telnetd启动了一个login进程。这样就知道了login命令。
login命令是util-linux的一个工具,用来登录一个系统,用户输入用户名和密码,校验ok后,login命令,将执行一个shell替换自己。
login不带参数的时候,由登陆者输入用户名,login也可以带一个username参数,则用户只需要输入这个用户的密码,来登录特定账户。
由此可知,telnetd在收到telnet请求后,创建login子进程,处理登录任务。
# telnetd --help
BusyBox v1.33.2 multi-call binary.
Usage: telnetd [OPTIONS]
Handle incoming telnet connections
-l LOGIN Exec LOGIN on connect
-f ISSUE_FILE Display ISSUE_FILE instead of /etc/issue
-K Close connection as soon as login exits
(normally wait until all programs close slave pty)
-p PORT Port to listen on
-b ADDR[:PORT] Address to bind to
-F Run in foreground
-i Inetd mode
-w SEC Inetd 'wait' mode, linger time SEC
-S Log to syslog (implied by -i or without -F and -w)
也可以使用-l选项,来指定特定的登录进程,指定sh,可以直接跳过登录。
参考:
https://github.com/util-linux/util-linux/blob/master/login-utils/login.c
https://man7.org/linux/man-pages/man1/login.1.html