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

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

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

我想要做的是将此配置文件分成两部分,这样和config.secret.yml将被源代码控制忽略,而可以签入。config.public.ymlconfig.secret.ymlconfig.public.yml

然后,我想以某种方式创建一个config.yml类似文件的对象,有效地“符号链接”和的连接内容config.secret.ymlconfig.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

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

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

答案1

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

举例来说:

echo foo > file1
echo bar > file2

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

结合.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

然后

chmod +x combine.sh
./combine.sh

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

例如,在单独的终端中:

$ cat foobar
foo
bar

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

相关内容