フォームのプロセス置換<(...)
は、括弧内のコマンドの stdout を特別な一時ファイルに送信し、そのファイルへのパスを返します。これは、引数としてファイル名のみを受け取るコマンドが、他のコマンドの出力を読み取ることができるようにするためです。これは、置換をエコーするだけで確認できます。
$ echo <(true)
/dev/fd/63
したがって、その特殊ファイルの内容を「privatekeystuffdis88s8dsf8h8hsd8fh8d」という文字列にしたい場合は、次のようにします。
ssh -N -i <(echo "privatekeystuffdis88s8dsf8h8hsd8fh8d") -R 16186:localhost:8888 hello.com
アップデート
「特別な一時ファイル」は、実際にはpipe(7)
、シェルによって作成された読み取り側のファイル記述子にすぎません。 /dev/fd
は へのシンボリック リンク/proc/self/fd
であるため、上記の例では、実際の「ファイル」は実際には であり、長いリストでは次の/proc/self/fd/63
ようになります。lr-x------ 1 user group 64 Mar 14 12:26 63 -> pipe:[1955808]
ここで重要なのは、通常のファイルではないということです。これは名前付きパイプです。つまり、データがパイプから読み取られると、パイプから削除されます。ssh
IDファイルを複数回開いたり閉じたりするように見えるため、これはユースケースの問題です。
$ strace ssh -vv -n -i ./identity-test some.server true 2>&1 | grep open.*identity-test
open("./identity-test", O_RDONLY) = 4
open("./identity-test", O_RDONLY) = 4
Enter passphrase for RSA key './identity-test':
つまり、2 回目に開いて読み取ろうとすると、別の不完全なデータが取得されることになります。したがって、この場合はプロセス置換を使用できないようです。