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

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

  •  
  •   wzhpro · 177 天前 · 3387 次点击
    这是一个创建于 177 天前的主题,其中的信息可能已经有所发展或是发生改变。

    centos 7.4

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

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

    先谢过Image

    24 回复  |  直到 2019-06-20 16:03:43 +08:00
        1
    frozenway   177 天前
    用快照恢复一下就可以了
        2
    walkman660   177 天前
    模糊记得 centos 7 不会真正运行 rm -rf /,会又提示
        3
    wzhpro   177 天前   ♥ 9
    @walkman660 不知道哪个 2B 在 alias 加了--no-preserve-root
        4
    pkookp8   177 天前 via Android
    @wzhpro 这么严重的问题,我不会笑的,除非

    没忍住
    哈哈哈哈哈,真的是 2b
        5
    flytrap   177 天前
    关机,跑路
        6
    DANG   177 天前   ♥ 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,几分钟后自动重启,至此,系统修复完成。
        7
    wzhpro   177 天前
    #ls
    -bash: ls: command not found

    #reboot
    -bash: reboot: command not found

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

    这是人生的一课
        16
    love   177 天前
    @wzhpro 真有 2b 加--no-preserve-root 在 alias ?这锅当然是他背了
        17
    mengyaoss77   177 天前 via Android
    @love 感觉是恶意行为了
        18
    Akiyu   177 天前
    @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.

    ... 对不起, 我没忍住, 哈哈哈哈哈哈
        19
    mayx   177 天前 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 达人 [email protected]:/# ls

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

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

    dev proc run sys

    # echo /dev/pts/*

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

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

    /dev/pts/0

    /dev/pts/3

    /dev/pts/ptmx

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

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

    -bash: syntax error near unexpected token `('

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

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

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

    [email protected]:/# ls

    /dev

    /proc

    /run

    /sys

    [email protected]:/# ls /dev

    /dev/pts

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

    [email protected]:/# source utils.sh

    cat 命令怎么样实现呢?借助 read ! read 是幸存者之一,使用 read 结合管道和重定向,一个基本的 cat 就基本成型了! [email protected]:/# (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 }

    找到了可执行文件! [email protected]:/# for ii in /*; do executable $ii; done

    [email protected]:/# for ii in /*/*; do executable $ii; done

    [email protected]:/# 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 (),排除这些软链接。[email protected]:/# executable () { if [[ ( ! -d $1 ) && ( ! -h $1 ) && -x $1 ]] ; then echo "$1"; fi }

    [email protected]:/# for ii in /*/*/*; do executable $ii; done

    [email protected]:/# for ii in /*/*/*/*; do executable $ii; done

    [email protected]:/# for ii in /*/*/*/*/*; do executable $ii; done

    [email protected]:/# for ii in /*/*/*/*/*/*; do executable $ii; done

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

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

    @DANG 你这样只是恢复了 /boot 以及一些系统配置文件而已。数据没有,其他配置文件也没有,还不如直接擦盘重装。而且这个过程中的写入会彻底毁灭现场。
    我还从来没有见过数据恢复不先做镜像的。
        21
    echotpq   176 天前
    @frozenway 能加下我的 QQ 吗?腰 5780 溜溜溜二 8 有事求教,谢谢了
        22
    frozenway   176 天前
    @echotpq 我是菜鸟,不值得阁下请教,哈哈
        23
    echotpq   176 天前 via Android
    @frozenway 是关于微信解封的事
        24
    frozenway   176 天前
    @echotpq 我不会哦
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2415 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 03:09 · PVG 11:09 · LAX 19:09 · JFK 22:09
    ♥ Do have faith in what you're doing.