``sudo chmod / 777''之后如何修复/恢复ubuntu 10.04


12

另请参阅:
为什么“ chmod -R 777 /”具有破坏性?

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

请帮忙。


也许您可以使用实时Ubuntu系统。在普通系统上安装已安装的软件包,然后编写脚本以“克隆”它们?这只是一个想法。也许别人可以说这有什么用。
Darokthar 2011年

请仔细执行以下操作:在恢复模式下打开>装入驱动器>打开交互式外壳> cd装入装入的硬盘驱动器(对我来说,它在/ mnt / [目录]中)> chmod -R 755 ./**> #cd ./etc/ SSH / #chmod 600模量644 #chmod ssh_config中#chmod 644 ssh_host_dsa_key.pub #chmod 644 ssh_host_key.pub #chmod 644 ssh_host_rsa_key.pub #chmod 600 ssh_host_dsa_key #chmod 600 ssh_host_key #chmod 600 ssh_host_rsa_key #chmod 640的sshd_config
斯密特帕特尔

我没有足够的声誉在StackExchange中发布答案,但我想为您提供帮助。
史密斯·帕特尔

Answers:


23

您正在寻找失败的原因。保存所需的数据,然后重新安装操作系统。


对。您花费在执行此操作上的时间太疯狂了,并且您永远无法确定自己是否正确。开始清理,从备份中还原数据。
ThatGraemeGuy 2011年

1
这是退后一步并从中学到东西的方法之一。您最重要的区域是主文件夹内容,在中所做的配置更改/etc/var/wwwWeb服务器内容和数据库。拿起另一个硬盘驱动器,将其作为主要驱动器并安装。这样可以将其他驱动器保留为备份,直到可以传输为止。
Fiasco Labs

我做过同样的事情(是的,我知道得更多),并在这里尝试了几种想法,但要使机器恢复到正常状态需要花费数周的时间。而是尝试备份您的数据并重新安装Ubuntu。
MikeHoss 2012年

5

我知道dpkg将权限存储在数据库中,我发现以下脚本Google可能会有所帮助。

编辑:实际上,我快速浏览了一下脚本,看起来好像缺少了一些从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

它也可以处理04555文件吗?
环Ø

4

可以从这样一个混乱的局面回来,而无需重新安装系统。好吧,如果您有双引导系统,则可以通过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相同,但是对于与系统相关的用户和组,这不应该成为问题。

Rk:

重要的是保持安装磁盘与您使用的版本同步,或者至少与当前的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

3

同意blueben,重新安装可能比分析哪个文件/目录需要哪个权限要快。但是,如果不能重新安装,则有一个想法:

  1. 在另一台机器上安装默认的Ubuntu安装
  2. 运行以下命令以获取系统上每个文件/目录的权限: find / | xargs stat -c 'chmod %a "'%n'"' > /tmp/chmod.sh
  3. chmod.sh使用错误的权限将文件复制到计算机
  4. 执行该文件 chmod +x /tmp/chmod.sh && /bin/bash /tmp/chmod.sh
  5. 希望大多数事情都能奏效(我相信并非所有事情都能奏效)

2

ERRATUM以我的用户user100740的身份发布到我的帖子:为了支持链接,组合的命令是:

/usr/bin/find / -exec /usr/bin/stat --format="[ ! -L {} ] && /bin/chmod %a %n" {} \; -exec /usr/bin/stat --format="/bin/chown -h %U:%G %n" {} \; |/bin/bzip2 -c > /tmp/restore_fileperms.$(/bin/date +%w).sh.bz2

2

如果仍然可以启动/usr/sbin/synaptic,则通常可以修复。

按状态对软件包进行排序(顶部已安装的软件包),选择所有已安装的软件包,右键单击并选择重新安装。然后应用,这将提示dpkg重新提取这些软件包的所有文件。(您将丢失所有本地修改(但不会丢失配置文件更改)。)

它可能无法解决所有问题。
另一件事是,如果您进入/var/cache,可以致电dpkg -x <package name> /每个已安装的软件包,然后致电dpkg --reconfigure -a。另外,如果您使用的是Ubuntu,则可以执行dist升级,该升级通常可以修复许多错误(假设您尚未安装最新版本)。通常,当我试图修复这样的错误时,我会尝试这些简单的修复程序,如果它们不能使它再次正常工作,那么该重新安装了。


-2

从实时CD引导。然后启动shell,然后启动sudo -s。然后是chmod 777 / *,然后是chmod 600 / etc / passwd。如果/ lib / init脚本不可执行,则init失败将导致内核崩溃。对于Lilo Linux 1,启动到单用户模式,并运行上面的user102453的脚本。这将启动系统以进行提示。仍然需要让X运行。


3
哇,那真是个可怕的主意。
HopelessN00b 2012年

-3

将/的许可设置为755对我有用。

所以先检查一下

root@ubuntu:/# cd /
root@ubuntu:/# ls -ld

权限应为“ drwxr-xr-x”(755)。


1
这不能解决问题的递归部分。
kasperd 2015年

不,它对4755 2755和6755也无济于事。如果只是/ usr(通常是/ usr),则可以递归ls -al类似的系统并排除755,这会留下少于1000个可以手动处理的文件的列表。当然,src和标头并不重要。
mckenzm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.