我正在处理一个config.yml
从当前目录读取配置文件的应用程序。此配置文件包含不应签入源代码控制的机密信息(API 密钥)以及可以签入的其他配置信息。
我想要做的是将此配置文件分成两部分,这样和config.secret.yml
将被源代码控制忽略,而可以签入。config.public.yml
config.secret.yml
config.public.yml
然后,我想以某种方式创建一个config.yml
类似文件的对象,有效地“符号链接”和的连接内容config.secret.yml
,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
我知道符号链接本身不支持这种行为,并且通常会从应用程序端读取“默认”和“本地”设置,但让我们假设只能读取一个配置文件。
该文件由 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 &
,或者将其作为服务运行。