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

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

  •  
  •   uuair · 6 天前 · 7968 次点击

    我的磁盘空间不够了,之前分区的时候没搞好,根目录给了 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 条附言  ·  6 天前
    不是云服务,就是一台 GEN7 的服务器,我没有富裕的硬盘备份,3.2T 的资料,我把 docker 一个一个的备份成 tar 文件了。。。有一个目录不知道为什么,变成了用户 911 的,组也是 911 ,但我没这个用户。。。
    第 2 条附言  ·  5 天前
    我无法 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 拷贝下来。
    49 条回复    2024-12-07 13:08:14 +08:00
    FoxRiverMan
        1
    FoxRiverMan  
       6 天前   ❤️ 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  
       6 天前   ❤️ 1
    这什么都不用干吧, 就算都是你的, root 用户照样能读写
    Exxfire
        3
    Exxfire  
       6 天前
    不懂,直接权限还原回去会遇到什么问题?
    uuair
        4
    uuair  
    OP
       6 天前
    @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  
       6 天前   ❤️ 3
    进 rescue ,mount 后,把别的同版本 OS 的关键文件都 rsync 过去。
    IvanLi127
        6
    IvanLi127  
       6 天前
    没办法切换到 root 用户?实在不行重启到单用户模式进去改应该可以。
    orioleq
        7
    orioleq  
       6 天前 via iPhone
    记得我知乎看过一个热帖就是根目录权限被改掉了,好像挺难恢复的
    uuair
        8
    uuair  
    OP
       6 天前
    我找不到第二台电脑做这事,而且一个一个的改看起来也不现实啊。。。能不能覆盖安装一下?保留/home 不动,直接安装,是不是就可以了?
    Belmode
        9
    Belmode  
       6 天前   ❤️ 4
    少侠好武功
    kneo
        10
    kneo  
       6 天前 via Android
    用你自己的用户把 sudo.conf 改成 root 不行?
    NevadaLi
        11
    NevadaLi  
       6 天前   ❤️ 1
    找个 liveCD 进去,把 docker tar 包放 home ,home 里面的文件应该是同一用户的,-R 直接改 owner 就行。

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

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

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

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

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

    拿个 u 盘 livecd 改回来呗
    uuair
        33
    uuair  
    OP
       6 天前
    @jqtmviyu #32 怎么改回来啊??所有的目录都是我自己了,手动我不知道怎么改啊
    inframe
        34
    inframe  
       6 天前
    全部改成 777 ,文件拖出来,重装系统
    zuotun
        35
    zuotun  
       6 天前
    还好只是 chown ,如果是 chmod -R 那就惨了得对着具体文件恢复,你这样找个正常的相同系统直接对着恢复就行。恢复必须要 liveCD 环境,随便找个闲置的存储设备插进去启动就行,另外 sudo 有问题不代表就不能用了,这只是一个软件包没有也能切到 root 。
    uuair
        36
    uuair  
    OP
       6 天前
    @kk2syc #15 这个我做了,开了两个 ssh 进去,但就是不成。。。pkexec 哪里始终无法运行。
    cybort
        37
    cybort  
       6 天前 via Android
    如果所有者都是你,那不需要 sudo 啊,直接 chown 改
    COW
        38
    COW  
       6 天前 via Android
    #4 根据错误提示,先用 su 拿到 root ,然后用 chmod 4755 和 chown 把这个文件改一下,把 sudo 问题解决了先。
    feedcode
        39
    feedcode  
       6 天前
    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
       5 天前
    @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
       5 天前
    @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  
       5 天前
    su 能进 root 吗 能进去就改回去看看
    改的方式 搜索下别人导出来的权限备份(getfacl 导出来的文件,主要是常见的/bin,/usr/bin,/sbin 这几个目录) 然后改回去

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

    还不行就把盘拔出来 找个网吧 整个 linux 虚拟机挂载以后用 setfacl 的方式修复下 然后虚拟机试下
    liuliancao
        43
    liuliancao  
       5 天前
    需要 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
       5 天前
    @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  
       5 天前
    @uuair sudo 肯定用不了了 我说的是 su
    zlkent
        46
    zlkent  
       5 天前
    问下 gpt 吧,这里不好贴 gpt 的答案
    uuair
        47
    uuair  
    OP
       5 天前
    @liuliancao #45 不成的,都没有 root 权限了
    su: Authentication failure

    我准备 live cd 了。
    yc8332
        48
    yc8332  
       5 天前
    用 root 登录看看行不行,不行就挂到另外的系统上搞,只要数据没删都能搞回来。
    julyclyde
        49
    julyclyde  
       4 天前
    老老实实重装吧
    su/sudo 丢失 setuid 之后,在 ubuntu 这种默认没开 root 用户的系统上你基本上没办法获得 root 权限
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   916 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:44 · PVG 06:44 · LAX 14:44 · JFK 17:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.