目录
- 背景
- 操作流程
- 反思
背景
背景
服务器部署kkview阅读项目,其中在data存放本地读取文件和输出文件,在读取文件夹内挂载了一个dir文件夹映射路径为服务器的根路径
操作
想要删除data文件夹内的文件(为了重启服务删除缓存),在data目录执行了rm -rf *,由于挂载目录导致删除了服务器的核心二进制文件
影响
此时ls、ll等所有常规的命令无法使用,sftp、ssh等都无法登陆,只有当前这个连接可以连接到服务器,服务器还没有备份导致无法通过时间点进行重制操作
这里记录一下基于ai提供的思路,修复服务器用户登陆以及基本基础命令无法执行的问题,保证服务器可用的操作流程
操作流程
这里出现问题的服务器地址为A, 机房其他的正常服务器B
检查服务器是否还有救
执行命令 echo /lib64/ld-linux-x86-64.so.* 或 echo /lib/x86_64-linux-gnu/ld-linux-x86-64.so.*
如果输出了类似 /lib64/ld-linux-x86-64.so.2 的路径,接着往下看,如果没有没救了,联系运维重新安装系统不覆盖文件抢救吧(可以先把运行的服务如数据库内容备份)
思路: 从机房其他服务器下载Busybox二进制文件和动态编译器,在受损服务器A上利用bash的tcp下载文件,通过Busybox替代本地的ls运行,再将其他服务器的核心文件拷贝过来代替运行
1. 从B上下载Busybox以及动态编译器
# 下载Busybox并添加权限
wget https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64
mv busybox-x86_64 busybox
chmod +x busybox
# 使用python将二进制转为Hex存放到bb.txt文件中
python3 -c 'with open("busybox","rb") as f:
while True:
d=f.read(64)
if not d: break
print("".join("\\x{:02x}".format(b) for b in d))' > bb.txt
# 端口自定义 保证不冲突
nc -l -p 8002 -q 1 < bb.txt
# 这里接收完成后 通过ctrl c关闭(或者自动关闭)执行传输动态编译器
python3 -c 'with open("/bin/chmod","rb") as f:
while True:
d=f.read(64)
if not d: break
print("".join("\\x{:02x}".format(b) for b in d))' > chmod.hex
nc -l -p 8001 -q 1 < chmod.hex
2. 在A中接受文件
# 建立连接,接收数据,关闭连接
exec 3<>/dev/tcp/B/8001
while read -u 3 -r line; do
printf "%b" "$line" >> /busybox
done
exec 3>&-
echo /busybox
输出 /busybox 成功
exec 4<>/dev/tcp/B/8001
> /chmod_tool
while read -u 4 -r line; do
printf "%b" "$line" >> /chmod_tool
done
exec 4>&-
echo /chmod_tool
3.安装工具,使用替代命令
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /chmod_tool +x /busybox
# 设置别名
alias bb='/busybox'
# 重建系统目录
/busybox mkdir -p /bin /usr/bin /sbin /usr/sbin /etc
/busybox --install -s /bin
# 清除ls命令,清除缓存
hash -r
/bin/ls -l / 此时执行正常输出ls内容
4.将 B服务器的用户系统以及安装的内容压缩复制过来
# B服务器执行
tar -czvf system_rescue.tar.gz /bin /sbin /usr /lib /lib64 /root
python3 -m http.server 8001
# 受损A服务器执行
cd /
wget http://B:8001/system_rescue.tar.gz
mkdir /restore_temp
tar -xzvpf system_rescue.tar.gz -C /restore_temp
cd /restore_temp/usr/lib
# 使用 tar 管道复制到目标目录
tar -cf - . | (cd /usr/lib && tar -xvf -)
# 恢复 /bin (常用命令 ls, cp, mv...)
cd /restore_temp/bin
tar -cf - . | (cd /bin && tar -xvf -)
# 恢复 /sbin (管理命令 ip, fdisk...)
cd /restore_temp/sbin
tar -cf - . | (cd /sbin && tar -xvf -)
# 恢复 /usr/bin (应用命令 docker, python...)
cd /restore_temp/usr/bin
tar -cf - . | (cd /usr/bin && tar -xvf -)
# 刷新缓存
hash -r
ls --version
#输出 ls (GNU coreutils) 8.32 表示ls已经替换为正常的服务器命令了
5.命令回复后续
# 1. 重新执行 systemd 守护进程
systemctl daemon-reexec
# 2. 重新加载所有配置文件
systemctl daemon-reload
# 3. 重启ssh,检查22端口
systemctl restart ssh
netstat -tulpn | grep 22
# 4.删除多余文件
rm /system_rescue.tar.gz
rm -rf /restore_temp
rm /busybox /chmod_tool
自此服务器可以正常运行了,使用A或B服务器的用户名和密码登录试一下,如果为B的账号可以修改一下;
测试一下服务器的ll等命令,如果不行,可以在配置文件添加
反思
1. 对于kkview等预览文件等服务配置挂在目录等时候,禁止挂载到服务器根目录,推荐data等数据目录,即使后续误删除影响也不大
2. 尽量不要使用rm -rf * 或者相似的命令,推荐rm -rI 目录名(交互式删除)