特定キーワードをハイライト表示してコマンド実行前に注意喚起する(iTerm2)

2017.02.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Mac用のターミナルエミュレータ iTerm2 には、
正規表現にマッチした文字列が表示されたことをトリガーにして何かを実行する、という機能があります。

この機能を使えば、
意図しない危険なコマンドを実行してしまう前に警告を出せる のではないか、
と思って設定してみました。

想定するケース

例えばaws cliには大量のコマンド・サブコマンドがあるわけですが、
そのサブコマンドのうち、

  • 現在の情報を取得する「describe-」プレフィクスをもつもの
  • リソースを削除する「delete-」プレフィクスをもつもの

この2つは、特に前者は頻繁に使いますし、
一方で後者は、(権限さえあれば)警告なしに 不可逆な 変更を加えてしまいます。

落ち着いて作業していれば、普通は見間違えることもないものでしょうけど、

  • aws elb describe-load-balancers --load-balancer-name my-elb-web01
  • aws elb delete-load-balancer --load-balancer-name my-elb-web011

この両者を一瞬で判別できるような補助があれば、作業者の負担も減るのではないでしょうか。

Preferences > Profiles > Advanced > Triggers

ひとまず設定してみます。

メニューから Preferences のダイアログを開いて、Profiles で設定するプロファイルを選択、
Advanced タブから Triggers のEditボタンをクリックします。

iterm2-preference-01m

左下のをクリックして、追加された行の設定を修正していきます。

iterm2-preference-02m

今回はdelete-という文字列をハイライト表示したいわけなので、

  • Regular Expression欄に「delete\-」と記入2
  • Action欄で「Highlight Text...」を選択
  • Paramatersはお好みですが、とりあえずデフォルトの「文字色:白、背景色:赤」に
  • Instantにチェックを入れる

iterm2-preference-03-2

Instantのチェックが入っていないと、改行されるまで正規表現が評価されません。
今回は実行前に、つまり入力中のコマンドラインでもハイライトさせたいので、忘れずにチェックします。

設定がすんだら右下の「close」ボタンを押し、Profilesダイアログも閉じておきます。

実行例

example-01m

aws elb delete-まで入力したところで、
若干のラグがあるものの、意図通りにハイライト表示されました。

自分の入力でなくても、例えばaws elb helpの表示もハイライトされます。

example-02m

これで、間違ったコマンドをコピペしてしまうという事故も減らせるのではないでしょうか。

応用

Triggersに設定できる文字列は正規表現が使えるので、
自分は、他にも危なそうな文字列は一括で登録してしまいました。

  • (delete|deregister|detach|disable|disassociate|remove|revoke|stop|terminate|unassign)\-

あんまり沢山登録してしまうと、所謂オオカミ少年状態になってハイライト自体に慣れてしまいそうなので、
いったんこのくらいにしています。これでも多いのかも。

実際に使ってみつつ調整していきたいと思います。

所感

この方法の良いところはクライアント側、つまりターミナルエミュレータ(iTerm2)で設定しているということで、
現在稼働している環境やサーバ類には一切手を加える必要がない 、というところです。

たとえ初めてログインするサーバであっても、ターミナルさえ同じなら必ずハイライト表示されるので、
常に同じターミナルで作業しているという場合には効果が期待できます。

逆に、
今回だけ他のひとの作業環境を借りて実行する、という場合には、当然ながら効果がありません。

もっともその場合は、いろいろなものに慣れていない状態での作業になるでしょうから、
これだけで収まる話でもないだろうと個人的には思います。

もちろん恒久的には、そもそも適切な権限に制限された環境で作業すべきかなと思いますが、
サーバ環境・クライアント環境の両面で対策されていれば、それだけ事故の可能性も減らせるかと。

そのうえで、最後に残るのは使う側の問題なので、
そこはまた別途工夫と努力をしたいと思います。


  1. 正確には「--load-balancer-names」ですが、思わずコピペ実行してしまわないようわざと間違ったものを記載しています 
  2. 正規表現でエスケープ(「\」)を入力するときにはoption + ¥とします。「¥」のままだとエスケープにならないので注意が必要ですね