如何在“sudo chmod / 777”之后修复/恢复 ubuntu 10.04

如何在“sudo chmod / 777”之后修复/恢复 ubuntu 10.04

也可以看看:
为什么“chmod -R 777 /”具有破坏性?

/我通过执行在根目录上递归更改了文件权限sudo chmod -R / 777,之后我的系统无法启动(我收到很多“权限被拒绝”错误)。

请帮忙。

答案1

您的选择毫无意义。请保存所需数据,然后重新安装操作系统。

答案2

我知道 dpkg 将权限存储在数据库中,并且我发现了以下脚本谷歌这可能会有帮助。

编辑:我实际上快速浏览了一下脚本,它看起来好像缺少一些从 PERMS 到 MODE 的魔法,例如 dpkg -c 给出例如“-rw-r--r--”但你想要 0644,我现在正在工作所以我不确定我现在是否有时间进行转换但如果没有其他人加入添加这一点,我可能会稍后再回来。

有一个脚本这里看起来很有趣

#!/bin/bash
# Restores file permissions for all files on a debian system for which .deb
# packages exist. 
#
# Author: Larry Kagan <me at larrykagan dot com>
# Since 2007-02-20

ARCHIVE_DIR=/var/cache/apt/archives/
PACKAGES=`ls $ARCHIVE_DIR`
cd /

function changePerms()
{
    CHOWN="/bin/chown"
    CHMOD="/bin/chmod"
    PERMS=$1
    OWN=`echo $2 | /usr/bin/tr '/' ':'`
    PATHNAME=$3

    echo -e "$CHOWN $OWN $PATHNAME"
    #`$CHOWN $OWN $PATHNAME`
    #`$CHMOD $MODE $PATHNAME`

}

for PACKAGE in $PACKAGES;
do
    echo -e "Getting information for $PACKAGE\n"
    FILES=`/usr/bin/dpkg -c "${ARCHIVE_DIR}${PACKAGE}"`

    for FILE in "$FILES";
    do
        FILE_DETAILS=`echo "$FILE" | awk '{print $1"\t"$2"\t"$6}'`
        changePerms $FILE_DETAILS
    done
done

答案3

这是可能的从如此混乱的局面中恢复过来,无需重新安装系统。更确切地说,如果您有双启动系统,则可以通过 USB 密钥或 Virutal Box(或类似软件)运行全新系统。

我再次运行了同样的问题(我编写的脚本中存在一些错误)并解决了它,但您需要寻求专家的帮助。要非常小心!

首先,我的情况更容易解决,因为我有一个双启动系统(ubuntu 和我旧的 fedora 安装),但使用 USB 密钥(或者可能是 CD/DVD)运行系统应该可以做同样的事情。

MPOINT=/安装/ubuntu

首先,我像这样挂载我的文件系统(不要忘记创建挂载点): mount /dev/ubuntu/root $MPOINT mount /dev/ubuntu/home $MPOINT/home

然后我运行以下命令(我的问题仅出现在几个关键目录中)将权限从正在运行的系统复制到混乱的系统(事实上,就我而言,我在 fedora 下的 Virtual Box 中安装了一个 ubuntu 系统并在那里获得了权限):

查找 /etc /usr /bin -exec stat --format "chmod %a ${MPOINT}%n" {} \; > /tmp/restoreperms.sh

然后我运行了 restoreperms.sh 脚本。

我能够再次在 ubuntu 上启动了。

restoreperms.sh 的内容如下:

(...)
chmod 755 /mount/ubuntu//etc/ppp
chmod 755 /mount/ubuntu//etc/ppp/ipv6-up
chmod 2750 /mount/ubuntu//etc/ppp/peers
chmod 640 /mount/ubuntu//etc/ppp/peers/provider
chmod 755 /mount/ubuntu//etc/ppp/ipv6-up.d
chmod 777 /mount/ubuntu//etc/ppp/resolv.conf
(...)

我没有测试过,但它一定也适用于所有者和所有者组。例如:

查找 /etc /usr /bin -exec stat --format 'chown %U:%G ${MPOINT}%n' {} \; > /tmp/restoreperms.sh^

(...)
chown root:root /mount/ubuntu//etc/obex-data-server/imaging_capabilities.xml
chown root:root /mount/ubuntu//etc/obex-data-server/capability.xml
chown root:dip /mount/ubuntu//etc/ppp
chown root:root /mount/ubuntu//etc/ppp/ipv6-up
chown root:dip /mount/ubuntu//etc/ppp/peers
chown root:dip /mount/ubuntu//etc/ppp/peers/provider
chown root:root /mount/ubuntu//etc/ppp/ipv6-up.d
chown root:root /mount/ubuntu//etc/ppp/resolv.conf
(...)

当然,您必须注意,两个系统上的 UID 和 GID 是相同的,但对于系统相关的用户和组来说,这应该不是问题。

韋克:

对此,重要的是保持安装盘与您正在使用的版本同步,或者至少与当前的 ubuntu 版本兼容。现在,我在 cronjob 中安装了这些命令,每天(可能是几周)运行,以保存这些信息。下次解决问题会更容易,但当然,既然我现在有了这个,就不会再发生这种情况了。;-) 类似这样:

0 12 * * * /usr/bin/find / -exec /usr/bin/stat --format="/bin/chmod %a %n" {} \; |/bin/bzip2 -c > /tmp/restore_chmod.$(/bin/date +%w).sh.bz2

0 13 * * * /usr/bin/find / -exec /usr/bin/stat --format="/bin/chown %U:%G %n" {} \; |/bin/bzip2 -c > /tmp/restore_chown.$(/bin/date +%w).sh.bz2

编辑:为了支持链接,组合命令是:

/usr/bin/find / -exec /usr/bin/stat --format="[ ! -L {} ] && /bin/chmod %a %n" {}

答案4

我修改了上面的脚本,它看起来像这样:

#!/bin/bash
# Restores file permissions for all files on a debian system for which .deb
# packages exist. 
#
# Author: Larry Kagan <me at larrykagan dot com>
# Since 2007-02-20

ARCHIVE_DIR=/var/cache/apt/archives/
PACKAGES=`ls $ARCHIVE_DIR`
cd /

function changePerms() {
    CHOWN="/bin/chown"
    CHMOD="/bin/chmod"
    PERMS=`echo $1 | sed -e 's/--x/1/g' -e 's/-w-/2/g' -e 's/-wx/3/g' -e 's/r--/4/g'  -e 's/r-x/5/g' -e 's/rw-/6/g' -e 's/rwx/7/g' -e 's/---/0/g'`
    PERMS=`echo ${PERMS:1}`
    OWN=`echo $2 | /usr/bin/tr '/' '.'`
    PATHNAME=$3
    PATHNAME=`echo ${PATHNAME:1}`

#    echo -e "CHMOD: $CHMOD $PERMS $PATHNAME"    

#    result=`$CHOWN $OWN $PATHNAME`
#    if [ $? -ne 0 ]; then
#   echo -e $result
#        exit 123;
#    fi

    echo -e "CHOWN: $CHMOD $PERMS $PATHNAME"
    result=`$CHMOD $PERMS $PATHNAME`
    if [ $? -ne 0 ]; then
    echo -e $result
    fi
}

for PACKAGE in $PACKAGES;
do
    if [ -d $PACKAGE ]; then
    continue;
    fi
    echo -e "Getting information for $PACKAGE\n"
    FILES=`/usr/bin/dpkg -c "${ARCHIVE_DIR}${PACKAGE}"`

    for FILE in "$FILES";
    do
        #FILE_DETAILS=`echo "$FILE" | awk '{print $1"\t"$2"\t"$6}'`
    echo "$FILE" | awk '{print $1"\t"$2"\t"$6}' | while read line;
        do
            changePerms $line
        done
        #changePerms $FILE_DETAILS
    done
done

相关内容