ジャンプサーバーが提供する可変ホスト名を使用してSSH接続を設定する方法

ジャンプサーバーが提供する可変ホスト名を使用してSSH接続を設定する方法

ログイン ノード (ジャンプ サーバー) に接続し、コマンドを実行してそのノードからホスト名を取得し、ログイン ノードに使用したのと同じユーザー名と資格情報を使用してそのホスト名に ssh する必要がある場合に備えて、.sshconfig ファイルを作成したいと思います。最終的に作成した構成は次のとおりです。

Host jump-server
  HostName loginnode
  User user

Host remote
  User user
  IdentityFile C:\Users\user\.ssh\id_rsa
  ForwardX11 yes
  ForwardX11Trusted yes
  XAuthLocation /usr/bin/xauth
  ProxyCommand ssh -q jump-server "ssh user@`command_to_get_the_hostname` bash -l" 

次のコマンドを使用して ssh を実行しようとしています: ssh.exe -v remote

そして、次のような出力が得られました:

OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
debug1: Reading configuration data C:\\Users\\user/.ssh/config
debug1: C:\\Users\\user/.ssh/config line 14: Applying options for remote
debug1: Executing proxy command: exec ssh -q jump-server "ssh lemoni15@`command_to_get_the_hostname` bash -l"
debug1: identity file C:\\Users\\user\\.ssh\\id_rsa type 0
debug1: identity file C:\\Users\\user\\.ssh\\id_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_8.1
: command not foundSH_for_Windows_8.1

答え1

RemoteCommand

ジャンプ ホストだけがリモート ホストのホスト名を知っているとおっしゃいましたね。 はProxyCommandローカル マシン上で実行されるため、command_to_get_the_hostnameジャンプ ホスト上で が実行されることはありません。最初にジャンプ ホストに接続してからそこでコマンドを実行するには、RemoteCommand代わりに を使用できます。

RemoteCommand

サーバーへの接続に成功した後にリモート マシンで実行するコマンドを指定します。コマンド文字列は行末まで拡張され、ユーザーのシェルで実行されます。 - -

例えば

Host remote
  Hostname jump-host.example.com
  User user
  RemoteCommand ssh user@$(/full/path/to/command_to_get_the_hostname)

これで、を使用してリモートホストに接続できますssh -t remote-t 擬似端末割り当てを強制する$(command)リモート側、つまりジャンプ ホストで実行します。

副作用として、リモート ホストにローカルを使用できなくなりますが、2 番目がジャンプ ホスト上で実行されているIdentityFile C:\Users\user\.ssh\id_rsaため、ジャンプ ホストにはキーが必要です。ssh

ProxyJumpスクリプト

ジャンプ ホストをProxyJump( ) ホストとして使用し、ローカルの( )、( )、( ) など-Jを使用できるようにするには、SSH 構成ファイルを使用するだけでなく、スクリプトを作成する必要があります。まず、ジャンプ ホストに接続し、そこからリモート ホストのアドレスを取得して、それを別の SSH 接続で使用する必要があります。IdentityFile-iForwardX11-XForwardX11Trusted-Y

バッシュこれは次のようになります:

#!/bin/bash

remotehost=$(\
  ssh [email protected] \
  /full/path/to/command_to_get_the_hostname) || exit 1

ssh -X -Y -J [email protected] \
  -i ~/.ssh/id_rsa user@"$remotehost"

考えるこれはパワーシェルWindows 上のスクリプト (テストしていません):

$remoteHost = ssh.exe [email protected] `
  /full/path/to/command_to_get_the_hostname
if (-not $?) {throw "Failed to get the remote hostname"}

ssh.exe -X -Y -J [email protected] `
  -i "C:\Users\user\.ssh\id_rsa" "user@$remoteHost"

関連情報