原文: 如何拯救一台glibc被干掉的Linux服务器?

首先如果 libc.so.6 没有被删除, 直接使用LD_PRELOAD就可以恢复

LD_PRELOAD=/lib64/libc-2.12.so ln -s libc-2.12.so libc.so.6

如果彻底被删除, 下面的方法可以一试

glibc被卸载,负责加载所有.so的ld.so也就没了,因此运行几乎所有外部命令时都会得到一句『找不到ld-linux-x-y-z.so.2』的出错提示。比如ls,比如cp,以及所有动态链接的命令。

这是一台放置于另外一个大洲的客户IDC的物理服务器。我说不行就光盘引导修复,但不知道什么原因他们又连不上服务器的HP iLO工具。

干着急也不是办法。万幸的是rpm --force的小伙子的ssh登录shell还连着。我说那不行就只能你自己一个byte一个byte先敲一个static linked的binary出来,这是可以运行的。

话说完,我就大概想到该怎么办了。

  1. 用bash的内部命令 printf '\xaa\xbb\xcc' > file 可以生成任意内容的文件
  2. 另外找台同配置的Linux,用xxd或hexdump配合一点点脚本,或者直接用python写个小脚本,把ld.so文件转储成若干条printf '...' >> file的命令(考虑到bash单行命令的长度限制,我没有尝试只生成一条命令)
  3. copy 2)中生成的命令,paste到出事的Linux shell中运行
  4. 这样至少ld.so能用,接下来可以按图索骥恢复其他.so

    Tada! 我感觉自己重新发明了scp。

然而这样行不通。printf重定向生成的文件不带可执行位,无法被执行,只是把出错信息变成了permission denied而已。

别忘了chmod也不能用哦。

所以往上面手动恢复glibc这条路看来是行不通了。

既然动态链接的命令都不能用,那就只能上静态链接了。到http://www.busybox.net下载了静态链接的1.16.0版(越旧的版本越好——因为越小)的busybox,不到900KB,用上面的办法,转存到出事的Linux上。

刚才不是说了没有可执行位吗?busybox又怎样?

这次,我是把busybox直接写入到

printf '...' > /bin/cp

覆盖系统原有的带x位的cp文件,用旧瓶装新酒,我终于获得了一个可执行的busybox!

别忘了,argv[0]为cp时,busybox就是在做cp的事情!

因此接下来再

cp cp ln
ln -s cp chmod
ln -s cp ls
ln -s cp wget
ln -s cp sh
...

printf和busybox拯救世界!

再传送一份静态连接的dropbear上去,起一个备用的ssh server(别忘了把账号的登录shell改成busybox版sh),总算可以松一口气,继续后面的灾难恢复了。

PS:

测试一个简单的hello world程序可以通过

#!/usr/bin/env python
# -*- coding: utf-8 -*- from __future__ import print_function
import sys '''
#include<stdio.h> int main()
{
printf("Hello World!\n");
} gcc -o hello hello.c
''' # only test,
result = []
outfile = 'out.sh'
fpath = '/home/opc/hello' with open(fpath, 'rb') as f:
bt = f.read() diglist = list(bt)
for dig in diglist:
if sys.version_info < (3, 0):
dig = int(dig.encode('hex'), 16)
if dig > 31 and dig < 127: #ascii码里面这些字符串可见
s = str('\\') + oct(dig)[-3:].replace('o','0')
else:
s = str('\\x') + hex(dig)[-2:].replace('x','0')
result.append(s)
with open(outfile,'w') as f:
for i in range(0, len(result), 1000): #每次打印1000个字符1k大小,1M大小文件就需要1000次操作了-_-!!
print('printf \'', ''.join(result[i:i+1000]), '\' >> recovery_file', sep='') # 最后一个分片大一点没关系
f.write('printf \'' + ''.join(result[i:i+1000]) + '\' >> recovery_file\n')

如何拯救一台glibc被干掉的Linux服务器的更多相关文章

  1. 使用Java管理千台规模Linux服务器_入门

    http://www.oschina.net/code/snippet_222919_11734 代码分享 当前位置: 代码分享 » Java  » 网络编程 搜 索   [饶过] 使用Java管理千 ...

  2. 一条shell命令让多台Linux服务器执行

    1.环境 局域网环境有3台Linux服务器,配置host文件 [root@master1 ~]# vim /etc/hosts 192.168.8.201 master1 192.168.8.202 ...

  3. 两台linux服务器之间实现挂载

    https://blog.csdn.net/lpp_dd/article/details/78743862 两台linux服务器之间实现挂载: 服务端: 1.首先需要在主机上设置允许挂载的目录 (1) ...

  4. 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件

    两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ...

  5. 一台Linux服务器(4C8G配置)可以负载百万个连接?

    一台Linux服务器可以负载多少个连接? 首先我们来看如何标识一个TCP连接?系统是通过一个四元组来识别,(src_ip,src_port,dst_ip,dst_port)即源IP.源端口.目标IP. ...

  6. EMC存储同时分配空间到两台LINUX服务器路径不一致导致双机盘符大小不一致

    操作系统:Centos linux6.6 当我们从EMC存储上划分空间同时分配给两台或者多台服务器上时,有的时候会出现在服务器上所生成的磁盘路径是不一致的,这样就会导致盘符名称不一致或者是盘符对应的大 ...

  7. 在一台Linux服务器上安装多个MySQL实例(一)--使用mysqld_multi方式

    (一)MySQL多实例概述 实例是进程与内存的一个概述,所谓MySQL多实例,就是在服务器上启动多个相同的MySQL进程,运行在不同的端口(如3306,3307,3308),通过不同的端口对外提供服务 ...

  8. 如何在 Amazon AWS 上设置一台 Linux 服务器

    摘要: AWS(Amazon Web Services)是全球领先的云服务器提供商之一.你可以使用 AWS 平台在一分钟内设置完服务器.在 AWS 上,你可以微调服务器的许多技术细节,如 CPU 数量 ...

  9. 用rsync备份一台linux服务器上的数据

    rsync是安装完linux后都会自带的,在机器上运行rsync命令看是否有安装即可 备份到远程服务器 这里介绍的rsync的用途是备份一台linux服务器上的数据到另外一台机器 环境 将需要备份机器 ...

随机推荐

  1. Verilog 浮点数运算模块

    算法中常常会到浮点数运算,而浮点数的处理常常是Verilog初学中常常遇到的问题.以下将就一个简单的例子说明Verilog中浮点数运算处理. 在JPEG图像压缩时遇到色彩空间变换的问题,将YCbCr转 ...

  2. win7上python+theano+keras安装

    https://blog.csdn.net/yongjiankuang/article/details/50485610 其实过程很简单,首先说一下安装条件: 1.win7 (32和64都可以,下载安 ...

  3. spring boot 集成mybatis报错

    Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of ...

  4. Winform 动态 画图 不闪

    一.问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: “this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlSty ...

  5. DMP

    1.dmp-data mabagement platform数据管理平台 数据赋能,营销智变 2.定义 把分散的第一,第三方异构.多源数据进行整合,然后纳入统一技术平台中,并对这些数据进行标准化和细分 ...

  6. MySQL慢查询(二) - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析

    随笔 - 66 文章 - 0 评论 - 19 MySQL慢查询(二) - pt-query-digest详解慢查询日志 一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它 ...

  7. python selenium2示例 - email发送

    前言 在进行日常的自动化测试实践中,我们总是需要将测试过程中的记录.结果等等等相关信息通过自动的手段发送给相关人员.python的smtplib.email模块为我们提供了很好的email发送等功能的 ...

  8. 程序猿学英语—In August the English learning summary

    时间真快,总结的7月份英语学习总结刚刚结束,转眼间又该对8月份的英语学习进行小节了. 进入8月初.下发了一个文档,用一个星期的时间学音标.纠音. 在王美的带领下我组也发起了纠音运动. 刚开 始纠音的时 ...

  9. Sumdiv(较难数学题)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20971   Accepted: 5290 Description Cons ...

  10. full stack on the road

    Full Stack, I'm coming. 有人说全栈只是个理想情况,但我不这么认为,因为好多思想是想通的, 比如 OO.函数式编程.设计模式... 也有人说搞全栈的人样样普通,可是为嘛我在学习j ...