标题是我从网上搜索时看到的。原标题还有个“急!”
为什么会搜索这个信息,因为我也干了同样的事情。
在一台非生产的AIX机器上,测试yum的部署。其中使用到openssl,在系统上有installp和rpm安装的两个版本,因为版本兼容性的原因,需要在/usr/lib中反复操作相关的库文件libcrypto.a,使用ar来增删里面的so文件。在一次rm操作后,突然随后的命令都无法执行了,都是cp,ls这些基本命令,提示信息为:
Could not load program ls:
Could not load module /usr/lib/libc.a(shr.o).
Dependent module libcrypt.a(shr.o) could not be loaded.
Could not load module libcrypt.a(shr.o).
System error: No such file or directory
Could not load module ls.
Dependent module /usr/lib/libc.a(shr.o) could not be loaded.
Could not load module .
细看才发现误删了文件名差不多的系统库文件libcrypt.a!
首先是求助网络,相关搜索结果只有一条:http://bbs.chinaunix.net/thread-4023544-1-1.html
在11年前同样有人发生了相同的误操作。当时回复只有一个:建议光盘启动,然后复制回去。
因为还有一个终端窗口在线可以操作,所以没有贸然尝试重启。尝试了一下可用的命令,发现只有echo可以使用。执行vi,ed都是同相的失败提示,想要ssh,telnet,ftp进系统,也是失去响应。
查看echo的使用手册,发现一线曙光,可以用\0xxx的八进制格式,向文件写入任意字节信息。在其他AIX机器上查看了一下libcrypt.a文件,只有11KB,不算大。但当然不可能一个个字节手工输入了。幸好还算使用过PHP,可以拿出来溜溜了。
<?php
$fp=fopen("libcrypt.a","r");
$s=fread($fp,11468); //11468为文件长度
$arr = unpack("C*",$s);
$i=0;
foreach($arr as $v)
{
$i++;
$data = decoct($v);
echo "\\0{$data}";
if ($i%128 == 0)
{
//\c是使用后续的字符无效,因为echo会自己加入换行,在分段录入的情况下,不需要这个换行的。
echo "\\c'>>libcrypt.a\necho '";
}
}
?>
生成的结果是类似 echo '\074\0142\0151\0147\0141\0146\076\012\061\060\062‘>>libcrypt.a 这样的字符串。
一次性在终端粘贴发送整个文件是无法成功的,命令行的长度有限制。只好按128字节一行的分段录入了。因为时间原因,没有太完善脚本,需要在最开始和结尾处 补上echo命令和单引号等。
执行后,libcrypt.a又回来了,系统恢复正常。
万幸,删库也不用跑路。