2009-05-26 19 views
6

短いバージョン:echo "testing" | vim - | grep "good"編集中にファイルをメモリに保持するにはどうしたらいいですか?

vimがパイプに出力されないため、これは機能しません。それは言う: "Vim:警告:出力は端末にありません"。これを行う方法は?クロスエディタのサポートも素晴らしいでしょう。

名前付きパイプを試しましたが、vimはそれらを開けません。

ロングバージョン:echo $ passw | gpg -q -d --passphrase-fd 0 $ファイル名| vim - | "何とかgpgは$ passwを使って暗号化し、$ filenameにそれを保存します"。

gpgで暗号化されたファイルを編集しようとしていますが、いつでもディスク上に復号化されたファイルがないようにしたいと考えています。

フルスクリプトはここにある:https://github.com/ptarjan/viencrypt

+1

パスフレーズでパス名展開とワード分割を実行するのは、本当に悪い考えです。 http://mywiki.wooledge.org/BashGuide/Practices/Quoting-Quoteすべてのパラメータ拡張( "$ passw"、 "$ filename"、..) – lhunath

+0

@lhunath、@Paul Tarjan:または単に移行する'' zsh'へ。 'command $ var'を使うと、デフォルトではパス名展開と単語分割は実行されません。ここでは' command '$ var "'と完全に等価です。 。 – ZyX

+0

@Paulはまだ利用可能なスクリプトですか?リンクが壊れています... – Simon

答えて

5

vimであなたのために暗号化することができます。

あなたのgpg暗号化手段を介してコンテンツをフィルタリングし、vimの中のファイルを保存する前に:

 
    :{range}![!]{filter} [!][arg]    *:range!* 
      Filter {range} lines through the external program 
      {filter}. Vim replaces the optional bangs with the 
      latest given command and appends the optional [arg]. 
      Vim saves the output of the filter command in a 
      temporary file and then reads the file into the 
      buffer. Vim uses the 'shellredir' option to redirect 
      the filter output to the temporary file. 
      However, if the 'shelltemp' option is off then pipes 
      are used when possible (on Unix). 
      When the 'R' flag is included in 'cpoptions' marks in 
      the filtered lines are deleted, unless the 
      |:keepmarks| command is used. Example: > 
      :keepmarks '<,'>!sort 
    <    
      When the number of lines after filtering is less than 
      before, marks in the missing lines are deleted anyway. 
     w 

あなたはGPGを通してそれをフィルタリングするのであれば、(私はここのフラグで推測している):

:%!gpg -q -d -p $password 
:w $filename 
あなたはvimの中にそれらを使用したい場合はそう Vimはそれらへのアクセスを持っている $password$filename環境変数をエクスポートする必要があります

+0

ありがとうございました。これはうまくいくように見えます。 パスワード管理のプロセスを合理化しようとしています。私は現在、3つのパスワードを記憶するディスク上のファイルを取り込み GPG passwords.gpg vimのパスワード のgpg -cパスワード RMパスワード を行います。私はそれを避けることを望んでいた。あなたは "vimのコマンド"の方がうまくいくでしょうか? –

+1

もちろん、あなたは 'vim passwords.gpg'を実行することができますし、vim内でファイルを復号化して編集し、それを再暗号化するために':%!gpg -e'を実行する ':%!gpg- ':w'で保存します。あなたはautocmdsを開いて自動的に.gpgファイルを解読し、書き込み時に再暗号化することもできます(これは、暗号化されていないバージョンをディスクに誤って書き込まないようにします)。 – rampion

+0

は解読するために-dにする必要があります。 – rampion

3

あなたはどこか(メモリにデータを格納する)tmpfsファイルシステムをマウントし、そこにあなたの仕事を行うことができます。

EDIT(!):申し訳ありません、そのramfsを作成します。違いは、tmpfsはスペースをスワップするためにページアウトできることです。これは必要ではありません。代わりに、すべてのスワップデバイス(swapoffを使用)をオフにして、tmpfsを使用することもできます。

+0

面白いです。これはユーザー空間で利用できますか? mount -t ramfs ramfs/tmp/ramfs/ mount:rootのみが行うことができます ユーザーが実行できるのであれば、私がrootでないボックスでこのメソッドを動作させる方が望ましいでしょう。 –

0

メモリ内(/ dev/memにアクセス可能)であっても、rootユーザーから何も隠すことはできません。それは避けられない事実です。

だから、私はちょうどあなたのホームディレクトリには、ルート以外の誰もから保護する必要があります一時ファイルを使用したいと思います。 1行目では、次のように入力します

echo "testing" >~/proc$$ ; vim ~/proc$$ ; 
    grep "good" ~/proc$$ ; rm -f ~/proc$$ 

あなたは本当のセキュリティをしたい場合は、rootユーザーのみであり、そこにそれを行うのボックスにファイルを移動します。次に、暗号化されたファイルを元に戻します。

+0

mktempを使用していて、そのファイルからうまく動作していますか?ここに私のスクリプトはあります:http://github.com/ptarjan/gpg-encrypt/tree/master –

+0

おそらく(私はmktempを使ったことはありませんでしたが)ファイルはあなただけが読むことができません。 rootユーザーは* anything *を実行できます。唯一の解決策は、あなたが完全に信じているボックス(そして "メモリ内"を含む)以外の場所に暗号化されていないファイルを置かないことです。 – paxdiablo

+0

ええ、悲しいことに、私はファイルを盗むためのハードルを増やしているだけで、決して完全に安全ではありません。しかし、良い点。 –

1

これは正しいです:Vimはパイプに出力しません。 Vimはその入力を受けてパイプに出力せず、エディタウィンドウに出力して編集することができます。 vimの後でパイプシーケンスを続けることはできません。したがって、試してみてください:

echo $ passw | gpg -q -d --passphrase-fd 0 $ファイル名| vim -

またはvimをまったく使用しないでください。

gpgに戻す前にファイルを編集する場合は、2段階のプロセスでこれを行う必要があります。

+0

私は現在これを行っていますが、ファイルはディスク上にあります。私のボックスが再起動し、誰かがドライブを持ってくると、私のパスワードはすべて取れます。そうは思わないが、まだ理想的ではない。 それを行うスクリプトはhttp://github.com/ptarjan/gpg-encrypt/tree/masterです –

+0

後でファイルに「細断」をして、0で書き直すことができます。 – Dan

+0

OK、シュレッドオプションを追加しました。今、唯一のレースは、私がそれを保存した後ですが、削除する前です。競合状態は悪いですが、これはループ内にユーザー入力がありません。 –

7

デフォルトでは、Vimはディスク上にスワップファイルを作成します。それを避けるために、次のコマンドでVimを起動します。

vim "+set noswapfile" 
+0

素敵です。これをスクリプトに追加しました。 –

+0

'-n'引数は同等ですが、そうですか? – SOFe

1

あなたが標準出力に編集中のファイルを印刷する%pコマンドを使用することができます。この例では

、Vimはその標準入力を読み込み、標準出力に送信します:

$ (echo one; echo two; echo three; echo four) | \ 
    vim - -nes -u NONE -c ':%p' -c ':q!' | \ 
    tail -n +2 | \ 
    grep t 
two 
three 

注:

  • vim -:標準入力から
  • -nをお読みくださいませんスワップファイルを作成し、メモリのみを使用する
  • -e:exモードで開始
  • -s:サイレントモードまたはバッチモード
  • -u NONE.vimrcを読み取らないでください(.vimrcを読み上げる場合は、このオプションをスキップしてください)。しかし、異なる人々が異なる.vimrc -sを持っているので、あなたが-u NONEを書いていない場合は、あなたの.vimrcを変更した場合、あなたのコードも、あなたのために別の人のために働くか、ないかもしれません)
  • -c <something>:コマンドとして実行して何かを
  • -c ':%p':標準出力
  • -c 'q!'にバッファの内容を印刷:
  • tail -n +2を保存せずに終了します(それはライン「Vim: Reading from stdin...」です)離れ
をVimの出力の最初の行を投げます

次の例では、Vimは実際に何か有用です。標準入力の最初の列を削除します。

$ (echo one; echo two; echo three; echo four) | \ 
    vim - -nes -u NONE -c ':exec "normal G\<c-v>ggx"' -c ':%p' -c ':q!' | \ 
    tail -n +2 
ne 
wo 
hree 
our 

  • :exec次のコマンド(コマンドラインコマンドではなく、ノーマルモードコマンド)を実行
  • normal:指定されたノーマルモードを実行するコマンドラインコマンドは、
  • を命令
  • G:ファイルの最終行に移動
  • \<c-v>:開始ブロックの選択
  • gg: ":%pを" 右Iの後に「:WQ私はvimの問題教えてもらえます

    :選択した文字を削除

EDIT:最初の行

  • xに行きます"対話セッションから?

    たとえば、「コマンドを実行する前にXを実行する」のようにVimに言うことができます。 VimLeaveのオートコマンド(:help autocommand:help VimLeaveを参照してください): ":%P" コマンド

    $ (echo "line 1"; echo "line 2") | \ 
        vim - -nes -u NONE -c ':autocmd VimLeave * :%p' 
    Vim: Reading from stdin... 
    :q!  # you type :q! 
    line 1 
    line 2 
    

    問題がです。 "-e"引数を使用すると、 のビジュアルエディタは表示されません。 "-e"を使用しない場合、Vimは ":%p"の結果を標準出力に出力せず、端末に出力します。

    私は別の投稿で別の提案をします。

  • +0

    ありがとう!これは本当に近いです。私は、対話型のvimセッションも望んでいることを、上記では言及しなかった。パスワードファイルへの編集をスクリプト化することは非常に難しく、編集リストに編集内容が表示されないようにしたい。インタラクティブセッションから私が ":wq"の後にvimに ":%p"の権利を伝えることはできますか? –

    1

    元の問題を解決するには、(私はそれを見る限り):

    secret.txtは暗号化されたテキストが含まれています。

    ./encode.shは、シンメトリックエンコーダスクリプトです。

    次のコマンドはsecret.txt、デコードからテキストを読みますが、Vimは、エンコード中には 編集可能にし、そしてsecret.txtに戻ってそれを書く:

    $ cp secret.txt | \ 
        ./encode.sh | \ 
        vim - -n -u NONE \ 
         -c ':autocmd VimLeave * :exec "%!./encode.sh" | write! tmp'; \ 
        mv tmp secret.txt 
    

    注:

    • :autocmd VimLeave * <command>
    • :exec "%!./encode.sh" | write! secret.txt任意のファイル上でVimを離れる前<command>を実行します。バッファの全体 内容などに./encode.shを実行しますフィルターを入れてからバッファーを書き込んでください。secret.txt
    • 「フィルターとして」とは、バッファーの内容が ./encode.shに入力されることを意味します。バッファの内容は、実行が終了した後に標準 の出力./encode.shに置き換えられます。

    しかし、私はこの解決法は醜いと言います。 the same as rampionをお勧めします:(:help autocommand)の自動コマンドを見て、Vim内で編集プロセス全体をやってみてください。

    最後に、Vimにはあなたのproject web pageに書かれているような独自の暗号化コマンドがあります:「ファイルをあなただけが読むことができるファイルに復号化し、あなたのお気に入りのエディタで編集してから それをrencryptsし、元の場所からファイルを保存します。

    Vimのヘルプ(:help :X)は、アルゴリズムについて述べている:

    • 使用されるアルゴリズムは壊れやすいです。約1時間で4文字のキー、1日で6 文字キー(Pentium 133 PC上)。これには、ファイルに表示する必要があるテキストの一部が であることが必要です。エキスパートはどの鍵でもそれを壊すことができます。 テキストが復号化されると、これはまた、鍵が であることを示し、同じ鍵で暗号化された他のファイルを復号化できることを意味します。
    • Pkzipは同じ暗号化を使用しており、US Govtはそのエクスポートに異論はありません。 Pkzipの公開ファイルAPPNOTE.TXTは、このアルゴリズムを詳細に説明しています。
    1

    別のオプションは、車輪の再発明するのではなくVimのためgnupgプラグインを使用することです。 :)もちろん、私はプラグインの現在のメンテナーだからちょっと偏っています。