Wie parametrisiere ich die Option „LocalForward“ in ssh_config?

Wie parametrisiere ich die Option „LocalForward“ in ssh_config?

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 sshBefehlszeile und wenn es eine -pOption findet, der eine numerische Portangabe folgt, wird eine neue erstellt, ssh_configindem /tmp/ssh_configjedes Vorkommen von myportdurch den numerischen Portwert ersetzt wird, den Sie in der Befehlszeile angeben. Danach führt es einen forkSystemaufruf execan den real sshmit Ihrer Befehlszeile aus. Wenn es seine eigene Konfigurationsdatei erstellt hat,-F fügt es Ihrer Befehlszeile eine Option hinzu, um sicherzustellen ssh, dass stattdessen aus der neu erstellten Konfigurationsdatei gelesen wird. Schließlich waitwartet der übergeordnete Prozess, bis der sshFork abgeschlossen ist, und entfernt danach die temporäre sshKonfigurationsdatei.

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 -phabe ich Code hinzugefügt, um den LocalForwardTeil 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 -NOption, weil Sie vielleicht einen Port angeben möchten, -pohne dass eine Weiterleitung erforderlich ist (z. B. sshin 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]

verwandte Informationen