V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wzhpro
V2EX  ›  CentOS

不小心 rm -rf /了,还没重启,怎么办

  •  
  •   wzhpro · 2019-06-19 17:47:30 +08:00 · 6025 次点击
    这是一个创建于 2020 天前的主题,其中的信息可能已经有所发展或是发生改变。

    centos 7.4

    rm -rf /path 的时候 “/”和“ path ”中间多了一个空格,结果...

    现在服务器还没重启,求解

    先谢过Image

    24 条回复    2019-06-20 16:03:43 +08:00
    frozenway
        1
    frozenway  
       2019-06-19 17:50:38 +08:00
    用快照恢复一下就可以了
    walkman660
        2
    walkman660  
       2019-06-19 18:04:53 +08:00
    模糊记得 centos 7 不会真正运行 rm -rf /,会又提示
    wzhpro
        3
    wzhpro  
    OP
       2019-06-19 18:12:06 +08:00   ❤️ 9
    @walkman660 不知道哪个 2B 在 alias 加了--no-preserve-root
    pkookp8
        4
    pkookp8  
       2019-06-19 18:13:43 +08:00 via Android
    @wzhpro 这么严重的问题,我不会笑的,除非

    没忍住
    哈哈哈哈哈,真的是 2b
    flytrap
        5
    flytrap  
       2019-06-19 18:14:50 +08:00
    关机,跑路
    DANG
        6
    DANG  
       2019-06-19 18:16:22 +08:00   ❤️ 1
    大四培训时候的笔记,直接粘过来给你看看吧。

    选择修复模式
    光盘启动选择 Rescue installed system
    若需网络引导,选择 URL 模式,本地光盘选择 Local cdrom,且无需网络支持
    continue
    shell start shell

    修复 fstab
    fdisk -l
    mkdir /qin
    mount /dev/sda2 /qin
    #lv 下需要执行 lvm vgscan 和 lvm vgchange -ay 激活 vg 才能挂载
    cp /qin/bachup/fstab.bak /qin/etc/fstab
    reboot

    再次进入修复模式
    若看到 chroot /mnt/sysimage,说明 /etc/fstab 恢复成功

    恢复内核
    mkdir qin
    mount /dev/cdrom /qin
    rpm -ivh /qin/Package/kernel-2.6.32-71.e16.x86_64.rpm --root=/mnt/sysimage/ --force

    恢复引导程序
    chroot /mnt/sysimage/
    grub-install /dev/sda
    ls /boot/grub
    vi /boot/grub/grub.conf
    default=0
    timeout=5
    title linux for qin
    root (hd0,0)
    kernel /vmlinuz-2.6.32-71.el6.x86_64 ro root=/dev/sda2
    #lv 系统改为 root=/dev/mapper/vgqin1-lvroot 或者 root=LABEL=/
    #:r! ls /boot/vmlinuz-2.6.32-71.el6.x86_64
    initrd /initramfs-2.6.32-71.e16.x86_64.img
    #:r! ls /boot/initramfs-2.6.32-71.e16.x86_64.img
    #可尝试写错,调试 grub

    恢复 init
    rpm -qf /etc/inittab
    rpm -qf /etc/rc.d/rc.sysinit
    rpm -qf /etc/rc.d/rc.local
    mount /dev/cdrom /mnt/cdrom
    rpm -ivh /mnt/cdrom/Packagers/initscripts-9.03.17-1.el6.x86_64.rpm --force
    两次 exit 退出到图形界面选择 reboot Reboot
    重启后系统自动执行 selinux relabel,几分钟后自动重启,至此,系统修复完成。
    wzhpro
        7
    wzhpro  
    OP
       2019-06-19 18:17:02 +08:00
    #ls
    -bash: ls: command not found

    #reboot
    -bash: reboot: command not found

    #init 0
    -bash: init: command not found
    Norie
        8
    Norie  
       2019-06-19 18:31:06 +08:00 via Android
    云应该有快照?
    Jirajine
        9
    Jirajine  
       2019-06-19 18:41:01 +08:00
    去 Linux 社区提 issue,把 rm 的 --no-preserve-root 参数去掉吧。直接就不允许对 / 进行操作。(或者在 -r, -f 的条件下不允许),我实在是想不通有什么情况下真正需要 rm -rf / , 如果是 chroot 之类的环境那就多麻烦一步吧,把这个禁掉彻底杜绝这样到事情发生。
    Maboroshii
        10
    Maboroshii  
       2019-06-19 18:43:47 +08:00
    已经 rm / 了, 你是咋知道还有 alias 的。。。
    jdhao
        11
    jdhao  
       2019-06-19 18:49:51 +08:00 via Android
    自己的电脑 √
    公司的服务器 ❌
    用 root 用户进行操作,这不是作大死吗
    wzhpro
        12
    wzhpro  
    OP
       2019-06-19 19:06:49 +08:00
    @Maboroshii 看了别的服务器也有...
    PureWhiteWu
        13
    PureWhiteWu  
       2019-06-19 19:09:52 +08:00
    如果不是云,如果没有备份。
    找律师吧,没任何办法。
    除非你们公司愿意出钱去恢复数据。
    falcon05
        14
    falcon05  
       2019-06-19 19:15:24 +08:00 via iPhone
    如果是 ext3 或者 ext4 的文件系统,可以关机,把磁盘挂到另外一台服务器。使用 extundelete 恢复
    momocraft
        15
    momocraft  
       2019-06-19 19:21:57 +08:00
    加个参数就想避免用户犯傻是不现实的

    这是人生的一课
    love
        16
    love  
       2019-06-19 20:41:41 +08:00
    @wzhpro 真有 2b 加--no-preserve-root 在 alias ?这锅当然是他背了
    mengyaoss77
        17
    mengyaoss77  
       2019-06-19 20:58:32 +08:00 via Android
    @love 感觉是恶意行为了
    Akiyu
        18
    Akiyu  
       2019-06-19 21:03:05 +08:00
    @wzhpro
    查了一下 --no-preserve-root 的含义:

    `--no-preserve-root'
    Do not treat `/' specially when removing recursively. This option
    is not recommended unless you really want to remove all the files
    on your computer.

    ... 对不起, 我没忍住, 哈哈哈哈哈哈
    mayx
        19
    mayx  
       2019-06-19 21:13:11 +08:00 via Android   ❤️ 1
    我决定启动一台 Linux 服务器,然后以 root 用户执行“ rm – rf /”命令,然后观察下哪些文件或者指令会幸存下来。结果是什么也没少!因此你必须增加 — no-preserce-root 再试一遍:# rm -rf --no-preserve-root /

    当你按下“ Enter ”时,一些重要的工具,比如 /bin/ls

    /bin/cat

    /bin/chmod

    /usr/bin/file

    将会应声消失!但是你当前的 SSH 连接以及 bash 终端都还在,这表明所有 bash 相关的内建指令都没有受影响,比如 echo。

    成为 Bash 达人 root@rmrf:/# ls

    -bash: /bin/ls: No such file or directory

    执行以上命令,发现已没有 ls 可用,但是 echo 和 fileglobs 还在。利用这些“幸存者”们,我们可以做点什么呢? root@rmrf:/# echo *

    dev proc run sys

    # echo /dev/pts/*

    /dev/pts/0 /dev/pts/3 /dev/pts/ptmx

    注意!/dev,/proc,/run,/sys 还在,我们一定要保存好它们。如果有了 ls 指令,那么对目录下内容的读取操作将会更加简单。root@rmrf:/# for ii in /dev/pts/*; do echo $ii; done

    /dev/pts/0

    /dev/pts/3

    /dev/pts/ptmx

    许多 Reddit 用户指出,printf 仍是可用的。CAMH-说:printf 会将参数依次格式化到输出字符串中去。root@rmrf:/# ls() { printf '%s\n' ${1:+${1%/}/}*; }

    既然在 bash 下可以定义函数,那么我们可以自建一个 ls 工具,虽然功能还不是很完善。root@rmrf:/# ls() { printf '%s\n' ${1:+${1%/}/}*; }

    -bash: syntax error near unexpected token `('

    不对啊,这种操作应该完全合法才对,难道 ls 已经被映射,或者它是其他命令的别名? root@rmrf:/# type ls</code>

    ls is aliased to `ls --color=auto'</code>

    原来如此,我们上面的指令被扩展成了 ls--color=auto () { printf '%s\n' ${1:+${1%/}/}*; }。那么,我们可以先使用 unalias 指令,去掉 ls 与 ls — color 的关联。root@rmrf:/# ls () { for ii in $1/*; do echo $ii; done }

    root@rmrf:/# ls

    /dev

    /proc

    /run

    /sys

    root@rmrf:/# ls /dev

    /dev/pts

    把函数存储到 utils.sh 文件 root@rmrf:/# echo 'ls () { for ii in $1/*; do echo $ii; done }' >> utils.sh

    root@rmrf:/# source utils.sh

    cat 命令怎么样实现呢?借助 read ! read 是幸存者之一,使用 read 结合管道和重定向,一个基本的 cat 就基本成型了! root@rmrf:/# (while read line; do echo "$line"; done) < utils.sh

    ls () { for ii in $1/*; do echo $ii; done }

    结合上述通过“幸存者”逐渐恢复一些指令的方法,以及 echo 可以写入任意多字节的特性,我们可以重新构建出 linux 的工具系统,并可以通过 curl 或者 wget 直接获得我们想要的二进制文件。首先,参照 echoed by others,获取 busybox。Busybox 是嵌入式 Linux 的瑞士军刀,内嵌 wget,dd,tar 等许多工具。Eusebeîa 详细介绍了如何获得一个 busybox 的 escaped 版本,我在这里就不多做赘述了。

    但是,还有一个问题。

    即使我们 echo 了整个二进制文件需要的所有字节,这些二进制文件仍无法执行。没法启动 busybox !针对这个问题,早期的解决方法是找到一些可执行的程序,然后用 echo 覆盖它们。我们对 /usr 和 /bin 下的文件进行了诸如此类的改造,但这确实稍显复杂。

    可以利用 shell 通配符和 bash 筛选出带有可执行位组的文件,记住要把目录排除在外。executable () { if [[ ( ! -d $1 ) && -x $1 ]] ; then echo "$1"; fi }

    找到了可执行文件! root@rmrf:/# for ii in /*; do executable $ii; done

    root@rmrf:/# for ii in /*/*; do executable $ii; done

    root@rmrf:/# for ii in /*/*/*; do executable $ii; done

    /proc/1107/exe

    /proc/1136/exe

    /proc/1149/exe

    /proc/1179/exe

    /proc/1215/exe

    /proc/1217/exe

    /proc/1220/exe

    /proc/1221/exe

    /proc/1223/exe

    /proc/1248/exe

    /proc/1277/exe

    /proc/1468/exe

    /proc/1478/exe

    /proc/1625/exe

    /proc/1644/exe

    /proc/1/exe

    /proc/374/exe

    /proc/378/exe

    /proc/471/exe

    /proc/616/exe

    /proc/657/exe

    /proc/self/exe

    太好了!但是别急,这些只是软链接到可执行文件的链接文件,原文件在磁盘上已经不存在了。那么现在我们要重新改写 executable (),排除这些软链接。root@rmrf:/# executable () { if [[ ( ! -d $1 ) && ( ! -h $1 ) && -x $1 ]] ; then echo "$1"; fi }

    root@rmrf:/# for ii in /*/*/*; do executable $ii; done

    root@rmrf:/# for ii in /*/*/*/*; do executable $ii; done

    root@rmrf:/# for ii in /*/*/*/*/*; do executable $ii; done

    root@rmrf:/# for ii in /*/*/*/*/*/*; do executable $ii; done

    噩耗,什么输出也没有。或许可以利用内核层面的东西,毕竟,我们可以使用 Magic Sysrq 组合键重启 busybox。root@rmrf:/# echo 1 > /proc/sys/kernel/sysrq

    root@rmrf:/# echo "b" > /proc/sysrq-trigger

    我们现在已经骑虎难下了,周五的时候,我会继续研究下去。感谢关注,如果您发现了什么获取可执行位组的好方法,请及时知会我。

    UPDATE: Reddi 用户 throw_away5046 提出了一种解决方法:a full solution to this。

    获取一个可信任的、适用于本机架构的 box$ mkdir $(xxd -p -l 16 /dev/urandom)

    $ cd $_

    $ apt-get download busybox-static

    $ dpkg -x *.deb .

    $ alias encode='{ tr -d \\n | sed "s#\\(..\\)#\\\\x\\1#g"; echo; }'

    $ alias upload='{ xxd -p | encode | nc -q0 -lp 5050; }'

    $ upload < bin/busybox

    执行 rm – rf 之后的机器# cd /

    # alias decode='while read -ru9 line; do printf "$line"; done'

    # alias download='( exec 9<>/dev/tcp/{IP OF NON HOSED BOX}/5050; decode )'

    # download > busybox

    创建一个可以改变 busybox 访问权限的对象$ cat > setx.c <<EOF

    extern int chmod(const char *pathname, unsigned int mode);

    int entry(void) {

    return !! chmod("busybox", 0700);

    }

    char *desc[] = {0};

    struct quick_hack {

    char *name; int (*fn)(void); int on;

    char **long_doc, *short_doc, *other;

    } setx_struct = { "setx", entry, 1, desc, "chmod 0700 busybox", 0 };

    EOF

    $ gcc -Wall -Wextra -pedantic -nostdlib -Os -fpic -shared setx.c -o setx

    $ upload < setx

    以内建工具的方式使能 setx,使 busybox 可执行# ( download > setx; enable -f ./setx setx; setx; )

    # /busybox mkdir .bin

    # /busybox --install -s .bin

    # PATH=/.bin
    ryd994
        20
    ryd994  
       2019-06-20 12:05:31 +08:00 via Android
    没有特别好的办法,如果还有在运行的服务,那打开中的文件还挂在 fd 上可以拷到其他盘去
    但是其他文件就已经被删了
    建议立刻拔电源保存现场,把硬盘挂到其他机器上求援。不要正常关机,且不说还能不能运行关机任务,过程中各种写入只会扩大损害
    ext4 我记得有 undelete 的工具,你可以找找看。操作前全盘 dd 镜像,在镜像上操作

    @DANG 你这样只是恢复了 /boot 以及一些系统配置文件而已。数据没有,其他配置文件也没有,还不如直接擦盘重装。而且这个过程中的写入会彻底毁灭现场。
    我还从来没有见过数据恢复不先做镜像的。
    echotpq
        21
    echotpq  
       2019-06-20 14:17:27 +08:00
    @frozenway 能加下我的 QQ 吗?腰 5780 溜溜溜二 8 有事求教,谢谢了
    frozenway
        22
    frozenway  
       2019-06-20 14:43:02 +08:00
    @echotpq 我是菜鸟,不值得阁下请教,哈哈
    echotpq
        23
    echotpq  
       2019-06-20 15:42:44 +08:00 via Android
    @frozenway 是关于微信解封的事
    frozenway
        24
    frozenway  
       2019-06-20 16:03:43 +08:00
    @echotpq 我不会哦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:49 · PVG 03:49 · LAX 11:49 · JFK 14:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.