sshのラッパーコマンドを作った
GoでSSHコマンドに便利機能を追加したコマンドを作りました。
2017/04/11 追記: この記事の内容は古くなっています!
2017/04/11時点の最新の仕様は、次の記事を参照してください
SSHラッパーコマンドEsshのv1.0.0をリリースしました - オープンソースこねこね
追記ここまで。以下は2015/11時点の古い情報となります。
機能として
- Luaで
~/.ssh/config
に相当する設定を書ける。 - zshの補完機能を使って、接続先一覧を出す。
- サーバ接続時にフックを仕込める。自分はスクリーンの色を変えるの使っている。
- 複数のリモートサーバにまとめてコマンドを実行する。
といったところです。詳細はリポジトリのREADMEを見ていだければと思います。 ビルド済みバイナリをリリースページにおいてあるので、インストールはダウンロードして解凍してパスの通ったディレクトリに配置すればOKです。
~/.ssh/config
を上書きするので~/.ssh/config
のバックアップを取っておくのをお忘れなく。
https://github.com/kohkimakimoto/zssh/releases/latest
使い方
zssh
はssh
のラッパーコマンドになっているのでssh
コマンドと同様に使えます。zssh
を実行するとssh
コマンドで実際の処理を実行する前に、設定ファイル~/.ssh/zssh.lua
を読み込んで~/.ssh/config
を生成するしくみになっています。
~/.ssh/zssh.lua
に以下のような設定を書いておくと
Host "web01.localhost" { ForwardAgent = "yes", HostName = "192.168.0.11", Port = "22", User = "kohkimakimoto", -- 小文字で始まる設定は、~/.ssh/configに出力されない。descriptionはzsh補完の説明文に使用される(後述) description = "my web01 server", } Host "web02.localhost" { ForwardAgent = "yes", HostName = "192.168.0.12", Port = "22", User = "kohkimakimoto", description = "my web02 server", }
zssh
実行時に次のような~/.ssh/config
を自動生成して上書きします。
Host web01.localhost ForwardAgent yes HostName 192.168.0.11 Port 22 User kohkimakimoto Host web02.localhost ForwardAgent yes HostName 192.168.0.12 Port 22 User kohkimakimoto
これで、sshコマンドと同様に以下のようにしてサーバにSSH接続できます。
zssh web01.localhost
ZSH補完
zsh補完をサポートしているので、以下のコードを~/.zshrc
に書いておくと
eval "$(zssh --zsh-completion)"
上に貼り付けたアニメgifのようにサーバが説明文付きで候補にでるようになります。
フック
hooks
の設定でサーバ接続時と切断時にローカルでLuaのコードを実行できます。
os.execute
でコマンドを実行できるので、以下のようにするとMacのターミナルの色を変更できます。
Host "web01.localhost" { HostName = "192.168.0.11", Port = "22", User = "kohkimakimoto", ForwardAgent = "yes", description = "my web01 server", -- フックの設定 hooks = { before = function() -- This is an example to change screen color to red. os.execute("osascript -e 'tell application \"Terminal\" to set current settings of first window to settings set \"Red Sands\"'") end, after = function() -- This is an example to change screen color to black. os.execute("osascript -e 'tell application \"Terminal\" to set current settings of first window to settings set \"Pro\"'") end, } }
ちなみに、ターミナルの色を変える方法は以前にも書きましたので、よければそちらも参照ください。
http://kohkimakimoto.hatenablog.com/entry/2015/04/02/211232
マクロ
コマンドを複数サーバにまとめて実行できます。
Host "web01.localhost" { HostName = "192.168.0.11", Port = "22", User = "kohkimakimoto", ForwardAgent = "yes", description = "my web01 server", tags = { role = "web" }, } Host "web02.localhost" { HostName = "192.168.0.12", Port = "22", User = "kohkimakimoto", ForwardAgent = "yes", description = "my web02 server", tags = { role = "web" }, } Macro "example" { -- 並列実行するか? parallel = true, -- 実行前に確認プロンプトを出す。 confirm = "Are you OK?", -- zsh補完時の説明 description = "example macro", -- 実行先サーバを指定。Host設定のtagsで設定したタグを指定する。指定しないとローカルでの実行になる。 on = {role = "web"}, -- ttyを使うか? tail -f でログを監視するときなどはtrueに tty = false, -- コマンドの内容 command = [[ ls -la ]], }
マクロ名を指定して実行できます。
$ zssh example