ターミナルへの貼り付けを安全にする方法はありますか?


15

ファイル名などを常にターミナルに貼り付けますが、クリップボードの内容が期待したものと異なる場合があります。

多くの場合、結果はコマンドプロンプトに貼り付けられた数百行のテキスト(たとえば、ソースコード)であり、神がトリガーするのはどのような意地悪かだけです。

bashが貼り付けたものを盲目的に実行するのを防ぐ方法はありますか?テキストを貼り付けて、それを実行したいかどうかを判断させてください。

回答:


9

bashを使用している場合:emacsショートカットを有効set -o emacsにすると、Emacsを使用してコマンドラインを編集することもできます。

  • 入力Ctrl-XCtrl-EのEmacsを起動するためにプロンプトで
  • クリップボードの内容をEmacsバッファーに貼り付けて編集します
  • Ctrl-XCtrl-CEmacsを終了し、コマンドを自動的に実行するために使用します。

私はあなたが意味すると仮定Ctrl代わりにCmd。また、実行せずset -o emacsに使用するよう$EDITORです。ありがとう!これは完璧です。
アブヒベッカート

5

最も簡単な解決策は、おそらくテキストエディターをバッファーとして使用し、そこで内容を再確認してから、テキストエディターからターミナルにコピーすることです。このためにTextEditを使用する場合は、URLではなくリンクとしてリンクを貼り付けるなどの問題を回避するために、プレーンテキストモード(書式メニュー→ プレーンテキストの作成 ;⇧⌘T)であることを確認する必要があります。

もう1つ注意すべき点は、Bashは改行文字の前にあるすべてを実行しようとすることです。そのため、テキストブロックをコピーする場合は、選択範囲をライン。

あなたはこれを求めている: 改行なしの選択

これではない: 改行を使用した選択

もちろん、テキスト内に改行(つまり複数の段落)を含むものをコピーする場合は、選択範囲を手動で編集する必要があります。


問題は、毎日何百回も端末に物を貼り付けることです。真ん中のテキストエディタを使用すると、お尻の痛みだろう
Abhi Beckertの

攻撃者は画面に表示されずに復帰改行をテキストに埋め込むことができるため、テキストの選択方法の例は必ずしも保護を提供しません。
sh1

1

私もこれを手に入れます!

私の解決策は、Launchbarのクリップボードマネージャーとホットキーを使用して貼り付けることCmd+\です。これにより、最近のクリッピングのリストが表示され、貼り付ける前に結果をプレビューできます。期待するコンテンツが表示されない場合は、Cmdをリリースする前にエスケープを押します。また、矢印キーを使用してテキストクリッピングを「入力」し、コンテンツを1行ずつ表示することもできます。

私はほとんどのランチャーがこれを行うと信じています-例えば、Alfred(powerpackアドオン)&Quicksilver(無料)。


1

クリップボードマネージャーを調べてください。Jumpcutと呼ばれる無料の軽量のものを使用します。これにより、複数のクリップボードを保持し、実際にコンテンツを貼り付ける前に、すべてキーボードからそれらに保存されている内容を確認できます。

そこには多くのクリップボードマネージャーがいるので、Jumpcutがあなたのボートを浮かせないなら、おそらく別のものがあなたのニーズによりよく合うでしょう


1

括弧付きの貼り付けを使用します。

ブラケットペーストは、端末が何かを入力するのではなく、貼り付けたことをシェルに通知する機能です。そのため、シェルはEnterキーを押すまでコマンドを実行できません。

Terminal.appはこれをサポートしていますが、すべてのターミナルがサポートしているわけではありません。

同様に、すべてのシェルがサポートしているわけでもありません。OS Xに付属しているbashのバージョンは、ブラケットペーストをサポートしていません(執筆時点では、v3.2.57です)。

ただし、zshはブラケットペーストをサポートしています。

zsh-かっこ貼り

Zshは、ほとんどの場合bashと互換性があり(スクリプトは、おそらく何らかのあいまいな機能を使用しない限り、おそらく動作します)、多くの点で優れています。たとえば、複数行のコマンド編集も可能です。

zsh-multiline-command


ブラケットペーストはどのようにアクティブにしますか?
Abhi Beckertの

1
zshを使用すると、デフォルトでオンになります。ワンライナーで貼り付けてみてください!最初のスクリーンショットのように逆強調表示し、一度Deleteキーを押すと、すべてが削除されるはずです。
SilverWolf-モニカの復元18年

私は実際に偶然にそれを見つけて、それがなぜbashではなかったのか疑問に思いました。デフォルトのbashは本当に古いことが判明しました。(:
SilverWolf-モニカの復元18年

0

あなたはこの小さなBashスクリプトをあなたのどこかに置くことができますPATH

#!/bin/bash

read -p "Are you sure you wish to execute \`$(pbpaste)\`? (Y/n) "    
[[ $REPLY =~ ^[Yy]?$  ]] && pbpaste | bash

/usr/local/pbexecuteたとえば、これらのコンテンツを配置して実行可能にするpbexecuteと、コマンドラインから安全に実行でき、クリップボードのコンテンツを実行する前に確認が求められます。

別のアプローチは、シェル内からクリップボードの内容を使用してテキストエディターを起動し、終了時に編集された内容を自動的に実行することです。例えば:

#!/bin/bash

PBTEMP=$(mktemp -t pbtemp)
pbpaste > $PBTEMP
nano -t $PBTEMP
source $PBTEMP
rm $PBTEMP

逃げたカチカチはなぜですか?''を使用しても同様に機能します。
nohillside

@patrixバックティックをエスケープしない場合、bashはプロンプトを表示している間にすでにそれを実行します。
ジェリー

バックティックを省略すると、同様にトリックを行うべきではありませんか?
nohillside

@patrixああ、もちろん、それはプロンプトをどのようにフォーマットするかという好みの問題です。バックティックを選択したのは、それらがコマンド置換演算子であり、コマンドを視覚的にマークアップするために一般的に使用されるためです(StackExchangeの編集を参照)。
ジェリー

私はこれでOKだよ:-)それだけの種類複雑のようだ
nohillside
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.