我不小心将/var
所有者/组更改为我的用户名,然后将其更改回 root,但并非所有/var
文件夹的所有者都是 root,那么是否有办法将文件/文件夹的所有者/组更改回默认状态?或者至少是由包创建的那些文件/文件夹?
答案1
最简单(也可能是最正确)的答案是“你不能”,但如果你想尝试,这里有一个 bash 脚本,它将修复 /var 下属于 .deb 包的文件的权限。
笔记:
- 它不会修复不属于包的文件的权限。
- 它不会修复无法再通过 apt-get 下载软件包的文件的权限 - 例如旧版或第三方软件包。
- AFAIK,debian 软件包中的文件名中没有制表符,因此我使用 TAB 作为 while-read 循环的 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 -v OFS='\t' '/\.\/var\// {print $1, $2, $6}' | \
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
当然,该脚本可以很容易地修改以修复任何其他目录或所有目录中的打包文件权限。
/var/lib/dpkg/info
如果 $packagename.list 文件具有所有者、组和八进制权限以及文件名,则此脚本会简单得多...但它们没有。
答案2
与上面的答案之一类似,如果您的本地目录中有名为“var”的具有正确权限的目录的副本,则可以使用以下两个命令恢复 /var 目录的权限。
sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;
答案3
你可以。
将相同的发行版安装到另一台机器或虚拟机上,并使用chmod --refer
同步权限/var
答案4
简单的答案是“你不能”。
但是...如果您有一个像 JFS 这样有日志的文件系统,您可以使用它的工具来恢复它。某些包管理器允许您重新安装其包,也许通过这种方式您可以恢复文件所有者。
另一种更麻烦的方法是您可以将 /var 安装在另一个设备上,然后程序将重新创建丢失的目录。