设置:

设置:

如果我有一个文件,我想让世界可读,但它位于多层不可执行的目录深处,我必须更改整个路径和文件的权限。

我可以这样做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

在受保护较少的路径中公开文件

您应该能够从文件系统中的不同路径创建到该文件的符号链接 - 这应该使原始文件可以使用它具有的任何权限进行访问,而不会暴露该文件目录周围的所有其他目录和文件是在。

当然,您需要拥有/提供不同的路径您的目标用户/系统可读...

相关内容