如果我有一个文件,我想让世界可读,但它位于多层不可执行的目录深处,我必须更改整个路径和文件的权限。
我可以这样做chmod 755 -R /first/inaccessible/parent/dir
,但这会更改路径目录中所有其他文件的权限,并在我只想读取文件时使文件本身可执行。
有没有一种直接的方法可以在 bash 中做到这一点?
答案1
一种方法是:
#! /bin/sh
fname=/full/path/to/file
dir=${fname%/*}
while [ x"$dir" != x ]; do
chmod 0755 "$dir"
dir=${dir%/*}
done
chmod 0644 "$fname"
答案2
设置:
$ mkdir -p /tmp/lh/subdir1/subdir2/subdir3
$ touch /tmp/lh/subdir1/subdir2/subdir3/filehere
$ chmod -R 700 /tmp/lh
$ find /tmp/lh -ls
16 4 drwx------ 3 user group 4096 Oct 23 12:01 /tmp/lh
20 4 drwx------ 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1
21 4 drwx------ 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2
22 4 drwx------ 2 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3
23 0 -rwx------ 1 user group 0 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3/filehere
准备:
$ f=/tmp/lh/subdir1/subdir2/subdir3/filehere
这样做:
$ chmod o+r "$f"
$ (cd "$(dirname "$f")" && while [ "$PWD" != "/" ]; do chmod o+x .; cd ..; done)
chmod: changing permissions of `.': Operation not permitted
$ find /tmp/lh -ls
16 4 drwx-----x 3 user group 4096 Oct 23 12:01 /tmp/lh
20 4 drwx-----x 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1
21 4 drwx-----x 3 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2
22 4 drwx-----x 2 user group 4096 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3
23 0 -rwx---r-- 1 user group 0 Oct 23 12:01 /tmp/lh/subdir1/subdir2/subdir3/filehere
如果您确实希望中间目录也具有其他执行权限,只需将 chmod 命令更改为chmod o+rx
.
我从上面得到的错误消息是由于我的非 root 用户 ID 尝试更改/tmp
我不拥有的目录的权限而导致的。
该循环在子 shell 中运行,以将目录更改与当前 shell 的 $PWD 隔离。它通过输入包含该文件的目录开始循环,然后向上循环,沿途 chmod'ing,直到它到达根/
目录。循环在到达根目录时退出——它不会尝试 chmod 根目录。
您可以像这样创建一个脚本文件或函数:
function makeitreadable() (
chmod o+r "$1"
cd "$(dirname "$1")" &&
while [ "$PWD" != "/" ]
do
chmod o+x .
cd ..
done
)
答案3
这会将子文件夹更改为 0755
find /first/inaccessible/parent/dir -type d -exec chmod 0755 {} \;
这将搜索您的文件并更改其权限
chmod +r $(find /first/inaccessible/parent/dir -type f -name YourFileName)
希望有帮助。 (仅供参考:默认文件夹应该有 0755)
答案4
在受保护较少的路径中公开文件
您应该能够从文件系统中的不同路径创建到该文件的符号链接 - 这应该使原始文件可以使用它具有的任何权限进行访问,而不会暴露该文件目录周围的所有其他目录和文件是在。
当然,您需要拥有/提供不同的路径是您的目标用户/系统可读...