
Ich beginne mit diesem voll funktionsfähigen SSH-Befehl:
$ ssh -fNL 3306:localhost:3306 [email protected]
Diese Konfiguration verschafft mir einen Teil der Vereinfachung, die ich anstrebe:
Host tunnel
HostName database.example.com
IdentityFile ~/.ssh/coolio.example.key
LocalForward 3306 localhost:3306
User coolio
Ich kann mit diesem Befehl eine Verbindung herstellen, was viel besser ist:
$ ssh -f -N tunnel
Meine aktuelle Frage ist, wie ich es parametrisieren kann, damit ich dies (oder etwas Ähnliches) tun kann:
$ ssh -f -N tunnel -p 3306
oder:
$ ssh -f -N tunnel -p 5678
Übrigens verwende ich in meinem Beispiel oben absichtlich an beiden Stellen dieselbe Portnummer. Das ist, was ich in diesem Fall brauche. (Aber ich würde auch gerne wissen, wie ich es parametrisiere, wenn die Ports unterschiedlich sind.)
Was ich bisher versucht habe:
Host tunnel
HostName database.example.com
IdentityFile ~/.ssh/coolio.example.key
LocalForward %p localhost:%p
User coolio
Dies führt zu folgendem Fehler:
ssh/config Falsche Weiterleitungsspezifikation
Referenz:
http://nerderati.com/2011/03/simplify-your-life-with-an-ssh-config-file/
Antwort1
Nicht die eleganteste Art, aber so würde ich es machen:
Ersetzen Sie die Port-Spezifikationen in Ihrer Originaldatei durch ein eindeutiges Muster. Beispiel:
LocalForward myport localhost:myport
Alias
ssh
aus Ihrem.bashrc
:alias ssh='/path/to/ssh_wrapper.pl'
Schreiben Sie die Datei
/path/to/ssh_wrapper.pl
:#!/usr/bin/perl use strict; use warnings; my $cmdline = join ' ',@ARGV; if($cmdline =~ / -p\s*([0-9]+)\b/ and $cmdline=~ / -N/){ my $port = $1; system("sed 's/myport/$port/g' /etc/ssh/ssh_config > /tmp/ssh_config"); } else{ system("sed 's/LocalForward/#LocalForward/' /etc/ssh/ssh_config > /tmp/ssh_config"); } $cmdline .= ' -F /tmp/ssh_config'; my $pid = fork; $pid ? wait : exec("/usr/bin/ssh $cmdline"); unlink '/tmp/ssh_config';
Im Grunde analysiert dies Ihre
ssh
Befehlszeile und wenn es eine-p
Option findet, der eine numerische Portangabe folgt, wird eine neue erstellt,ssh_config
indem/tmp/ssh_config
jedes Vorkommen vonmyport
durch den numerischen Portwert ersetzt wird, den Sie in der Befehlszeile angeben. Danach führt es einenfork
Systemaufrufexec
an den realssh
mit Ihrer Befehlszeile aus.Wenn es seine eigene Konfigurationsdatei erstellt hat,-F
fügt es Ihrer Befehlszeile eine Option hinzu, um sicherzustellenssh
, dass stattdessen aus der neu erstellten Konfigurationsdatei gelesen wird. Schließlichwait
wartet der übergeordnete Prozess, bis derssh
Fork abgeschlossen ist, und entfernt danach die temporäressh
Konfigurationsdatei.
Haftungsausschluss
Dieser Code wurde nicht getestet. Versuchen Sie es auf eigene Gefahr. Sichern Sie vorher Ihre Konfigurationsdatei!
Bearbeiten
Der zuvor geschriebene Code wird mit einem „Falsche Port-Spezifikation“-Fehler abgebrochen, wenn Sie keinen numerischen Port angeben, also -p
habe ich Code hinzugefügt, um den LocalForward
Teil auszukommentieren, falls er nicht benötigt wird. Ich habe auch sichergestellt, dass die Ersetzung in der Konfigurationsdatei nicht erfolgt, es sei denn, es gibt auch eine -N
Option, weil Sie vielleicht einen Port angeben möchten, -p
ohne dass eine Weiterleitung erforderlich ist (z. B. ssh
in eine Box, die einen nicht standardmäßigen Port verwendet).
Antwort2
Ein einfacherer Weg, dies zu erreichen, bestand darin, einfach eine Funktion in meiner .bashrc zu erstellen
sshfw () {
ssh -fNL "$1":localhost:"$1" "$2"
}
Jetzt kann ich einfach tun
sshfw 8890 [email protected]