とある地味なブログ

プログラミングとお絵かきに関する雑記。

Cmderのsshで特定のホストだけウィンドウカラーを変える

茨の道をつきすすむ。

特定のホストだけコンソールの色を変える

巷では、本番サーバに入るときにコンソールの色を変えたりするらしいじゃないですか。 本番のコンソールは開きっぱで間違えてrm -rf /した!とかいうことを未然に防げそう。

事故を減らすには良いと思います。

でも、Windowsでそんなことが簡単にできると思うなよ?

Cmderは使いやすいが...

ConEmuならここまで苦労しなかった。

ConEmuなら/Paletteという起動オプションがあるらしく、まあこれでパレット(= カラースキーム)を設定できる。

しかし、CmderではConEmuの起動オプションは使えないのだ!フゥーーーーーSo Cooooooooool!!*1

No list of command-line options? · Issue #370 · cmderdev/cmder · GitHub

どうやるか

自作のsshコマンドを差し込む

まず、sshコマンドを実行した時に、本番サーバであればカラースキームを設定した新しい窓を開き、そうでなければ普通にSSHを実行するバッチを用意する。

@echo off

set SSH=C:\path\to\ssh.exe

findstr %1 %HOMEPATH%\.ssh\product_hosts

if ERRORLEVEL 1 (
%SSH% %*
goto :EOF
)

set PRODUCT_SSH=%*
Cmder

%HOMEPATH%\.ssh\product_hostsに、本番サーバのホスト名を書く。 部分一致で検索してるだけなので改行区切りでもなんでもいいが、あるホスト名が他のホスト名に含まれた場合に微妙だから直したほうがいいと思う。

こうして、環境変数PRODUCT_SSHを設定してからCmderを実行することで、以下で設定するTaskの挙動を変える。

Cmderの設定

CmderのTaskに書くコマンドの引数に-new_console:P:"<カラースキームの名前>"を設定すると、Cmderの色が変わるようだ。*2

つまり、

f:id:sujoyu:20151022221541p:plain

こんなふうにCmderのTaskを設定し、

@echo off

IF DEFINED PRODUCT_SSH (
set CMDER_PALETTE=product_ssh
set INIT_CMD="C:\path\to\ssh.exe %PRODUCT_SSH%"
) ELSE (
set CMDER_PALETTE=Monokai
set INIT_CMD=""
)

C:\path\to\nyagos.exe -k %INIT_CMD% -new_console:P:"%CMDER_PALETTE%"

cmder_task_init.batをこうすると、環境変数PRODUCT_SSHが定義されているかどうかで挙動が変わる。

自分はNYAGOSをつかっているのでnyagos.exe -k %INIT_CMD%としているが、ほかのShell*3の場合は初期実行するコマンドを適宜設定すればいいと思う。

結果

f:id:sujoyu:20151022220528p:plain

やったー!!!

微妙なところ

余計なタブが一枚開くのが微妙。なぜだ...

*1:英語力はお察しなので違うかも

*2:Linuxみたいに実行時引数を後から取れるんだろうか

*3:Shell...でいいの?