我/
通过执行递归地更改了根目录上的文件许可权sudo chmod -R / 777
,此后,我的系统无法启动(我收到很多“权限被拒绝”错误)。
请帮忙。
我/
通过执行递归地更改了根目录上的文件许可权sudo chmod -R / 777
,此后,我的系统无法启动(我收到很多“权限被拒绝”错误)。
请帮忙。
Answers:
您正在寻找失败的原因。保存所需的数据,然后重新安装操作系统。
/etc
,/var/www
Web服务器内容和数据库。拿起另一个硬盘驱动器,将其作为主要驱动器并安装。这样可以将其他驱动器保留为备份,直到可以传输为止。
我知道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
它可以从这样一个混乱的局面回来,而无需重新安装系统。好吧,如果您有双引导系统,则可以通过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" {}
我从上面修改了脚本,看起来像这样:
#!/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
如果仍然可以启动/usr/sbin/synaptic
,则通常可以修复。
按状态对软件包进行排序(顶部已安装的软件包),选择所有已安装的软件包,右键单击并选择重新安装。然后应用,这将提示dpkg
重新提取这些软件包的所有文件。(您将丢失所有本地修改(但不会丢失配置文件更改)。)
它可能无法解决所有问题。
另一件事是,如果您进入/var/cache
,可以致电dpkg -x <package name> /
每个已安装的软件包,然后致电dpkg --reconfigure -a
。另外,如果您使用的是Ubuntu,则可以执行dist升级,该升级通常可以修复许多错误(假设您尚未安装最新版本)。通常,当我试图修复这样的错误时,我会尝试这些简单的修复程序,如果它们不能使它再次正常工作,那么该重新安装了。
从实时CD引导。然后启动shell,然后启动sudo -s。然后是chmod 777 / *,然后是chmod 600 / etc / passwd。如果/ lib / init脚本不可执行,则init失败将导致内核崩溃。对于Lilo Linux 1,启动到单用户模式,并运行上面的user102453的脚本。这将启动系统以进行提示。仍然需要让X运行。
将/的许可设置为755对我有用。
所以先检查一下
root@ubuntu:/# cd /
root@ubuntu:/# ls -ld
权限应为“ drwxr-xr-x”(755)。