WSLやAzureサービスだけでなく、通常のSSH接続での作業にWindows Terminalを使うケースも少なくないだろう。日常的に利用するサーバへSSH接続するのに、わざわざPowerShellやWSL環境のLinuxからsshコマンドを入力するのはちょっと煩わしい。そんなときは、対象にサーバへのSSH接続用のプロファイルを作ってしまえばよい。

PowerShellを使ったSSH接続

まずは、PowerShellを使って普通にSSH接続してみよう。WindowsにはデフォルトでSSHクライアントが用意されているので、SSHを使うのに特に追加でソフトウエアをインストールする必要はない。SSH接続のためのプログラムは「ssh.exe」だが、PowerShellではsshコマンドとしてエイリアスが用意されているので、次のようにコマンドを入力することでSSH接続できる。<ユーザー名>と<ホスト名>の部分は、各自の接続先サーバのユーザー名とホスト名に置き換えていただきたい。なお、ホスト名の代わりにIPアドレスを記入してもよい。

> ssh <ユーザー名>@<ホスト名>

sshコマンドが使用するデフォルトのポート番号は22だが、もし接続先サーバで別のポート番号が指定されている場合には、次のように「-p」オプションでポート番号を指定すればよい。

> ssh -p <ポート番号> <ユーザー名>@<ホスト名>

接続に成功したら、パスワードを入力するように求められるはずだ。

SSH接続用のプロパティを作成する

たまにしかログインしないサーバであれば、上記のようにコマンド入力でSSHセッションを始めるやり方でも問題ないが、頻繁に利用するサーバでは少し面倒だ。そこで、Windows Terminalでタブを開いたときに自動でsshコマンドを実行してセッションを開始できるようにしてみよう。そのためには、指定のサイトにSSH接続する専用のプロファイルを作成すればよい。

「setting.json」のプロファイル設定で、commandline属性の値によって使用するコマンドラインツールのプログラムを指定できることは、第30回で説明した。例えば、コマンドプロンプトの場合はcommandline属性の値として実行ファイルの「cmd.exe」が指定されている。

実は、sshコマンドもこのcommandline属性の値として設定することができるようになっている。例えば、「MyHostへの接続」という名前のプロファイルを作成して、スタート時に自動でSSH接続を始めるように設定するには、次のような設定を追加すればよい。

{
    "guid": "{5fa2a3c4-c9db-4743-a01c-3ce1988f6231}",
    "hidden": false,
    "name": "MyHostへのSSH接続",
    "commandline": "ssh <ユーザー名>@<ホスト名>"
}

commandline属性の値には、SSH接続時のsshコマンドの記述内容をそのまま設定する。「guid」については、PowerShellで次のコマンドを実行すれば、新しいguidを取得できるので、その値を設定すればよい。

> [Guid]::NewGuid()

Guid
----
5fa2a3c4-c9db-4743-a01c-3ce1988f6231

設定が反映されたら、タブバー横のドロップダウンメニューに、下図のように「MyHostへのSSH接続」というプロファイルが追加されているはずだ。

新しいプロファイルが追加されている

これを選択すると、新規タブでは自動的にSSH接続を行い、ログインパスワードの入力が求められる。

公開鍵認証を使用してSSH接続する

SSH接続に公開鍵認証を使うこともできる。通常のSSH接続で公開鍵認証を使用するには、次のように「-i」オプションで秘密鍵のパスを指定してsshコマンドを実行する。

> ssh -i <秘密鍵のパス> <ユーザー名>@<ホスト名>

WindowsのSSHクライアントは、デフォルトではユーザーのホームディレクトリ直下にある.sshディレクトリを設定ファイルのパスとして使用する。その場所に秘密鍵がある場合のsshコマンドは次のようになる。

> ssh -i C:\Users\<Windowsのユーザ名>\.ssh\<秘密鍵のファイル名> <ユーザー名>@<ホスト名>

この-iオプションを付けたsshコマンドを、setting.jsonのcommandline属性の値に設定する場合、次のような記述になる。

{
    "guid": "{5fa2a3c4-c9db-4743-a01c-3ce1988f6231}",
    "hidden": false,
    "name": "MyHostへのSSH接続",
    "commandline": "ssh -i C:\\Users\\<Windowsのユーザー名>\\.ssh\\<秘密鍵のファイル名> <ユーザー名>@<ホスト名>"
}

属性の値の記述ではバックスラッシュ(\)はエスケープする必要があるので、ディレクトリの区切り文字がエスケープ付き二重のバックスラッシュ(\)になっている点に注意しよう。

接続先のホスト側に正しく対応する公開鍵が設定されていれば、このプロファイルをスタートしたときのSSH接続はパスワード無しでセッションを開始することができる。

configファイルでSSH接続情報を管理する

SSH接続の情報をconfigファイルを使って管理することもできる。前述のようにSSHクライアントのデフォルトの設定ファイルの配置場所はユーザーのホームディレクトリ直下にある.sshディレクトリである。例えば、mynaviユーザーでログインしている場合は、一般的には「C:\Users\mynavi.ssh\」となる。

この場所に「config」という名前のファイルを作成し(「config.txt」のように拡張子が付いていてはダメなので注意)、次のような設定を記述する。<ホスト名>、<ポート番号>、<ユーザー名>、<秘密鍵のパス>の部分は、それぞれ各自の環境に合わせて記述する。「myhost」というのが接続名になるが、これも任意の名前を設定してよい。

Host myhost
   HostName <ホスト名>
   Port <ポート番号>
   User <ユーザー名>
   ForwardAgent yes
   IdentityFile <秘密鍵のパス>

このように設定しておけば、sshコマンドを使った接続は次のように接続名を使ってシンプルに行うことができる。

ssh myhost

接続名を使ったSSH接続の場合、setting.jsonのcommandline属性の値は次のような記述になる。

{
    "guid": "{5fa2a3c4-c9db-4743-a01c-3ce1988f6231}",
    "hidden": false,
    "name": "MyHostへのSSH接続",
    "commandline": "ssh myhost"
}

Windows TerminalでSSH接続を利用するメリットは、PowerShellやWSLなどと併用する場合でも、1つのアプリケーション内ですべて作業を完結できる点だろう。SSH接続ができるターミナルアプリケーションはサードパーティ製のものもいろいろと提供されているが、今後はその選択肢の1つにWindows Terminalを加えてみてはどうだろうか。

参考資料