继承文件权限

继承文件权限

我目前在 Raspberry Pi 上的 Raspbian 上运行着 AirPlay 音频流服务 (Shairport)。我已将其配置为保存所播放歌曲的元数据。对于每首歌曲,它都会将专辑封面保存到元数据文件夹中。然后我用 Java 编写了另一个程序来读取专辑封面并显示它们。

唯一的问题是,当文件由 shairport 创建时,权限设置为只有 shairport 用户才能访问它们。我尝试使用 来setfacl更改权限,但要么不起作用,要么更可能是我做错了什么。

我该如何设置,以便当文件添加到文件夹时其权限自动设置为其他权限?

我尝试了能找到的所有解决方案但都不起作用。

答案1

这是一个潜在的解决方案。我查看了 shairport 中写入专辑封面文件的代码。我们可能可以修改 shairport 的代码以包含一组特定的权限。

我对这一切还比较陌生,所以请耐心等待。

我的想法是编辑文件 metadata.c。这是 shairport github 上的文件链接: https://github.com/abrasive/shairport/blob/master/metadata.c

在该文件中,我们寻找首先打开专辑封面文件进行写入的行。在本例中,它如下所示:

int cover_fd = open(path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

这将打开文件并将生成的代码存储在 int cover_fd 中,可用于检查文件是否已成功打开。

在 c 语言中,open() 的调用方式如下:open(const char *path, int oflags, mode_t mode)http://codewiki.wikidot.com/c:system-calls:open

具体来说,mod_t 模式定义了新创建文件的权限。Shairport 随后将权限设置为 S_IRUSR | S_IWUSR,或(将所有者的读取权限设置为 true 并将所有者的写入权限设置为 true。)

Open 也可以使用 Linux 风格的权限。这意味着您可以将 S_IRUSR | S_IWUSR 更改为 0666 或任何您喜欢的值。

完成后,保存修改后的 metadata.c 并重新编译,如下所示:

cd shairport

./configure

make

make install

我面前现在没有 pi 或 shairport 来测试这个,但它应该可以工作。

答案2

在发布其他答案之前,我发现了另一个解决方案,所以我不知道其他解决方案是否有效,但如果其他人需要帮助,这就是我最终做的事情:

我编写了以下 bash 脚本,它监听添加到文件夹中的新文件,然后自动更改文件的权限。

#!/bin/sh

echo "Starting change_permissions"

inotifywait -m /etc/shairport/metadata/ -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        sudo chmod 777 /etc/shairport/metadata/$file
    done

然后我为该脚本创建了一个守护进程,使其在后台运行。我不确定这是否是最好的方法,但我知道它确实有效。

答案3

当您在那里时,您可能还想考虑做一些其他的改变。

如果你更改以下几行:

size_t pl = strlen(dir) + 1 + strlen(prefix) + strlen(img_md5_str) + 1 + strlen(ext);

char *路径=malloc(pl+1);

snprintf(path, pl+1, "%s/%s%s.%s", dir, prefix, img_md5_str, ext);

int cover_fd = open(路径,O_WRONLY | O_CREAT,S_IRUSR | S_IWUSR);

到:

char *封面文件名 = “/封面艺术.jpg”;

size_t pl = strlen(dir) + strlen(覆盖文件名);

char *路径=malloc(pl+1);

snprintf(路径,pl+1,"%s%s", dir,cover_file_name);

int cover_fd = open(路径,O_TRUNC | O_WRONLY | O_CREAT,0666);

它应该修改 shairport 以不断覆盖一个专辑封面文件,而不是每次都创建一个新的。好处是您的 java 程序将始终知道最新图像的名称是 cover_art.jpg。这样做可能更容易,而不必弄清楚哪个 jpg 是最新的。我提到这一点是因为,至少对我来说,shairport 更新的 FIFO 文件似乎总是显示上一首歌曲的封面。这还没有经过测试,但应该会让你走上正确的道路。祝你好运!

相关内容