
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
ssh
línea de comando y si encuentra una-p
opción seguida de una especificación de puerto numérico, creará una nuevassh_config
entrada/tmp/ssh_config
sustituyendo cada aparición demyport
con el valor de puerto numérico que especifique en la línea de comando. Después de eso, esfork
unaexec
llamada al sistema realssh
con su línea de comando.Si creó su propio archivo de configuración,agrega una-F
opción a su línea de comando para garantizarssh
lecturas del archivo de configuración recién creado. Finalmente, el proceso principalwait
solicitassh
que finalice la bifurcación, después de lo cual elimina elssh
archivo 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, -p
por lo que agregué código para comentar la LocalForward
parte 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 -N
opción porque es posible que desee especificar un puerto -p
sin requerir reenvío (por ejemplo, ssh
a 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]