flatray.com | 戻る 更新日時: 2023-10-15

Windowsでsshのポートフォワーディング+自動再接続を実現するプログラム

Windows で ssh のポートフォワーディングを利用するため、長らく PortForwarder( オリジナル2015年版 )を利用させていただきましたが、新しい署名アルゴリズム(ECDSA, EdDSA 等)の鍵を扱えないなどさすがに古くて困るようになってきました。 代替品を探しましたがちょうどいいものがなさそうなので、 Windows 10 / Windows 11 の標準機能のみで実装してみました。

プログラム

対象ユーザ

こんな人にお勧めです。

ゴール(目標)

仕様・実装

開発・動作確認環境

準備

Windows用 OpenSSH クライアントのインストール

Windows 10 / Windows 11 の設定画面からインストールできます。 今回はこちらを使っています。 本件ではクライアントだけで十分です。サーバをインストールする必要はありません。

Microsoft の「OpenSSH をインストールする」

あるいは GitHub にある最新版インストール してください。

それ以外の ssh クライアント・エージェントでも大丈夫でしょう。 (putty の plink.exe での動作を確認しています)

ssh-agent の設定

上記でインストールした OpenSSH の ssh-agent は Windows のサービスとして提供されており、標準では無効になっているので、これを有効にします。

.ssh/config

PortForwarder では OpenSSH の .ssh/config と同等の設定ファイルを作成・利用していました。

このプログラムでは基本的に Windows 10 / Windows 11 で標準提供される OpenSSH を利用するので、 ssh の設定ファイルは %USERPROFILE%\.ssh\config (例: c:\Users\ユーザ名\.ssh\config )となります。 ここにポートフォワーディングに必要な設定を記述してください。

設定例

PortForwarder の設定ファイルそのままでもおそらく問題ありませんが、 ssh コマンドを対話的に利用したい場合はポートフォワーディング用のホスト名を別途用意した方が便利でしょう。

接続先のホスト名が SERVER で、普通に ssh コマンドでログインするためのエントリがこうだとします。

    Host SERVER
        User YourName

これに対してポートフォワーディングするための設定は例えば次のように記述します。

    # auto-pf RemoteName
    Host SERVER-pf
        HostName SERVER
        User YourName
        LocalForward localhost:5901 localhost:5901

接続するサーバが複数ある場合は、同じ要領で複数設定してください。

.ssh/config にコメントを書きたくない場合は、「# auto-pf」と「Host」の行だけ書いた別のファイルを作成して -config オプションで指定してください。 (プログラムの実装としては、指定されたファイルの「# auto-pf」の行とその直後の「Host」の行を見て接続先を決めます。 それとは独立して sshコマンドは %USERPROFILE%\.ssh\config を参照して接続します。 なので接続先を決めるファイルと sshの設定ファイルは別でも構いません)

ssh-add.bat

auto-pf.ps1

sshコマンド

(必要があれば後述の ssh-add.bat で鍵を登録後) .ssh/config の Host に書いたホスト名を指定してコンソール上で ssh コマンドを実行し、パスフレーズの確認なしでログインできることを確認してください。

        The authenticity of host '[example.com]:22 (AAA.BBB.CCC.DDD:22)' can't be established.
        ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
        This key is not known by any other names
        Are you sure you want to continue connecting (yes/no/[fingerprint])?

使い方(運用)

ssh-add.bat

auto-pf.ps1

auto-pf.ps1 のオプション

接続先の選択アルゴリズムとssh設定の記述先について

注意: -connect と -auto 0 を同時に指定しないでください。(正常動作しません)

テスト

お好みで実験してみてください。

正常に起動しない場合は

エラーメッセージが出ているか確認してください。

sshポートフォワーディング以外の使い方

元にしたプログラムは「定期的にコマンドを実行する」もので、 function timer_function の中身を変更すれば色々使えます。

今回参考にしたサイト

上記を参考に、 ssh プロセスのチェックや(再)起動などを追加実装しました。 本当にありがとうございます。

(以上)