【PowerShell】SSH接続を自動化する方法|configファイルを使った設定手順

【PowerShell】SSH接続を自動化する方法|configファイルを使った設定手順 PowerShell

毎回「ssh user@host -p 2222 -i ~/.ssh/id_ed25519」のように長いコマンドを打つのは非効率です。
OpenSSH の設定ファイル ~/.ssh/config に接続情報をまとめれば、PowerShell から短いエイリアスだけで安全・確実に自動接続できます。
ここでは Windows(PowerShell)環境での config ファイル作成から、多段踏み台、ポート転送、鍵管理まで実用設定を順に解説します。

configファイルの場所と準備

Windows の OpenSSH はユーザープロファイル配下の C:\Users\<ユーザー名>\.ssh\config を読み込みます。
ファイルが無ければ新規作成します。文字コードは UTF-8、改行は CRLF のままで問題ありません。PowerShell からは次のように作成できます。

# フォルダ作成(存在しない場合)
New-Item -ItemType Directory -Force -Path $HOME\.ssh | Out-Null

# 空の config を作成(既存なら開く)
if (-not (Test-Path "$HOME\.ssh\config")) { New-Item -ItemType File -Path "$HOME\.ssh\config" | Out-Null }

# メモ帳で開く
notepad $HOME\.ssh\config

最小構成:短いエイリアスで接続する

基本形は Host ブロックに接続先の別名とパラメータを列挙します。これで ssh web の一語で接続できます。

Host web
  HostName 192.168.1.100
  User ubuntu
  Port 22
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

設定後は PowerShell で ssh web を実行します。うまくいかない場合は ssh -v web で詳細ログを確認します。

複数環境を整理する:ワイルドカードと共通設定

似たホスト名をまとめて扱う時はワイルドカードが便利です。共通設定を最上段に、個別の上書きを下段に記述します。

# 開発用は共通でユーザーと鍵を指定
Host dev-*
  User ec2-user
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

# 個別の差分だけを下で上書き
Host dev-app
  HostName 10.0.0.21

Host dev-db
  HostName 10.0.0.22
  Port 2222

踏み台経由(多段SSH)を自動化する

直接到達できない内部サーバーへは踏み台(bastion)を経由します。現代的な方法は ProxyJump を使う書き方です。

# 踏み台
Host bastion
  HostName bastion.example.com
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519

# 内部サーバー(bastion を経由)
Host internal-app
  HostName 10.1.0.50
  User ubuntu
  ProxyJump bastion
  IdentityFile ~/.ssh/id_ed25519

複数段を連ねる場合は ProxyJump host1,host2 のようにカンマ区切りで指定できます。

ポート転送で開発を快適にする

ローカルへ安全にトンネルするには LocalForward、サーバーから外部へ公開するには RemoteForward を使います。
Host ブロックに書いておけば接続時に自動で転送が張られます。

# リモートのDB(5432)をローカルの15432へ転送
Host db-tunnel
  HostName db.internal
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519
  LocalForward 127.0.0.1:15432 127.0.0.1:5432

VS Code などからは localhost:15432 に繋ぐだけで、リモートDBへ安全にアクセスできます。

鍵の管理:ssh-agent を常駐させる

毎回パスフレーズ入力を避けたい場合は Windows の ssh-agent サービスを自動起動にします。追加した鍵は再起動後も保持されます。

# サービスを自動起動にして開始
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent

# 鍵を登録(ed25519 の例)
ssh-add $HOME\.ssh\id_ed25519

# 登録確認
ssh-add -l

config 側には鍵のパスを IdentityFile で明示し、IdentitiesOnly yes を付けて不要な鍵送信を抑制します。

接続を堅牢にする追加オプション

転送やタイムアウトで切れやすい回線では keepalive を有効化すると安定します。エージェント転送が必要なワークフロー以外では無効化するのが安全です。

# すべての接続に既定を適用(最上段に記述)
Host *
  ServerAliveInterval 30
  ServerAliveCountMax 3
  ForwardAgent no
  StrictHostKeyChecking accept-new
  UserKnownHostsFile ~/.ssh/known_hosts

条件付き設定:環境に応じて自動切替

同じ別名を社内・社外で切り替えたい場合は Match で条件分岐できます。以下は社内ネットワークからのみ直接接続し、外部では踏み台経由にする例です。

# 既定は踏み台経由
Host corp-app
  HostName app.corp.local
  User ubuntu
  ProxyJump bastion

# 社内サブネットから来たら踏み台を無効化
Match host corp-app exec "ipconfig | findstr 10\.0\.0\."
  Hostname app.corp.local
  ProxyJump none

巨大構成を分割する:Include ディレクティブ

プロジェクトごとにファイルを分けたい場合は Include で読み込みます。社用と個人用を安全に分離できます。

# メイン config
Host *
  ServerAliveInterval 30

Include ~/.ssh/config.d/*.conf

動作確認とトラブルシュート

設定が反映されないときは詳細ログで解析します。特に読み込まれたファイルの順序や、どの鍵が送られたかを確認します。

# 詳細ログで接続(-vvv で更に詳細)
ssh -v web

# どの設定が効いているかをダンプ(OpenSSH 9.3+)
ssh -G web | more

セキュリティの注意点

不要な ForwardAgent は無効化し、鍵は ed25519 などの現代的アルゴリズムで作成します。公開鍵は必要なサーバーの ~/.ssh/authorized_keys にのみ配置し、config は Git 等で公開しないよう注意します。
認証失敗を繰り返す場合は IdentitiesOnly yes を入れて、意図しない鍵の試行を止めると収束が早くなります。

まとめ

PowerShell 環境でも ~/.ssh/config を整えるだけで、別名一発接続、踏み台の自動経由、ポート転送の自動張り直し、鍵の自動読込みまで含めた「SSH 接続の自動化」が実現できます。
まずは最小の Host ブロックから始め、必要に応じて ProxyJumpLocalForwardMatchInclude を足して運用に最適化してください。