次のことができるUnix / Linuxファイルシステムはありますか?
- ファイルが実行可能な場合は、ファイルを実行して生成されたファイルを含むダミーファイルを返します
stdout
(書き込みが不可能であるべきだと思います)。 - それ以外の場合は、ext4や友達と同じように動作し、ファイル自体を提供します。
最近、プロセスに情報を渡すことはできませんが(複数行)、ファイルをオプションとして渡す必要がある状況が発生しました。このファイルを動的に(ローカルまたはネットワーク経由で)作成できることは私にとっては素晴らしいオプションのようです。
/ tmpにファイルを生成することは、オプションがLDAPエントリの属性にあるためオプションではありません。私のLDAPエントリには、静的に定義された次のような属性値が含まれています。
-fstype=cifs...,rw,credentials=FILENAME,... ://remote
これを評価するプロセスにデータとして渡され、FILENAMEをオプションの引数として期待しますcredentials=
。 Bashや他のスクリプトはありません。 LDAPで/ tmpファイルを動的に生成する方法は不明です。
頼まないでくださいなぜ私はこれをしたい:解決策で問題を解決しましたが、それでも基本的な問題に興味があります。
もちろん、この種の仕事には常に追加の質問が伴います。安全に実行できますか?
スティーブ
答え1
さて、私が正しいことを見てみましょう。 LDAP には、一部のファイル名を参照するデータがいくつかあります。ファイルがネットワーク共有にあり、LDAPディレクトリを使用しているすべてのホストから読み取ることができ、ファイルの内容を動的に作成したいとします。たとえば、ディレクトリにはが含まれており、credentials=/ldap/foo.cred
一部のシステムが開かれると/ldap/foo.cred
動的データが取得されます。
というプログラムがあるようです。スクリプトファイル、ㅏFUSE(ユーザー空間のファイルシステム)実装はユーザーが望むものとほぼ正確に一致しますが、ツールに慣れておらず、どのように機能するのかわかりません。 (@KamilMaciorowskiはコメントと記事でこの内容に言及しました。回答スーパーユーザーから。 )
ScriptFSはローカルファイルシステムのみをコピーしますが、実行結果に基づいて「スクリプト」として検出されたすべてのファイルを置き換える新しいファイルシステムです。
名前が示すように、FUSEを使用すると、ユーザー空間プログラムは他のプログラムと同様にファイルシステムを実装でき、カーネルはファイルシステムの処理を担当するプロセスに対するファイルアクセス要求をスケジュールします。これにより、任意の動的コンテンツを生成できます。おそらく、ファイルは通常のファイルとして表示されるため、ネットワーク共有を介しても機能するようですが、それに対する個人的な経験はありません。
より「伝統的な」機能の中で最も近い機能は、名前付きパイプと名前付きソケットです。
を使用して生成された名前付きパイプは、ファイルシステムに名前があり、ここで開くことができることを除いて、mkfifo
作成したパイプと似ています。somecmd | grep foo
だからあなたは書くことができますmkfifo p; somecmd > p & grep foo < p
。あるいは、同様に読者が最初に開くことができます。読者と作家の両方が相手が来るまでブロックします。最初はこれが好きなように行われるようです。パイプに書き込んで、誰かが読み取り用に開いたときに現在の出力を提供するようにプログラムをスケジュールできます。ただし、パイプは一度だけ存在するため、同時ユーザーは同じストリームに接続されます。また、テザリングでどのように機能するのか分かりません。パイプはクライアント側にのみ存在する可能性があるため、両端は同じシステム上になければなりません。
Unixドメインソケットはファイルシステムの名前の下に存在することもできます(systemdを実行している場合は以下にあります/run
)。接続時に開かれたプロセスは、TCP接続と同様にソケットでリッスンするプロセスに接続されます。ここでの接続は独立していますが、問題は(私が知っている限り)Unixドメインソケットを開けませんが、open()
接続する必要があるということですconnect()
。したがって、それを行うことはできず、cat < socket
動作しません。
答え2
いいえ。そしてそのようなファイルシステムは役に立たない。
たとえば、sed
このファイルシステムにいる場合はどうなりますかls | sed 's/a/b'
?実行のためにシェルが開きますが、ファイルsed
システムはSTDOUTを返しますsed
。ただし、ファイルシステムにはSTDINがないため、すべてが何もせずに停止sed
(sed
STDIN待機)または終了(空STDIN)されます。sed
これはXYの問題でもあります。
ファイルシステムの動作を変更してスクリプトの問題を解決しようとしないでください。
@Arkadiusz Drabczykが提案したように、プロセスの交換で問題を解決できます。たとえば:あなたがしたいことがある場合
sort file1 | uniq >tmp1
sort file2 | uniq >tmp2
diff tmp1 tmp2
ただし、一時ファイルを作成できない、または作成したくないので、tmp1
次のtmp2
ことができます。
diff <(sort file1 | uniq) <(sort file2 | uniq)
別の例は、あなたの質問と少し似ているようです。ファイルがあるとしましょうinputfile
。
a:b:c:d
i:j:k:l
e:f:g:h
簡単なデモスクリプトがあります。
#!/bin/bash
filename=$(echo $* | sed 's/.*credentials=//;s/,.*//')
echo "The filename is: $filename"
echo "The contents is:"
cat $filename
もしそうなら、当然次のことができます。
./procsub.sh -fstype=cifs...,rw,credentials=inputfile,,... ://remote
出力は次のとおりです。
a:b:c:d
i:j:k:l
e:f:g:h
ただし、出力をソートするには、次のようにすることもできます。
./procsub.sh -fstype=cifs...,rw,credentials=<(sort inputfile),,... ://remote
その後、出力は次のようになります。
The filename is: /dev/fd/63
The contents is:
a:b:c:d
e:f:g:h
i:j:k:l
もう少し明確になりますように。
答え3
意味で説明する内容はあまり意味がありません。 FUSEで構築するのは比較的簡単ですが、多くのレベルで間違っているようです。
ファイルから潜在的に動的データを読み取ることができるようにしたいです。これは、プログラムが変更できないデータを取得できる唯一のソースであるためです。この問題はファイルシステムパイプで解決できます。
#!/bin/bash
PIPE="/tmp/credentials"
if [ ! -p "$PIPE" ] ; then
mkfifo "$PIPE"
fi
do
echo $SECRET >$PIPE
done