![So richten Sie eine SSH-Verbindung mit einem variablen Hostnamen ein, der vom Jump-Server bereitgestellt wird](https://rvso.com/image/789293/So%20richten%20Sie%20eine%20SSH-Verbindung%20mit%20einem%20variablen%20Hostnamen%20ein%2C%20der%20vom%20Jump-Server%20bereitgestellt%20wird.png)
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 ProxyCommand
läuft auf dem lokalen Computer, daher wird er nie command_to_get_the_hostname
auf dem Jump-Host ausgeführt. Um zuerst eine Verbindung zum Jump-Host herzustellen und dann den Befehl dort auszuführen, können Sie RemoteCommand
stattdessen 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_rsa
für den Remote-Host verwenden, aber der Jump-Host muss über den Schlüssel verfügen, da der zweite ssh
jetzt auf dem Jump-Host ausgeführt wird.
ProxyJump
& Skripting
ProxyJump
Wenn Sie den Jump-Host als ( )-Host verwenden möchten und dabei die lokalen ( ), ( ), ( ) usw. -J
verwenden 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
-i
ForwardX11
-X
ForwardX11Trusted
-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"