我可以创建一个“符号链接式”文件来“合并”两个文件吗?

Gav*_*ard 5 unix filesystems symbolic-link

我正在处理一个config.yml从当前目录读取配置文件的应用程序。此配置文件包含不应签入源控制的机密信息(API 密钥)和其他可以签入的配置信息。

我想要做的是将这个配置文件分成两部分,分别是config.secret.ymlconfig.public.yml. config.secret.yml将被源代码管理忽略,而config.public.yml可以签入。

然后,我想以某种方式创建一个config.yml类似文件的对象,该对象有效地“符号链接” config.secret.ymland的连接内容config.public.yml,以便发生这种情况:

> cat config.secret.yml
---
:api_key: 2712ab206a8003e44b2a84c467fc1b58
>
> cat config.public.yml    
:site_id: 123
>
> cat config.yml
---
:api_key: 2712ab206a8003e44b2a84c467fc1b58
:site_id: 123
Run Code Online (Sandbox Code Playgroud)

我知道符号链接本身不支持这种行为,并且通常会从应用程序端读取“默认”和“本地”设置,但让我们假设只有一个配置文件可以被阅读。

该文件由 Ruby 的File.read()方法读取并解析,YAML.load()如果这为狡猾的黑客提供了任何机会。

zel*_*nix 3

您应该能够为此使用命名管道。

作为样本:

echo foo > file1
echo bar > file2
Run Code Online (Sandbox Code Playgroud)

然后在同一目录中创建一个新脚本,如下所示:

组合.sh:

#!/bin/bash

[ -p foobar ] && rm foobar

trap "[ -p foobar ] && rm foobar && exit" SIGINT

while [  true ]; do
  mkfifo foobar
  echo "Writing File"
  cat file1 file2 > foobar
  rm foobar
done
Run Code Online (Sandbox Code Playgroud)

然后

chmod +x combine.sh
./combine.sh
Run Code Online (Sandbox Code Playgroud)

foobar这将创建一个在同一目录中命名的管道。现在,您可以从任何进程中读取此管道,就像它是真实文件一样。

例如,在单独的终端中:

$ cat foobar
foo
bar
Run Code Online (Sandbox Code Playgroud)

当然,./combine.sh 2>&1 > /dev/null &如果您需要更大的持久性,您可以使用它在后台运行或将其作为服务运行。