libcrypt.a被误删除如何恢复

标题是我从网上搜索时看到的。原标题还有个“急!”

为什么会搜索这个信息,因为我也干了同样的事情。

在一台非生产的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又回来了,系统恢复正常。

万幸,删库也不用跑路。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值