目标:实现登录系统需要账户、密码验证功能
DATE: 2011-9-17
启用密码验证功能,注意配置busybox的时候执行如下步骤:
1、busybox配置
Login/Password Management Utilities-->
Support for shadow passwords等,最好全选上。
这样,登陆的时候会需要3个文件:
group,password,shadow
为了满足终端登录用户验证的要求,etc目录下还需要有passwd、group和shadow (在编译busybox时如果不选择shadow功能将不需要这个文件)。这些文件至少要包含 root用户的定义,三个文件都很简短,具体如下所示:
passwd文件内容:
root:x:0:0:root:/root:/bin/sh
group文件内容:
root:x:0:
shadow文件内容:
root::12179:0:99999:7::: #本条命令表示登录需要用户名root,但是不需要密码。
其中,如果shadow (对于不支持shadow的系统则是passwd )文件的第一个冒号和第二个冒号之间没有内容,表示这个用户登录不需要密码。如果需要设定密码或者增加新的登录用户,就可以参考开发主机上的相应文件,或者在目标系统启动之后用passwd命令和adduser命令完成。
在BusyBox源码中,通过make menuconfig,选中dev/pts file system for Unix98 PTYs
退出后执行:
make
make install
2、Linux 内核配置
在linux kernal的代码源目录下执行:
make menuconfig
在Character devices中选中Unix98 PTY support,退出后执行:
make zImage
通过以上步骤我并没有实现登录需要账户、密码的功能,后来通过以下步骤在串口登录时终于成功了,但是,telnet登录是否成功还没尝试。
$passwd root #重设root密码
在rcS文件中加入
/bin/login
内容如下:
[root@LinChao:init.d]#cat rcS
/bin/mount -n -t proc /proc proc
/bin/mount -n -o remount,rw /
/bin/mount -av
/bin/hostname LinChao
mkdir /dev/pts
/bin/mount -t tmpfs mdev /dev
/bin/mount -t devpts devpts /dev/pts
mknod -m 666 /dev/ptmx c 5 2
echo /sbin/mdev>/proc/sys/kernel/hotplug
/sbin/mdev -s
/bin/hwclock -s
ifconfig eth0 192.168.0.10 netmask 255.255.255.0
telnetd -l /bin/sh
/sbin/insmod /tiandao/driver/gpio_driver.ko
/sbin/insmod /tiandao/driver/lcd_driver.ko
/sbin/insmod /tiandao/driver/ir_driver.ko
/sbin/insmod /tiandao/driver/adc_driver.ko
/bin/login
保证登录时启动login程序。
我的各配置文件如下:
[root@LinChao:/etc]#ls
fstab group init.d inittab passwd profile shadow
通过以上步骤,通过串口登录时就需要登录账户、密码了!!但是通过telnet登录依然不需要账号、密码!!!!
继续搜资料,试验。。。。。。。。。。。。。
然后我按照如下方式修改了rcS文件:
/bin/mount -n -t proc /proc proc
/bin/mount -n -o remount,rw /
/bin/mount -av
/bin/hostname LinChao
/bin/mount -t tmpfs mdev /dev
mkdir /dev/pts
mknod -m 666 /dev/ptmx c 5 2
echo /sbin/mdev>/proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hwclock -s
ifconfig eth0 192.168.0.10 netmask 255.255.255.0
/bin/mknod /dev/pts/0 c 136 0
/bin/mknod /dev/pts/1 c 136 1
/bin/mknod /dev/pts/2 c 136 2
/bin/mknod /dev/pts/3 c 136 3
/bin/mknod /dev/pts/4 c 136 4
/bin/mknod /dev/pts/5 c 136 5
/bin/mount -t devpts devpts /dev/pts
/sbin/telnetd
#telnetd -l /bin/sh
增加/dev/pts/×,再将telnetd -l /bin/sh 修改为/sbin/telnetd,然后reboot, telnet登录本开发板,telnet出现LinChao login: 成功了!!!!
然后输入账号、密码。终于正常登录上去了。
但是,当我把/sbin/telnetd 再次修改为 telnetd -l /bin/sh时,登录又不需要密码了,并且根据大量试验,最后确定telnet登录需要密码必需有如下的配合:
1.linux内核以及busybox配置的配合,上文已经说明。
1.登陆的时候会需要3个文件:group,password,shadow,各个已经以及文件的内容上文已经说明。
2.rcS文件的配合,该文件必需有如下命令:
ifconfig eth0 192.168.0.10 netmask 255.255.255.0
mkdir /dev/pts
/bin/mknod /dev/pts/0 c 136 0
/bin/mknod /dev/pts/1 c 136 1
/bin/mknod /dev/pts/2 c 136 2
/bin/mknod /dev/pts/3 c 136 3
/bin/mknod /dev/pts/4 c 136 4
/bin/mknod /dev/pts/5 c 136 5
/bin/mount -t devpts devpts /dev/pts
/sbin/telnetd
但是,试验中还发现一个问题,就是去掉login后,telnet登录是需要密码了,但是通过串口登录却不需要密码,这说明登录密码只针对telnet登录模式,而串口属于console登录。
如果要让串口登录也需要密码,只需要在rcS最后添加login命令即可!!
DATE: [2011-9-18]
今天新发现一个问题,在rcS中添加Login后从串口登录linux系统是需要密码,但是如果超过一分钟没有登录的话,login会因为超时退出,这时再通过串口登录linux系统将没有任何限制,串口提示为:Login timed out after 60 seconds,尝试的解决办法如下:
(1) 修改inittab文件内容为如下:
::sysinit:/etc/init.d/rcS
#ttyS0::respawn:-/bin/sh
ttyS0::respawn:-/bin/login
::restart:/sbin/init
::ctrlaltdel:/bin/umount -a -r
这样保证执行init时调用login函数,强制登录必需从login进入。但是,测试发现这样存在的问题是:如果一直不登陆,那么串口则会每隔60s发送一个:“LogiLinChao login: ”也就是说,init进程会一直循环调用login。
(2) 修改inittab文件内容为如下:
::sysinit:/etc/init.d/rcS
#ttyS0::respawn:-/bin/sh
#ttyS0::respawn:-/bin/login
ttyS0::respawn:-/sbin/getty /dev/ttyS0 #经过测试,这种修改是错误的的!!!telnet登录正常,但串口控制台出错。
::restart:/sbin/init
::ctrlaltdel:/bin/umount -a -r
系统出错,一直打印BusyBox v1.15BusyBox v1.15.。。。。。
关于密码的设置问题:可以直接拷贝主机上的密码相关文件或者烧写文件系统后,使用passwd设置密码,也可以通过adduser等添加、管理用户。
在试验中发现,由于文件系统中多了两个文件:securetty services,而这两个文件是从主机上直接复制的,导致在目标板上一直不能passwd root的密码,后来将这两个文件删除后就可以设置root密码了,原因暂时不明,累了一天终于取得成功了,今天就到这了。
补充:
telnetd 守护进程
用途
为 TELNET 协议提供服务器功能。
语法
/usr/sbin/telnetd [ -a ] [ -n ] [ -s ]
描述
注:telnetd 守护进程通常由inetd 守护进程启动。也可使用 SRC 命令从命令行控制。
/usr/sbin/telnetd 守护进程为一服务器,它支持 Defense Advanced Research Product Agency (DARPA) 标准 Telnet 协议(TELNET)。telnetd 守护进程的变动要由系统管理接口工具(SMIT)来完成。
对 telnetd 守护进程的改动可通过系统管理接口工具(SMIT)或系统资源控制器(SRC)来完成,即通过编辑/etc/inetd.conf 或 /etc/services 文件。建议不要在命令行输入 telnetd。telnetd 守护进程缺省设置为当其未在 /etc/inetd.conf 文件中被注释时启动。缺省情况下,-a 标记也打开了。
inetd 守护进程从 /etc/inetd.conf 文件和 /etc/services 文件获取其信息。
在对 /etc/inetd.conf 或 /etc/services 文件作改动之后,运行refresh -s inetd 或 kill -1 InetdPID 命令来通知 inetd 守护进程其配置文件的变动。
当启动 telnet 会话后,telnetd 守护进程发送 TELNET 选项到客户(远程)主机指示其有能力执行选项。
终端协商
telnetd 守护进程向客户机主机要求终端类型。收到以后,telnetd 守护进程检测所指示的类型是否为本地系统所支持。如果不支持,守护进程重新要求一个终端类型。
该终端类型协商继续直到远程客户机发送一个可接受的终端类型或直到客户机在一行内发送两次相同的类型,表明它已经没有其它可用的类型。需要时,telnetd 守护进程参考 /etc/telnet.conf 文件将客户机的终端类型字符串翻译成 terminfo 文件条目。
注:既然telnetd 守护进程允许发送和接收 8 位 ASCII,则它也支持 NLS。
如果远程客户机发送 TELNET SAK 命令,telnetd 守护进程通过 PTY 传递本地 SAK 字符来调用可信的 shell。
telnetd 守护进程支持下列 TELNET 选项:
二进制
回显/不回显
支持 SAK
禁止向前
计时标记
协商窗口大小(NAWS)
认证
二进制
回显/不回显
支持 SAK
禁止向前
计时标记
协商窗口大小(NAWS)
telnetd 守护进程还识别远程客户机的下列选项:
二进制
禁止向前
回显/不回显
终端类型
telnetd 守护进程通过系统管理接口工具(SMIT)或改变 /etc/inetd.conf 文件来控制。建议不要在命令行输入 telnetd。
认证协商
如果系统配置了 Kerberos 5 认证,telnetd 将接受认证选项协商。如果双方同意 Kerberos 5 认证,客户机将忽略 DCE 主体而且telnetd 将用kvalid_user 例程来决定 DCE 主体是否可访问帐户。如果它通过,就不再请求密码。
用系统资源控制器来操纵 telnetd 守护进程
telnetd 守护进程是 inetd 守护进程的子服务器,而后者是系统资源控制器(SRC)的子系统。telnetd 守护进程是 tcpip SRC 子系统组的成员。缺省情况下在 /etc/inetd.conf 文件中启用该守护进程,并用下列的 SRC 命令对之进行操作:
startsrc启动子系统、子系统组或子服务器。
stopsrc停止子系统、子系统组或子服务器。
lssrc获取子系统、子系统组或子服务器的状态。
标志
-a使 PTY 和套接字在内核之中直接链接,数据处理得以保留在内核之中以提高性能。
-n禁用传输层保持活动消息。缺省启用消息。
-s打开套接字级别的调试。
示例
注:telnetd 守护进程的参数可由 SMIT 或编辑 /etc/inetd.conf 文件来指定。
要启动 telnetd 守护进程,输入如下:
startsrc -t telnet
该命令启动 telnetd 子服务器。
要正常停止 telnetd 守护进程,输入如下:
stopsrc -t telnet
该命令允许启动所有暂挂的连接并完成现有的连接但会阻止启动新的连接。
要强制停止 telnetd 守护进程和所有 telnetd 连接,输入如下:
stopsrc -t -f telnet
该命令会立刻终止所有暂挂的连接和现有的连接。
要显示 telnetd 守护进程的简短状态报告,输入如下:
lssrc -t telnet
该命令返回守护进程名、进程标识以及状态(活动的或不活动的)。
文件
terminfo描述终端能力。
相关信息
ftp 命令、kill 命令、lssrc 命令、rcp 命令、refresh 命令、rlogin 命令、rsh 命令、startsrc 命令、stopsrc 命令、telnet 命令。
kill 命令、lssrc 命令、refresh 命令、startsrc 命令、stopsrc 命令、telnet 命令。
文件格式/etc/inetd.conf,文件格式/etc/telnet.conf。