¿Cómo parametrizar la opción LocalForward en ssh_config?

¿Cómo parametrizar la opción LocalForward en ssh_config?

Estoy empezando con este comando ssh completamente funcional:

$ ssh -fNL 3306:localhost:3306 [email protected]

Esta configuración me da parte de la simplificación que busco:

Host tunnel
    HostName database.example.com
    IdentityFile ~/.ssh/coolio.example.key
    LocalForward 3306 localhost:3306
    User coolio

Puedo conectarme con este comando, que es mucho mejor:

$ ssh -f -N tunnel

Mi pregunta actual es ¿cómo puedo parametrizarlo para poder hacer esto (o similar):

$ ssh -f -N tunnel -p 3306

o:

$ ssh -f -N tunnel -p 5678

Por cierto, en mi ejemplo anterior, estoy usando el mismo número de puerto en ambos lugares a propósito. Eso es lo que necesito en este caso. (Pero también me gustaría saber cómo parametrizarlo si los puertos son diferentes).

Lo que probé hasta ahora:

Host tunnel
    HostName database.example.com
    IdentityFile ~/.ssh/coolio.example.key
    LocalForward %p localhost:%p
    User coolio

Esto da el error:

ssh/config Mala especificación de reenvío

Referencia:
http://nerderati.com/2011/03/simplify-your-life-with-an-ssh-config-file/

Respuesta1

No es la forma más elegante, pero así es como lo haría:

  • Reemplace las especificaciones del puerto en su archivo original con un patrón único. Por ejemplo:

    LocalForward myport localhost:myport
    
  • Alias ssh​​desde dentro de su .bashrc:

    alias ssh='/path/to/ssh_wrapper.pl'
    
  • Escribe el archivo /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';
    

    Básicamente, esto analizará su sshlínea de comando y si encuentra una -popción seguida de una especificación de puerto numérico, creará una nueva ssh_configentrada /tmp/ssh_configsustituyendo cada aparición de myportcon el valor de puerto numérico que especifique en la línea de comando. Después de eso, es forkuna execllamada al sistema real sshcon su línea de comando. Si creó su propio archivo de configuración, agrega una -Fopción a su línea de comando para garantizar sshlecturas del archivo de configuración recién creado. Finalmente, el proceso principal waitsolicita sshque finalice la bifurcación, después de lo cual elimina el ssharchivo de configuración temporal.

Descargo de responsabilidad

Este código no está probado. Pruébalo bajo tu propia responsabilidad. ¡Primero haga una copia de seguridad de su archivo de configuración!

Editar

El código escrito anteriormente se interrumpirá con un error de "Especificación de puerto incorrecta" cuando no proporcione un puerto numérico, -ppor lo que agregué código para comentar la LocalForwardparte en caso de que no sea necesario. También me aseguré de que la sustitución en el archivo de configuración no ocurra a menos que también haya una -Nopción porque es posible que desee especificar un puerto -psin requerir reenvío (por ejemplo, ssha un cuadro que usa un puerto no estándar).

Respuesta2

Una forma más sencilla de hacerlo fue simplemente crear una función en mi .bashrc

sshfw () {
    ssh -fNL "$1":localhost:"$1" "$2"
}

Ahora puedo hacer

sshfw 8890 [email protected]

información relacionada