読者です 読者をやめる 読者になる 読者になる

オープンソースこねこね

Webプログラミングなどについてあれこれ。

sshのラッパーコマンドを作った

GoでSSHコマンドに便利機能を追加したコマンドを作りました。

2017/04/11 追記: この記事の内容は古くなっています!

2017/04/11時点の最新の仕様は、次の記事を参照してください

SSHラッパーコマンドEsshのv1.0.0をリリースしました - オープンソースこねこね

追記ここまで。以下は2015/11時点の古い情報となります。

f:id:kohkimakimoto:20151115163938g:plain

github.com

機能として

  • Lua~/.ssh/configに相当する設定を書ける。
  • zshの補完機能を使って、接続先一覧を出す。
  • サーバ接続時にフックを仕込める。自分はスクリーンの色を変えるの使っている。
  • 複数のリモートサーバにまとめてコマンドを実行する。

といったところです。詳細はリポジトリのREADMEを見ていだければと思います。 ビルド済みバイナリをリリースページにおいてあるので、インストールはダウンロードして解凍してパスの通ったディレクトリに配置すればOKです。

~/.ssh/configを上書きするので~/.ssh/configのバックアップを取っておくのをお忘れなく。

https://github.com/kohkimakimoto/zssh/releases/latest

使い方

zsshsshのラッパーコマンドになっているので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