第4章 使用mingetty繞開登陸程序/bin/loginlinux
在閱讀這篇博文以前,建議先閱讀個人前3篇博文,並且最好按順序閱讀:(否則可能會以爲我寫得不知所云,呵呵!)
centos
第1篇:Linux系統裁減之,製做一個極度精簡的Linux-1 http://www.javashuo.com/article/p-tbxqdmtb-m.htmlbash
第2篇:Linux系統裁減之,製做一個極度精簡的Linux-2-用腳本實現自動拷貝命令和依賴庫文件 http://www.javashuo.com/article/p-kzglxkeb-bk.html網絡
第3篇:Linux系統裁減之,製做一個極度精簡的Linux-3-爲精簡的系統增長網絡功能和關機重啓功能 http://www.javashuo.com/article/p-ofizkruk-bk.htmlide
4.1下載mingetty和login程序源碼函數
本文使用的CentOS 5.11的源代碼都在官方源碼網站http://vault.centos.org能夠下載,測試
到http://vault.centos.org/5.11/os/SRPMS/查找mingetty和login程序,以下圖:網站
mingetty和login程序分別屬於mingetty-1.07-5.2.2和util-linux-2.13-0.59.el5_8軟件包:this
[root@CentOS5lsrv01 ~]# rpm -qf /sbin/mingettyspa
mingetty-1.07-5.2.2
[root@CentOS5lsrv01 ~]# rpm -qf /bin/login
util-linux-2.13-0.59.el5_8
提示:login登陸程序在這篇文章暫時不使用!!下篇博文將會從新編譯login程序!!敬請繼續關注!!^_^
4.2使用mingetty爲miniLinux打開兩個終端並直接運行/bin/bash
紅帽Linux(RedHat 5.x)在啓動過程當中執行完/etc/rc.d/rc.sysinit腳本後會根據/etc/inittab的配置運行mingetty實現生成6個終端和圖形界面,用戶看到的「主機名 logon:「登陸提示符就是由mingetty程序拋出的,用戶輸入用戶名和密碼後還會經過/bin/login處理。
這裏我經過mingetty直接生成兩個終端並繞過登陸程序/bin/login直接打開/bin/bash,這些步驟都在源主機(CentOS5lsrv01)作。
第1步:修改miniLinux系統下的/etc/inittab文件,修改爲如下內容:
[root@CentOS5lsrv01 ~]# cat /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc.halt
l6:6:wait:/etc/rc.d/rc.reboot
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
提示:mingetty有一個參數「--login-prog=/bin/login」,貌似是能夠指定登陸程序的,但通過驗證添加「--login-prog=/bin/bash」是無效的,必須修改minigetty源代碼。
第2步:安裝mingetty源代碼包,下載的源碼rpm包我放在源系統的/root/Softwares/Source/目錄下:
[root@CentOS5lsrv01 ~]# ll /root/Softwares/Source/
total 2892
-rw-r--r-- 1 root root 19624 Apr 9 2007 mingetty-1.07-5.2.2.src.rpm
-rw-r--r-- 1 root root 2933601 Nov 9 2012 util-linux-2.13-0.59.el5_8.src.rpm
[root@CentOS5lsrv01 ~]# cd Softwares/Source/
[root@CentOS5lsrv01 Source]# rpm -ivh mingetty-1.07-5.2.2.src.rpm
紅帽的源碼包默認安裝在/usr/src/redhat/SOURCE目錄下:
[root@CentOS5lsrv01 Source]# cd /usr/src/redhat/SOURCES/
[root@CentOS5lsrv01 SOURCES]# ll | grep mingetty-1.07
-rw-rw-r-- 1 root root 13435 Nov 17 2006 mingetty-1.07.tar.gz
第3步:解壓mingetty-1.07.tar.gz並進入mingetty的源碼目錄:
[root@CentOS5lsrv01 SOURCES]# tar xf mingetty-1.07.tar.gz
[root@CentOS5lsrv01 SOURCES]# cd mingetty-1.07
[root@CentOS5lsrv01 mingetty-1.07]# ll
total 84
-rw-rw-r-- 1 2455 2459 17983 Feb 14 1996 COPYING
-rw-rw-r-- 1 2455 2459 276 May 25 2003 Makefile
-rw-rw-r-- 1 2455 2459 3993 Feb 21 2003 mingetty-0.9.4-autologin.patch
-rw-rw-r-- 1 2455 2459 2806 May 14 2003 mingetty.8
-rw-rw-r-- 1 2455 2459 10295 Dec 2 10:40 mingetty.c
-rw-rw-r-- 1 2455 2459 10264 Jan 3 2004 mingetty.c.bak <--修改前先備份一下文件,養成良好習慣
-rw-r--r-- 1 root root 10672 Dec 2 10:17 mingetty.o
第4步:修改 源代碼文件mingetty.c實現打開兩個終端並直接打開/bin/bash:
[root@CentOS5lsrv01 mingetty-1.07]# vi mingetty.c
此處省略了部分源碼…………
53 /* login program invoked */
54 static char *loginprog = "/bin/login"; ß把這行修改爲:static char *loginprog = "/bin/bash";
此處省略了部分源碼………………
409 /* if (autologin) { */
410 /* do_prompt (0); */
411 /* printf ("login: %s (automatic login)\n", autologin); */
412 /* logname = autologin; */
413 /* } else */
414 /* while ((logname = get_logname ()) == 0) */
415 /* do nothing */ ;
把409行到415行所有註釋掉
416
417 if (ch_root)
418 chroot (ch_root);
419 if (ch_dir)
420 chdir (ch_dir);
421 if (priority)
422 nice (priority);
423
424 execl (loginprog, loginprog, autologin? "-f" : "--", logname, NULL);
425 error ("%s: can't exec %s: %s", tty, loginprog, strerror (errno));
426 sleep (5);
427 exit (EXIT_FAILURE);
428 }
修改完後保存退出,而後直接編譯生成mingetty二進制文件:
[root@CentOS5lsrv01 mingetty-1.07]# make
gcc -O2 -Wall -W -pipe -D_GNU_SOURCE -c -o mingetty.o mingetty.c
mingetty.c:294: warning: ‘get_logname’ defined but not used
mingetty.c: In function ‘main’:
mingetty.c:424: warning: ‘logname’ is used uninitialized in this function
gcc mingetty.o -o mingetty ß生成了mingetty文件
[root@CentOS5lsrv01 mingetty-1.07]# ll
total 84
-rw-rw-r-- 1 2455 2459 17983 Feb 14 1996 COPYING
-rw-rw-r-- 1 2455 2459 276 May 25 2003 Makefile
-rwxr-xr-x 1 root root 16122 Dec 2 12:57 mingetty <--mingetty二進制可執行文件
-rw-rw-r-- 1 2455 2459 3993 Feb 21 2003 mingetty-0.9.4-autologin.patch
-rw-rw-r-- 1 2455 2459 2806 May 14 2003 mingetty.8
-rw-rw-r-- 1 2455 2459 10295 Dec 2 10:40 mingetty.c
-rw-rw-r-- 1 2455 2459 10264 Jan 3 2004 mingetty.c.bak
-rw-r--r-- 1 root root 10672 Dec 2 12:57 mingetty.o
第5步:把從新編譯出來的mingetty文件拷貝到miniLinux的/sbin/目錄下,並拷貝依賴的庫文件:
[root@CentOS5lsrv01 mingetty-1.07]# cp mingetty /mnt/sysroot/sbin/
[root@CentOS5lsrv01 mingetty-1.07]# ldd /sbin/mingetty ß查看源系統的mingetty依賴的庫文件
linux-vdso.so.1 => (0x00007fff923d9000)
libc.so.6 => /lib64/libc.so.6 (0x0000003977400000)
/lib64/ld-linux-x86-64.so.2 (0x0000003977000000)
利用以前寫的拷貝庫文件的函數「libcp「完成拷貝庫文件的過程:
[root@CentOS5lsrv01 ~]# cd /root
[root@CentOS5lsrv01 ~]# source bincp.sh
Input command what you want to copy to miniLinux:q ß直接退出就能夠了,目的是獲取libcp函數
[root@CentOS5lsrv01 ~]# [root@CentOS5lsrv01 ~]# libcp /lib64/libc.so.6
Copy lib file /lib64/libc.so.6 Finished.
[root@CentOS5lsrv01 ~]# libcp /lib64/ld-linux-x86-64.so.2
Copy lib file /lib64/ld-linux-x86-64.so.2 Finished.
第6步:修改miniLinux系統中文/etc/rc.d/rc.sysinit文件爲如下內容:
[root@CentOS5lsrv01 ~]# cat /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to \033[31mMy team \033[0m Linux."
insmod /lib/modules/e1000.ko
ifconfig eth0 192.168.0.91 netmask 255.255.255.0
ifconfig eth0 up
/bin/bash ß刪除原來的這行
第7步:修改完成,掛起源系統(CentOS5lsrv01),啓動過miniLinux系統測試:
提示:測試終端的tty命令也要先移植到miniLinux哦。
看到吧,這就是Linux,開源的系統,什麼都能按你的意願修改,前提是你足夠了解它!!
小結:
1. 成功打開了兩個終端,而且兩個終端都是直接打開/bin/bash,沒有登陸過程的!!
2. 以前的作法是在 /etc/rc.d/rc.sysinit文件中直接打開/bin/bash的,此次是用/sbin/mingetty程序生成兩個終端並直接打開/bin/bash。
下一篇博文將會講講如何爲系統添加用戶登陸功能,歡迎繼續關注個人技術博客!!