3

アプリからOpenSSHを呼び出したいのですが、これは現在、プライベートrsaキーファイルパスを引数として使用しています。

セキュリティ上の問題のため、rsaファイルをディスクに保存したくありません-rsaファイルの内容を文字列変数として参照する一時ファイルを作成する方法はありますか?

Bashプロセスの置換は有望に見え、ターミナルで機能するようです。

したがって、これの代わりに:

ssh -N -i /path/to/privatekey.rsa -R 16186:localhost:8888 hello.com

私はこの疑似コードのようなことをしたいと思います:

ssh -N -i <("privatekeystuffdis88s8dsf8h8hsd8fh8d") -R 16186:localhost:8888 hello.com

私はOSXを使用しています。

(余談ですが、これはすべてObjective CのNSTaskから呼んでいます)

4

1 に答える 1

5

フォームのプロセス置換<(...)は、括弧内のコマンドの 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]

ここで重要なのは、通常のファイルではないということです。これは名前付きパイプです。つまり、データがパイプから読み取られると、パイプから削除されます。sshIDファイルを複数回開いたり閉じたりするように見えるため、これはユースケースの問題です。

$ 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 回目に開いて読み取ろうとすると、別の不完全なデータが取得されることになります。したがって、この場合はプロセス置換を使用できないようです。

于 2013-03-14T13:47:34.023 に答える