对于广大的SCOUNIX操作系统管理员来说,最不可原谅的过失之一就是忘记了 管理员口令(即超级用户口令)。这个过失会导致极其严重的后果,对此凡是具备UNIX 操作系统常识的人都应该知道。然而令人遗憾的是,时至今日铸错者依然大有人在。看 来,对他们固然要责备,但既然问题客观存在,我们就总还须面对现实,想办法去解决才是。 长期以来,许多人就超级用户口令被忘记的问题发表了各种看法。一部分人认 为,一旦忘记了超级用户口令,只能重装操作系统,此外别无它法。另一部分人则坚决 反对这种"重装论",他们提出了一些经过成功实践的解决方案,使得"重装论"者败下阵来。现在我们可以肯定地说,忘记超级用户口令是有办法解决的。 但同时我们也不得不承认,现行的解决方案有很大的局限性,这些局限性决定了现有方案无论怎样变化和发展也不可能成为一种有着强大生命力的最彻底的解决方案。 传统解决方案的局限性 上面已经谈到,目前有多种针对超级用户口令被忘记问题的解决方案。为了叙述上的方便,本文将这些方案统称为传统解决方案。传统方案乍看起来似乎各不相同,但必须有一套(两张)EmergencyBootFloppy(紧急启动软盘)。这套软盘均为文件系统 格式,必须在SCOUNIX上制作,并且在不同类型机器上制作的紧急启动软盘相互不能通用。用紧急启动软盘启动后,将硬盘根文件系统mount到某个目录下(一般为/mnt目录),然后进入该目录(即进入硬盘根文件系统的根目录),修改相关目录下与超级用户口令有关的信息(各种方案的不同之处主要体现于此)。最后回到软盘根目录,拆卸/dev/hd0root,重启机器。 这些共同点实际上反映了传统方案的局限性: 一、操作平台局限性:要求自始至终必须在SCOUNIX操作系统平台上实施。 二、操作工具局限性:对紧急启动软盘的依赖性太大。万一软盘发生损毁,必须找一台类型相同的机器再制作一套,这就是前面所说的"专盘专用"的限制。 三、操作对象局限性:必须依靠硬盘根文件系统的支持。即操作者与修改对象(指与超级用户口令有关的信息)被文件系统隔开,操作者不能直接修改对象,只能调用文件系统提供的服务修改。这种方式本是信息科学中倡导的层次化思想的一种体现,在 正常情况下应予称道;但任何事物都是有两面性的,在非常情况下--诸如解决忘记超级用户口令这一类问题时--该方式反而有可能带来麻烦。 三大局限性说明了传统解决方案可行性的脆弱和狭窄,也决定了它们作为凌驾于文件系统之上的高层方案所必然具有的弊端。于是,打破这些局限性,探索出一种全新的解决方案,就成为了摆在一切UNIX研究者面前的新课题。 所谓新课题,就是找到一种能够突破传统方案局限性的新方案。究竟从何处下手呢?让我们再来看一看三大局限性。 操作平台局限性似乎不好突破,因为其它操作系统识别不了UNIX的文件系统格式。 操作工具局限性好象就更难了,因为紧急启动软盘既要在UNIX上制作,又要在UNIX上使用,所以如果操作平台局限性突破不了,它就更突破不了。最后看看操作对象局限性。操作对象完全由文件系统管理,操作者必须通过文件系统访问它们。万一文件系统崩溃,那么即使它下面的文件完好无损,操作者也只能认为这些文件已全部丢失--因为文件系统无法访问(例如mount不上来)。其实这个时候还是有办法找到那些文件的,方法就是直接访问物理硬盘。道理很简单:就本质而言,文件系统只不过是一个构筑于物理硬盘之上的逻辑组织,平时我们是通过它来访问物理硬盘的;现在这个组织寿终正寝,不能再为我们服务了,于是我们只好"自己动手,丰衣足食"。直接访问物理硬盘不但可以使文件"失"而复得,而且还有另外一个重要意义--突破了操作对象局限性。 操作对象局限性一旦突破,我们就会惊奇地发现突破另外两大局限性简直可以说是顺理成章了。因为虽然其它操作系统识别不了UNIX的文件系统格式,但在任何操作系统上,我们都可以访问物理硬盘;而只要是带有访问物理硬盘功能的软件,都可以成为我们的操作工具。 现在我们要做的仅仅是:找一个大家最熟悉的操作系统和一个最易寻觅的可以访问物理硬盘的软件。 大家最熟悉的操作系统无疑是DOS。可以访问物理硬盘的软件很多,但最易寻觅的莫过DEBUG.EXE。所谓最易寻觅,是因为DEBUG是DOS本身的一条外部命令,可以说只要是在安装了DOS的机器上都可以找到它。对DEBUG略知一二的人可能会指出该命令并 没有提供访问物理硬盘的选项,但请不要忘记DEBUG是DOS提供给用户的一个汇编语言调试程序,我们完全可以利用它编写、调试和执行一个汇编小程序去访问物理硬盘。应该说,这对一个能够取得系统管理员身份的人并不困难。 综上所述,在DOS上运行DEBUG来破除UNIX管理员口令,这就是本文提出的解决SCOUNIX超级用户口令被忘记问题的新方案。 新方案的应用新方案已经提出,下面我们来看看它是如何应用于实践的。 首先需要指出,由于文章篇幅和性质的限制,本文不可能将新方案实施过程中涉及到的所有知识以"入门讲座"的方式加以介绍。因此,在阅读本小节前,读者应具备下列基础:熟悉硬盘主引导扇区和UNIX分区及UNIX文件系统的构造(这对UNIX系统管理员来说不成问题)、了解中断13H入口参数含义、使用过DEBUG命令。一台COMPAQDESKPROXL/466服务器,主板内含PCISCSI-2控制器一个,上接富士通硬盘一只,该硬盘主要参数为:1041柱面,64头,32扇。硬盘上装有SCOUNIXSystemV/386Release3.2operatingsystemVersion4.2。现在假设其超级用户口令被忘记。首先,随便找一台安装了DOS的计算机,制作一张DOS系统盘,并在系统盘上拷贝一个DEBUG.EXE文件。 <ccid_nobr></ccid_nobr>
然后将该盘插入COMPAQ服务器A驱,开机启动DOS操作系统,执行DEBUG命令。 <ccid_nobr></ccid_nobr>
现在我们就编写一段汇编语言程序(以下简称app),来读出硬盘0柱0头1扇区的内容。该扇区存放的是主引导记录,读出它是为了确定SCOUNIX分区的起始位置。app是调用中断13H实现的,以后我们还要反复用到它,当然入口参数将随所读内容物理地址的变化而变化。 <ccid_nobr></ccid_nobr>
现在我们可以用"dump"命令查看被读到内存里的扇区内容。从偏移11BEH处开始是分区表,其中类型标志字节为63H的分区是SCOUNIX分区。该分区起始于1柱面0磁头1扇。 下面,读出UNIX根文件系统i-node表的第一个扇区,以确定根目录的物理位置。 根据UNIX分区起始位置可知根文件系统始于2柱0头1扇。并且,由于2柱0头1扇是引导块,2扇是超级块,3、4扇为间隔,所以i-node表必定始于第5扇。 我们用app读出它(CX的赋值应改为"0205")。 读出后用"dump"命令查看偏移1040H至107FH的64个字节,这就是2号i-node,即根目录的i-node。 <ccid_nobr></ccid_nobr>
由于其它12个数据块地址均为0,所以可断定根目录在硬盘上只占了一个数据块。现在我们必须依据DA0500H计算出这个数据块存放在硬盘的第几柱面、第几磁头、第几扇区。计算公式如下: <ccid_nobr></ccid_nobr>
但就在此时它却突然发现/etc/passwd文件失踪了!(其实只是被改名为zls,但UNIX对此一无所知。)没有了这个文件,UNIX无法提问超级用户口令,于是它只好在屏幕上显示如下 信息并允许用户以系统管理员身份直接进入系统维护态: <ccid_nobr></ccid_nobr>
进入维护态后,当然就可以"为所欲为"了。但最好先设置一个新的超级用户口令。要想这样做,首先必须恢复passwd文件名。 <ccid_nobr></ccid_nobr>
然后,就可以用/bin/passwd命令设置新的超级用户口令了。 结束语 在本文行将结束时,我们再来作一个小小的总结。 传统方案有操作平台、操作工具和操作对象局限性。新方案则突破了这三大局限性。 一、新方案突破了操作平台局限性。传统方案的操作平台必须是UNIX,而新方案则是DOS。DOS比UNIX普及得多,中国的绝大部分计算机用户对UNIX陌生,但对DOS却相当熟悉,使用起来也有亲切感。 二、新方案突破了操作工具局限性。传统方案的操作工具必须是两张紧急启动软盘,而新方案仅使用一张DOS系统盘,其上只需拷贝一个DEBUG.EXE文件。紧急启动软盘只能专盘专用,DOS系统盘却不存在这个问题--用任何一台机器上的DOS制作出的系 统盘,可以用来解决任何一台机器上的UNIX超级用户口令被忘记的问题。至于用来访问物理硬盘的软件,当然更不是非DEBUG不可,任何软件--只要支持访问物理盘--均可。作者推荐使用Norton8.0软件包里的diskedit程序,对不懂汇编语言编程的人来说该程序无疑是一个最好的选择。 三、新方案突破了操作对象局限性。传统方案的操作对象是文件系统管理下的文件,而新方案撇开了文件系统,直接在底层修改数据。 最后需要说明的是,对于SCOOpenServerRelease5,因条件所限,作者还没有使用过,所以关于新方案在该版本上执行时步骤是否需要修改以及如何修改的问题,如果有机会,作者会加以适当的补充。 |
|||||||
<!-- google_ad_client = "pub-9477090791516256"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as_rimg"; google_cpa_choice = "CAAQq8b8zwEaCGyZtT-0SR1TKJnA93M"; google_ad_channel = ""; //-->
|
from 中国IT资源网
其他文章: