如何恢复/ var下所有文件的默认组/用户所有权?


13

我不小心将/var所有者/组更改为我的用户名,然后将其更改回root,但是并非所有/var文件夹的所有者都是root,所以总有办法将文件/文件夹的所有者/组恢复为默认状态吗?还是至少由包创建的那些文件/文件夹?


2
由于您的一般性问题与“ 如何还原chown命令”完全相同,因此进行了编辑并会被关闭。
2012年

这似乎有一些方法来解决这个问题像这一个,但不只是为/ var和不只是基于RPM分布。
sepehr 2012年

您正在运行哪个发行版?
derobert

@derobert debian testing aka wheezy
sepehr 2012年

Answers:


6

与上面的答案之一类似,如果您在本地目录中具有正确权限名为“ var”的目录副本,则可以使用以下两个命令将权限还原到/ var目录。

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;

10

最简单(而且可能是最正确)的答案是“您不能”,但是如果您想尝试,这是一个bash脚本,它将修复.deb软件包中/ var下文件的权限。

笔记:

  • 它不会修复不属于软件包的文件的权限。
  • 对于apt-get无法再使用该软件包的文件,例如旧版或第三方软件包,它将无法修复。
  • AFAIK,debian软件包中没有文件在文件名中带有制表符,因此我将TAB用作while读取循环的IFS。我已经检查了Contents-amd64.gz和Contents-i386.gz中的debian sid,并确认没有选项卡,但是第三方软件包中可能有一些。

该脚本的工作方式是生成一个包含var中文件的已安装软件包的列表,下载这些软件包,然后dpkg-deb -c用于查找权限。

最困难的部分是编写将权限字符串(如ls -l或所显示tar v)转换为八进制数字模式的函数,包括满足setuid,setgid和粘滞位....使用好算法可以轻松编写的某些内容比如说,perl在bash中麻烦太多了,所以蛮力就更容易了。

最后,脚本被编写为处于“调试模式”或“空运行”模式。要使其实际更改所有者/组/权限,请注释掉或删除带有__EOF__此处文档标记的两行。

#! /bin/bash

perm_string_to_mode() {
  string="$1"
  let perms=0

  [[ "${string}" = ?r???????? ]] && perms=$(( perms +  400 ))
  [[ "${string}" = ??w??????? ]] && perms=$(( perms +  200 ))
  [[ "${string}" = ???x?????? ]] && perms=$(( perms +  100 ))
  [[ "${string}" = ???s?????? ]] && perms=$(( perms + 4100 ))
  [[ "${string}" = ???S?????? ]] && perms=$(( perms + 4000 ))
  [[ "${string}" = ????r????? ]] && perms=$(( perms +   40 ))
  [[ "${string}" = ?????w???? ]] && perms=$(( perms +   20 ))
  [[ "${string}" = ??????x??? ]] && perms=$(( perms +   10 ))
  [[ "${string}" = ??????s??? ]] && perms=$(( perms + 2010 ))
  [[ "${string}" = ??????S??? ]] && perms=$(( perms + 2000 ))
  [[ "${string}" = ???????r?? ]] && perms=$(( perms +    4 ))
  [[ "${string}" = ????????w? ]] && perms=$(( perms +    2 ))
  [[ "${string}" = ?????????x ]] && perms=$(( perms +    1 ))
  [[ "${string}" = ?????????t ]] && perms=$(( perms + 1001 ))
  [[ "${string}" = ?????????T ]] && perms=$(( perms + 1000 ))

  echo $perms
}

# generate a list of installed packages that have files etc in /var
grep -l /var/ /var/lib/dpkg/info/*.list  | \
  sed -e 's:/var/lib/dpkg/info/::' -e 's/\.list$//' | \
  xargs dpkg -l | \
  awk '/^[hi]/ {print $2}' > /tmp/packages.list

# clean out the apt cache, so we only have one version of each package
apt-get clean

# download the packages as if we were going to reinstall them
# NOTE: packages which are no longer available for download
# will not have their permissions fixed.  apt-get will complain about
# those packages, so you can get a list by redirecting or tee-ing the
# output of this script.
xargs apt-get -y -d -u --reinstall install < /tmp/packages.list

for pkg in $(cat /tmp/packages.list) ; do
   PKGFILE="/var/cache/apt/archives/${pkg}_*.deb"

   if [ -e $PKGFILE ] ; then

     dpkg-deb -c /var/cache/apt/archives/${pkg}_*.deb | \
       awk '/\.\/var\// {print $1, $2, $6}' | \
       sed -e 's/ /\t/' -e 's/ /\t' | \
       while IFS=$'\t' read permstring ownergroup filename ; do
          # don't change owner/group/perms on symlinks
          if ! [[ "${permstring}" =~ ^l ]] ; then
            mode=$(perm_string_to_mode $permstring)
            # change "owner/group" to "owner:group" for chown
            ownergroup=${ownergroup//\//:}
            # remove leading '.' from filename
            filename=${filename#?}
cat <<__EOF__
            chown "$ownergroup" "$filename"
            chmod "$mode" "$filename"
__EOF__ 
         fi
       done
     echo
   fi
done

当然,该脚本很容易修改以修复任何其他目录或所有目录中的打包文件权限。

如果其中的$ packagename.list文件/var/lib/dpkg/info具有所有者,组和八进制权限以及文件名,则该脚本会简单得多,但是没有。


1
真好 另外,您也许可以通过* .list将grep替换为dpkg -S /var。另外,应用此脚本后,需要检查dpkg-statoverride --list '/var/*'
derobert 2012年

是的,但是dpkg -S很慢(这就是我写的原因dlocate)。关于dpkg-statoverride...的要点是……输出格式是完美的。
cas 2012年

1
感谢您的脚本。在sed调用之一中有一个错字,其中将blank更改为tab,它缺少最后的'/'。(而在我们讨论时,为什么不这样写:sed -e's / + / \ t / g'| \
Chelmite 2014年

3

你可以。

将相同的发行版安装到另一台计算机或VM上,并使用chmod --refer来同步以下文件的权限/var


1

简单的答案是“你不能”。

但是....如果您有一个像JFS这样的文件系统,并且具有日志,则可以使用它的工具将其还原。一些软件包管理器允许您重新分配其软件包,也许可以通过这种方式恢复文件所有者。

另一种方法,但更麻烦的是,您可以将/ var挂载到另一台设备上,而不是程序将重新创建丢失的目录。

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.