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

闯了大祸,根目录权限变成我自己了。

  •  
  •   uuair · 13 天前 · 8109 次点击

    我的磁盘空间不够了,之前分区的时候没搞好,根目录给了 1.7T 一直闲置,为了下载一个 700 多 G 的文件,我简单的 mount 到了一个下载目录下,transmission 下载的时候报错说权限问题,我直接 chown -R uuair:www-data 了,我还纳闷,一个空目录,怎么会卡住了。。。结果 sudo 的时候发现错误,然后,./目录下大部分文件都不是 root 的了,尤其是/etc 下,所有的都是我了。

    好了,现在怎么办?

    第一:/home文件夹下有 3.2T 的文件,我没有其他的硬盘可以备份。

    第二:我运行了 12 个 docker ,其中有几个配置了很久,可能我自己都记不清了,这部分怎么保留?

    我使用了docker commit -p 然后 docker save -o ~/container-backup.tar container-backup的方法保存成 tar 文件了,但现在拷贝不出来

    第 1 条附言  ·  12 天前
    不是云服务,就是一台 GEN7 的服务器,我没有富裕的硬盘备份,3.2T 的资料,我把 docker 一个一个的备份成 tar 文件了。。。有一个目录不知道为什么,变成了用户 911 的,组也是 911 ,但我没这个用户。。。
    第 2 条附言  ·  12 天前
    我无法 sudo ,因为/etc 目录不是 root 的了,只要 sudo 就提示:

    sudo: /etc/sudo.conf is owned by uid 1000, should be 0
    sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set


    使用 pkttyagent --process 的方法始终不成:
    pkexec chown root:root /etc/sudoer
    pkexec must be setuid root

    我甚至都无法 mount 一个移动硬盘进来了
    uuair@:~$ mount /dev/sde1 ~/mydisk
    mount: /home/uuair/mydisk: must be superuser to use mount.
    dmesg(1) may have more information after failed mount system call.
    mount: (hint) your fstab has been modified, but systemd still uses
    the old version; use 'systemctl daemon-reload' to reload.

    现在我在用 sftp ,先把 docker 拷贝下来。
    50 条回复    2024-12-14 12:49:22 +08:00
    FoxRiverMan
        1
    FoxRiverMan  
       13 天前   ❤️ 1
    先恢复关键系统目录的所有权吧
    sudo chown -R root:root /etc
    sudo chown root:root /bin
    sudo chown root:root /lib
    sudo chown root:root /usr
    sudo chown -R root:root /usr/bin
    sudo chown -R root:root /usr/lib
    bthulu
        2
    bthulu  
       13 天前   ❤️ 1
    这什么都不用干吧, 就算都是你的, root 用户照样能读写
    Exxfire
        3
    Exxfire  
       13 天前
    不懂,直接权限还原回去会遇到什么问题?
    uuair
        4
    uuair  
    OP
       13 天前
    @FoxRiverMan #1
    @bthulu #2
    不成啊,sudo 就提示错误了。虽然我有 root 权限,但我也需要 su 才可以。。
    sudo: /etc/sudo.conf is owned by uid 1000, should be 0
    sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set


    @Exxfire #3 还原权限怎么操作??我现在./99%的文件都不是 root 的了,我没法 sudo 啊。
    adrianzhang
        5
    adrianzhang  
       13 天前   ❤️ 3
    进 rescue ,mount 后,把别的同版本 OS 的关键文件都 rsync 过去。
    IvanLi127
        6
    IvanLi127  
       13 天前
    没办法切换到 root 用户?实在不行重启到单用户模式进去改应该可以。
    orioleq
        7
    orioleq  
       13 天前 via iPhone
    记得我知乎看过一个热帖就是根目录权限被改掉了,好像挺难恢复的
    uuair
        8
    uuair  
    OP
       13 天前
    我找不到第二台电脑做这事,而且一个一个的改看起来也不现实啊。。。能不能覆盖安装一下?保留/home 不动,直接安装,是不是就可以了?
    Belmode
        9
    Belmode  
       13 天前   ❤️ 4
    少侠好武功
    kneo
        10
    kneo  
       13 天前 via Android
    用你自己的用户把 sudo.conf 改成 root 不行?
    NevadaLi
        11
    NevadaLi  
       13 天前   ❤️ 1
    找个 liveCD 进去,把 docker tar 包放 home ,home 里面的文件应该是同一用户的,-R 直接改 owner 就行。

    对于 docker 的配置,在/var/lib/docker/containers/*/config.v2.json 可以拿到相关信息。

    至于系统本身是没救了,尤其是 etc ,不同文件对应不同 owner 。
    xuanbg
        12
    xuanbg  
       13 天前   ❤️ 1
    所以我直接用 root
    NevadaLi
        13
    NevadaLi  
       13 天前
    如果 home 是单独的分区,重装时候不选择格式化 home 就行;如果不是,那就有些麻烦,怎么操作都有丢数据的风险,最好还是找个盘备份出来再动。
    RobinHuuu
        14
    RobinHuuu  
       13 天前 via Android
    其实还可以救。用 livecd 或者恢复环境进去,chroot 方式重新安装 sudo 以及 su 的包。这样保证你能进正常系统用 sudo 和 su ,其他有权限问题的可执行文件用这种方式解决。普通文件有 sudo 后改下权限就行了,就是有点麻烦。
    zgcwkj
        16
    zgcwkj  
       13 天前
    用 dd 命令,把 home 打包一下。重装再还原(也许行
    hukei
        17
    hukei  
       13 天前
    少侠好武功
    encro
        18
    encro  
       13 天前
    @uuair

    看有没有备份,无解,基本很多软件都会开自己的用户。
    fenglangjuxu
        19
    fenglangjuxu  
       13 天前
    如果是云机器 可以申请 加硬盘

    如果不能加 想办法 通过网络 把文件传出去
    shylockhg
        20
    shylockhg  
       13 天前
    可以备份回滚
    挺多 linux 发行版支持,比如 opensuse 的 snapper
    Exxfire
        21
    Exxfire  
       13 天前
    @uuair 如楼上所说,尝试进单用户模式,操作一下。
    Geon97
        22
    Geon97  
       13 天前   ❤️ 2
    chown -R 的威力如同 rm -rf
    iyiluo
        23
    iyiluo  
       13 天前   ❤️ 1
    先别重启,有个 docker-autocompose 应用,能把你正在跑的容器转成 docker-comopse.yml ,可以备份当前容器的各种配置,不过你的系统已经烂了,试试能不能把 autocompose 镜像拉下来,然后逐个备份容器生成 yml 文件
    guo4224
        24
    guo4224  
       13 天前
    找个虚拟机,备份一下权限,然后 livecd 进去恢复权限试试?
    konakona
        25
    konakona  
       12 天前
    少侠好功力。
    你没有进行磁盘快照备份吗?
    下次记得千万别飘了,少个.区别太大代价太承重 2333

    权限乱了以后其实更难恢复,听上去是 centOS ,更严,2333
    elechi
        26
    elechi  
       12 天前
    拿个 u 盘做个 livecd 启动,然后把磁盘挂载到 livecd 系统中,改文件权限
    smallparking
        27
    smallparking  
       12 天前 via Android
    u 盘启动
    如果不会就摇人吧
    la2la
        28
    la2la  
       12 天前
    太麻烦了
    如果是云服务的话,临时租个内网服务器,在挂个 oss ,备份好现有数据后,直接重装系统和服务
    如果物理服务器,就借个电脑搞一下,几 T 数据用不了多少时间
    life90
        29
    life90  
       12 天前
    我倒有个傻瓜点的方法。不嫌麻烦的话。
    1 ,首先解决 sudo 。或者以 root 用户登录。这是必须要做的。
    2 ,安装同版本同类型 Linux 发行版。参照权限重新恢复。或者这个安装好的同类型版本 Linux 的权限每个文件 acl 用 shell 打印出来导出成文件。
    3 ,在旧系统,以同样脚本恢复回去。其实这样做完肯定还有问题,只能自己慢慢查日志去解决了。
    如果觉得这样解决时间太长,重新安装配置其实是最优选择。
    0x5c0f
        30
    0x5c0f  
       12 天前
    一般系统提供的包管理软件,以 rpm 为例
    --setperms set permissions of files in a package
    --setugids set user/group ownership of files in a
    这个是可以修复权限的,可以去试试
    yyyb
        31
    yyyb  
       12 天前
    没 rm -rf 就不叫事儿
    jqtmviyu
        32
    jqtmviyu  
       12 天前
    本地设备?

    拿个 u 盘 livecd 改回来呗
    uuair
        33
    uuair  
    OP
       12 天前
    @jqtmviyu #32 怎么改回来啊??所有的目录都是我自己了,手动我不知道怎么改啊
    inframe
        34
    inframe  
       12 天前
    全部改成 777 ,文件拖出来,重装系统
    zuotun
        35
    zuotun  
       12 天前
    还好只是 chown ,如果是 chmod -R 那就惨了得对着具体文件恢复,你这样找个正常的相同系统直接对着恢复就行。恢复必须要 liveCD 环境,随便找个闲置的存储设备插进去启动就行,另外 sudo 有问题不代表就不能用了,这只是一个软件包没有也能切到 root 。
    uuair
        36
    uuair  
    OP
       12 天前
    @kk2syc #15 这个我做了,开了两个 ssh 进去,但就是不成。。。pkexec 哪里始终无法运行。
    cybort
        37
    cybort  
       12 天前 via Android
    如果所有者都是你,那不需要 sudo 啊,直接 chown 改
    COW
        38
    COW  
       12 天前 via Android
    #4 根据错误提示,先用 su 拿到 root ,然后用 chmod 4755 和 chown 把这个文件改一下,把 sudo 问题解决了先。
    feedcode
        39
    feedcode  
       12 天前
    1. 把你自己的 group 加到 admin rules ,以 ubuntu 为例, 只有 sudo/admin group 才行
    cat /usr/share/polkit-1/rules.d/49-ubuntu-admin.rules
    polkit.addAdminRule(function(action, subject) {
    return ["unix-group:sudo", "unix-group:admin"];
    });

    然后再 pkttyagent -p $(echo $$) |pkexec chown root /path/to/file
    (ctrc+c to abort pkttyagent )

    2. 如果你在 docker 组里
    docker run -it --privileged --name fixperm -v /:/host busybox
    然后编辑 /host/path/to/file

    3. 重启时候编辑 Grub menu ,append to kernel command line
    systemd.debug-shell=1
    OR
    init=/bin/sh
    uuair
        40
    uuair  
    OP
       12 天前
    @cybort #37
    uuair@uu-ubu:/etc$ ls -l sudoers
    -r--r----- 1 uuair www-data 1800 1 月 30 2024 sudoers
    chown root:root /etc/sudoers
    chown: changing ownership of '/etc/sudoers': Operation not permitted

    怎么可能。。。。
    uuair
        41
    uuair  
    OP
       12 天前
    @feedcode #39

    ```
    uuair@uu-ubu:/etc$ groups uuair
    uuair : uuair adm cdrom sudo dip plugdev lpadmin lxd sambashare docker
    ```

    我的 group 包括 uuari ,所以`vi /usr/share/polkit-1/rules.d/49-ubuntu-admin.rules`的时候:

    ```
    polkit.addAdminRule(function(action, subject) {
    return ["unix-group:sudo", "unix-group:uuair"];
    ```

    然后 echo $$ 848784
    `pkttyagent --process 848784`

    ```
    uuair@uu-ubu:/etc$ pkexec chown root:root /etc/sudoer
    pkexec must be setuid root
    ```
    问题还是一样的。
    liuliancao
        42
    liuliancao  
       12 天前
    su 能进 root 吗 能进去就改回去看看
    改的方式 搜索下别人导出来的权限备份(getfacl 导出来的文件,主要是常见的/bin,/usr/bin,/sbin 这几个目录) 然后改回去

    如果进不去就插启动 u 盘 进 rescue 修复

    还不行就把盘拔出来 找个网吧 整个 linux 虚拟机挂载以后用 setfacl 的方式修复下 然后虚拟机试下
    liuliancao
        43
    liuliancao  
       12 天前
    需要 sudo 的文件 需要 chmod u+s 你的文件 这个是 sudo 需要的标志位
    ➜ puppetmaster git:(main) ✗ ls -l /usr/bin/pkexec
    -rwsr-xr-x 1 root root 26776 2023 年 2 月 1 日 /usr/bin/pkexec
    ➜ puppetmaster git:(main) ✗ chmod
    ➜ puppetmaster git:(main) ✗ getfacl /usr/bin/pkexec
    getfacl: Removing leading '/' from absolute path names
    # file: usr/bin/pkexec
    # owner: root
    # group: root
    # flags: s--
    user::rwx
    group::r-x
    other::r-x
    uuair
        44
    uuair  
    OP
       12 天前
    @liuliancao #42 我就是没法 sudo 啊。。。因为/etc 目录不是 root 的了,所以只要 sudo 就出现提示:
    sudo: /etc/sudo.conf is owned by uid 1000, should be 0
    sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit s
    liuliancao
        45
    liuliancao  
       12 天前
    @uuair sudo 肯定用不了了 我说的是 su
    zlkent
        46
    zlkent  
       11 天前
    问下 gpt 吧,这里不好贴 gpt 的答案
    uuair
        47
    uuair  
    OP
       11 天前
    @liuliancao #45 不成的,都没有 root 权限了
    su: Authentication failure

    我准备 live cd 了。
    yc8332
        48
    yc8332  
       11 天前
    用 root 登录看看行不行,不行就挂到另外的系统上搞,只要数据没删都能搞回来。
    julyclyde
        49
    julyclyde  
       11 天前
    老老实实重装吧
    su/sudo 丢失 setuid 之后,在 ubuntu 这种默认没开 root 用户的系统上你基本上没办法获得 root 权限
    uuair
        50
    uuair  
    OP
       4 天前
    我现在不记得 root 的用户了,所以 root 登陆不上。
    回复模式变成只读,也就是 rw single init=/bin/bash 修改后,机器黑屏。。。。
    live cd 的 u 盘也无法启动,估计是 U 盘太新了,容量太大不被支持。。。
    好烦啊。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5359 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.