0

新しいCLIアプリケーションを作成しています。このアプリケーションでは、ユーザーから機密性の高い入力を取得したいと考えています。この入力は非常にわかりやすく、情報は少し機密性が高いため、ユーザーがこのアプリから次のようなコマンドを入力できるようにしたいと思いました。

app new entry

その後、ユーザーにこの記述的な入力を書き込むことができるVIMセッションを提供したいと思います。この入力は、ユーザーがこのVIMセッションを終了すると、私のスクリプトによってキャプチャされ、以降の処理に使用されます。

誰かが私に方法を教えてもらえますか(おそらくいくつかの隠されたVIM機能-私はいつも彼らに驚いています)、一時ファイルを作成せずにそうすることができますか?以下のコメントで説明されているように、情報は少し機密性が高い可能性があるため、ある程度メモリ内のファイルをお勧めします。したがって、最初にスクリプトを介して処理し、次にディスクに書き込みます。暗号化された方法。

4

3 に答える 3

6

Gitは実際にこれを行います。入力git commitすると、新しいVimインスタンスが作成され、このインスタンスで一時ファイルが使用されます。そのファイルに、コミットメッセージを入力します

Vimが再び閉じられると、一時ファイルのコンテンツが読み取られ、Gitによって使用されます。その後、一時ファイルは再び削除されます。

したがって、必要なものを取得するには、次の手順が必要です。

それでおしまい。

于 2013-01-08T15:39:12.517 に答える
1

次のように、シェルに関数にアタッチされたファイル記述子を作成させ、vimに書き込みをさせることができます(ただし、スクリプトを2つの部分に分割する必要があります。1つはvimを呼び出し、もう1つは入力を処理します)。

# First script
…
vim --cmd $'aug ScriptForbidReading\nau BufReadCmd /proc/self/fd/* :' --cmd 'aug END' >(second-script)

。ノート:

  1. second-script実際には、最初のスクリプトで定義された関数である可能性があります(少なくともzshでは)。これには、bashまたはzshも必要です(後者でのみテスト済み)。
  2. * nixが必要ですが、*nixと見なされる一部のOSでは機能しない可能性があります。
  3. BufReadCmd書き込み専用記述子を読み取ろうとするとvimがハングするため、これが必要です。
  4. ftdetectプラグインを使用せずに、(必要に応じて)ファイルタイプをすぐに設定することをお勧めします。このメソッドを使用するのがスクリプトだけではない場合に備えて。
  5. Zshは終了するのを待つsecond-scriptので、からの情報が必要ない場合に備えて、vimコマンドの直後にスクリプトを続行second-scriptできます(そこから取得するのは難しいでしょう)。
  6. 2番目のスクリプトはサブシェルから起動されます。vimしたがって、呼び出し後に実行されるコードでは、変数の変更は見られません。
  7. 2番目のスクリプトは、vimが標準入力で保存したものをすべて受け取ります。親の標準入力に直接アクセスすることはできませんが、使用</dev/ttyするとおそらく機能します。

これはzsh/bashスクリプト用です。rubyで同じアイデアを使用することを実際に妨げるものはありません(おそらくより便利で、2つのスクリプトに分割する必要はありません)が、rubyでファイル記述子を作成する方法を説明するのに十分なrubyはわかりません。

于 2013-01-08T20:59:27.803 に答える
0

これにvimを使用するのはやり過ぎのようです。

ルビーのhighline宝石はあなたが必要とすることをするかもしれません:

require 'highline'
irb> pw = HighLine.new.ask('info: ') {|q| q.echo = false }
info: 
=> "abc"

echoに設定すると、ユーザーのテキストは表示されませんfalse

これは、ファイルを作成してから削除するよりも安全です。これは、削除が安全であることを確認する必要があるためです(ファイルをランダムデータで数回上書きして、復元できないようにします。shredまたはsrmユーティリティを参照してください)。

于 2013-03-11T02:46:59.263 に答える