有些时候,我们希望在生成路由器密码后仍能够使用OpenWRT提供的Telnet服务。但是OpenWRT默认将会在用户修改密码后终止Telnet服务,本文将会指导你如何在编译固件时永久保留Telnet服务并追加Telnet的登录验证。
软件平台:OpenWRT 14.07
硬件平台:Atheros ar71xx ar9331
1.使OpenWRT编译login程序
相信谁都不希望别人可以轻易得到我们路由器的终端控制权,因此有必要在Telnet的接入阶段提供用户登入的功能。然而OpenWRT默认不会为Telnet编译login这个程序(Linux下提供系统用户登录的程序),那么为了让Telnet能够借用login来验证用户的密码,我们就需要让OpenWRT将login这个程序编译到系统中。
首先,我们在编译目录键入命令
make menuconfig
来进入OpenWRT编译配置界面。随后请进入Base system,然后找到busybox,然后按下回车,之后你会看到一个Busybox的组件设置菜单,请在Login/Password Management Utilities上按下回车,然后选中这些选项:
-login
-Run logged in session in a child process
-Support for PAM (Pluggable Authentication Modules)
-Support for login scripts
-Support for /etc/nologin
-Support for /etc/securetty
2.修改OpenWRT源代码,使Telnet总是启动
默认OpenWRT在用户设置密码后就会禁用Telnet,从系统第二次启动开始用户就会发现自己无法启用Telnet服务,原因就在于Telnet的启动脚本: /etc/init.d/telnet,我们可以在OpenWRT的源代码的package/utils/busybox/files文件夹中找到这个启动脚本。
这个文件中,start_service()区段即为启动服务的函数,可以看到在其中包含有if…then…fi的判断函数,它的作用是判断系统中root用户不存在密码,满足这个条件才会启动telnet。很明显,若要使telnet服务一直可用,需要移除这个判断,最简单的方法是将if区段中的判断部分注释掉,如下图所示:
3.使telnet启用登录验证
现在我们有了用来验证的login,有了无论如何都能够启动telnet的启动脚本。接下来就是让telnet来调用login从而实现验证了。
那么经过如上修改后,OpenWRT的Telnet就可以在任意时刻登录了吗? 答案是否定的,如果你修改了密码,那么登录后就只能看到一行Login failed。telnet默认在登录时会执行 /bin/login.sh 这个脚本(我们可以在OpenWRT的源代码的package/base-files/files/bin中找到这个脚本),但是这个脚本中有这么一段:
在这个脚本的上方有个if判断由于验证系统是否存在密码,如果存在密码,就会在输出一行Login failed.后退出并断开连接。因此,我们需要修改这个判断区段中检测到密码后的行为,修改为下图所示:
如果你已经完成上述3处的修改,现在你就可以编译永久提供telnet的OpenWRT ROM了。最终效果如下:
本文终
转自: