不小心 rm -rf /了,还没重启,怎么办 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wzhpro
V2EX    CentOS

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

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

    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/inttab
    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
    如果不是云,如果没有备份。
    找律师吧,没任何办法。
    除非你们公司愿意出钱去恢复数据。
    GG668v26Fd55CP5W
        14
    GG668v26Fd55CP5W  
       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 等许多工具。Eusebea 详细介绍了如何获得一个 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     Solana     5209 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 07:43 PVG 15:43 LAX 23:43 JFK 02:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86