So richten Sie eine SSH-Verbindung mit einem variablen Hostnamen ein, der vom Jump-Server bereitgestellt wird

So richten Sie eine SSH-Verbindung mit einem variablen Hostnamen ein, der vom Jump-Server bereitgestellt wird

Ich möchte eine .sshconfig-Datei für den Fall erstellen, dass ich eine Verbindung zu einem Anmeldeknoten (dem Jump-Server) herstellen muss, den Hostnamen von diesem Knoten durch Ausführen eines Befehls abrufen und dann mit demselben Benutzernamen und denselben Anmeldeinformationen, die ich für den Anmeldeknoten verwendet habe, per SSH auf diesen Hostnamen zugreifen muss. Dies ist die Konfiguration, die ich am Ende erhalten habe:

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" 

Ich versuche, mit diesem Befehl eine SSH-Verbindung herzustellen: ssh.exe -v remote

Und ich erhalte diese Ausgabe:

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

Antwort1

RemoteCommand

Sie sagten, nur der Jump-Host kennt den Hostnamen des Remote-Hosts, richtig? Der ProxyCommandläuft auf dem lokalen Computer, daher wird er nie command_to_get_the_hostnameauf dem Jump-Host ausgeführt. Um zuerst eine Verbindung zum Jump-Host herzustellen und dann den Befehl dort auszuführen, können Sie RemoteCommandstattdessen verwenden.

RemoteCommand

Gibt einen Befehl an, der nach erfolgreicher Verbindung zum Server auf dem Remotecomputer ausgeführt werden soll. Die Befehlszeichenfolge reicht bis zum Ende der Zeile und wird mit der Shell des Benutzers ausgeführt. - -

Z.B

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

Jetzt können Sie sich mit dem Remote-Host verbinden ssh -t remote, indem Sie , wobei die-t erzwingt Pseudoterminalzuordnungzum Ausführen $(command)auf der Remote-Seite, d. h. auf dem Jump-Host.

Als Nebeneffekt können Sie den lokalen Host nicht IdentityFile C:\Users\user\.ssh\id_rsafür den Remote-Host verwenden, aber der Jump-Host muss über den Schlüssel verfügen, da der zweite sshjetzt auf dem Jump-Host ausgeführt wird.

ProxyJump& Skripting

ProxyJumpWenn Sie den Jump-Host als ( )-Host verwenden möchten und dabei die lokalen ( ), ( ), ( ) usw. -Jverwenden möchten , sind einige Skripte erforderlich, anstatt nur die SSH-Konfigurationsdatei zu verwenden. Sie müssen zuerst eine Verbindung zum Jump-Host herstellen, die Remote-Host-Adresse von dort abrufen und sie dann in einer anderen SSH-Verbindung verwenden.IdentityFile-iForwardX11-XForwardX11Trusted-Y

MitSchlagdas wäre dann etwa:

#!/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"

ICHdenkenDies könnte sich in einePower ShellSkript unter Windows (nicht getestet):

$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"

verwandte Informationen