ssh config 便利に使いたい!

tomon
2024-07-30
2024-07-30

環境は AlmaLinux 9.2 (OpenSSH_8.7p1, OpenSSL 3.0.7)です。

 後ろの方でWindows環境についても少し述べます。

サーバーにSSH接続するときに.ssh/configファイルに設定を書いておけば接続が容易になります。

.ssh/configファイルの例

Host test1
    HostName 192.168.33.15
    User vagrant

Host test2
    HostName 192.168.33.47
    User vagrant

※ .ssh/configのパーミッションは600でないと動きません。

こうなっているとき

ssh test1

とうって実行すれば、
ssh vagrant@192.168.33.15
と同等で、コマンドやオプションをいっぱい打たなくても簡単に接続できるようになります。
 その他、鍵の指定、エージェントフォワードの設定などもまとめて書いておくこともできます。

「Host test1」の部分がエイリアスのようになります。

●接続先の自動補完
さらに、Hostの名前の部分を自動補完することができます。

ssh te + [TAB] とタイプすると自動補完して

ssh test

さらに[TAB]で

test1  test2

と候補を出してくれます。

[vagrant@localhost ~]$ ssh test

test1  test2

このためにはサーバーにbash-completionが必要です。

以下のようにしてインストールしましょう。
# dnf -y install bash-completion.noarch

●configファイルの整理

.ssh/configファイルの中は、
サーバーの種類などによって、グルーピングしたり、階層構造にしたりして書くことができません。
プロジェクトの数が増えてきたり、プロジェクトの中で使うサーバーが複数あったり、
同じプロジェクトで本番環境、開発環境、ステージング環境と別々のサーバーがあったりすると
configファイルの中にひたすら横並びに追記するのではなく、うまく整理したくなります。

そのときには
configファイルの中で別のファイルをincludeする書き方ができます。
.ssh
├── authorized_keys
├── conf.d
│   └── hosts
│       └── addserver
├── config
└── known_hosts

.ssh/configファイル

Include conf.d/hosts/*

Host test1
    HostName 192.168.33.15
    User vagrant

Host test2
    HostName 192.168.33.47
    User vagrant

.ssh/config/conf.d/hosts/addserverファイル

Host addserver1

    HostName 192.168.33.16

    User homepage

上のように
conf.d/hosts
の下に、プロジェクトごと、環境ごとに分割したサーバーを記載したファイルを設置することで
整理できますね!


●Windows環境
sshコマンドで、configの内容を自動補完するのは
bash_completionではなく、別の方法を使いますが可能です。

configファイルを別ファイルでincludeさせるのも可能です。
 include させたファイル内のHost名を自動補完はできないようです。

VSCode で、Remote SSHを使うとき、接続先候補のサーバー一覧には
includeさせたファイル内のHost名はでてきますが、
ファイル名をワイルドカードで指定した場合はでてこないようです。
つまり、

Include conf.d/hosts/*

では出てこない。

Include conf.d/hosts/addserver

なら出てくる。
以下のURLでこの現象は言及されているので、いずれ修正されるのではないかと思います。
参照:https://github.com/microsoft/vscode-remote-release/issues/65

●いずれにせよ、工夫すれば便利にはなります。ただ、個人的な感想を言うと、痒いところに手が届かないような気も。
いっそのこと、準備されているものではなく、自作で気に入るものつくってしまうのも手かな、と思ったりします。YAMLか何かでサーバー接続情報を階層構造で記述でき、変数も記述できて、グルーピングも簡単にかける設定ファイルを定義する。この形式の設定ファイルをつかって従来のssh configで読み取れるファイルに変換できるようにする。そういうプログラムを作ったりしてみたらおもしろいかもとか、考えたり。