如何在 Ubuntu 中将文件夹权限重置为默认值?

20 permissions chmod ubuntu

我最近输入了命令

sudo chmod 777 -R /
Run Code Online (Sandbox Code Playgroud)

在那之后,有些事情像

sudo -i
Run Code Online (Sandbox Code Playgroud)

不能正常工作。所以我想知道是否有任何方法可以将文件夹权限重置为原始状态?

小智 19

可能从这种混乱的情况中回来。

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

首先,我的情况更容易解决,因为我有一个双引导系统(Ubuntu 和我的旧 Fedora 安装),但是从 CD/DVD 或 USB 密钥运行操作系统应该做同样的事情。

MPOINT=/mount/ubuntu
Run Code Online (Sandbox Code Playgroud)

首先,我像这样挂载了我的文件系统(不要忘记创建挂载点):

mount /dev/ubuntu/root $MPOINT
mount /dev/ubuntu/home $MPOINT/home
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令(我的问题仅在少数 - 关键 - 目录中)将权限从正在运行的系统复制到凌乱的系统(实际上,就我而言,我在 Fedora 下的 Virtual Box 中安装了一个 Ubuntu 系统并在那里获得权限):

find /etc /usr /bin /sbin -exec stat --format "chmod %a \"${MPOINT}%n\"" {} \; > /tmp/restoreperms.sh
Run Code Online (Sandbox Code Playgroud)

然后我运行了 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
(...)
Run Code Online (Sandbox Code Playgroud)

我没有测试它,但它也必须适用于所有者和所有者组。就像是:

find /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
(...)
Run Code Online (Sandbox Code Playgroud)

当然,这里你要注意,两个系统上的 UID 和 GID 是相同的,但是对于系统相关的用户和组,这应该不是问题。

编辑:

此外,设置 owner将使 SGID 和 SUID flags 无效,这会导致奇怪的问题(例如,除非权限为 4755,否则您将无法执行 sudo)。您必须并且应该只在设置所有者之后设置权限。务必保存完整的文件权限信息以及所有者信息。

Rk:

  1. 一个重要的事情是保持安装盘与您正在使用的版本同步,或者至少使用当前的 ubuntu 版本。
  2. 现在,我在 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" {} \; -exec /usr/bin/stat --format="/bin/chown -h %U:%G %n" {} \; |/bin/bzip2 -c > /tmp/restore_fileperms.$(/bin/date +%w).sh.bz2`
Run Code Online (Sandbox Code Playgroud)

请注意,可能需要额外注意文件名中的括号(例如,在语言环境下),并且 chown 可能会悄悄地取消设置由 chmod 设置的 setuid 和 setgid 位。在后一种情况下,例如 /bin/su 和 /usr/bin/sudo,您可能需要交换上面的 exec 子句的顺序。


小智 0

您无法撤消chmod操作;至少不是回滚到以前的设置,这正是这种情况所需要的。 \xc2\xa0 可以说,您可以chmod通过chmod将每个文件和目录恢复到其原始模式 \xe2\x80\ 来撤消操作x93\xe2\x80\x93 但它们\xe2\x80\x99并不完全相同;确定原始模式很棘手(如其他答案中讨论的\xc2\xa0)。

\n