Como parametrizar a opção LocalForward em ssh_config?

4

Estou começando com este comando ssh totalmente funcional:

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

Essa configuração me faz parte da simplificação que eu procuro:

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

Eu posso me conectar com este comando, o que é muito melhor:

$ ssh -f -N tunnel

Minha pergunta atual é como posso parametrizá-lo para que eu possa fazer isso (ou algo semelhante):

$ ssh -f -N tunnel -p 3306

ou:

$ ssh -f -N tunnel -p 5678

BTW, no meu exemplo acima eu estou usando o mesmo número de porta em ambos os lugares de propósito. É disso que preciso neste caso. (Mas eu também gostaria de saber como parametrizá-lo se as portas forem diferentes).

O que eu tentei até agora:

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

Isso dá o erro:

ssh/config Bad forwarding specification

Referência: link

    
por MountainX 12.07.2013 / 03:37

1 resposta

3

Não é a maneira mais elegante, mas aqui está como eu faria:

  • Substitua as especificações de porta em seu arquivo original por um padrão exclusivo. Por exemplo:

    LocalForward myport localhost:myport
    
  • Alias ssh de dentro do seu .bashrc :

    alias ssh='/path/to/ssh_wrapper.pl'
    
  • Escreva o arquivo /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';
    

    Basicamente, isso analisará sua linha de comando ssh e, se encontrar uma opção -p seguida por uma especificação de porta numérica, criará um novo ssh_config in /tmp/ssh_config substituindo cada ocorrência de myport com o valor da porta numérica especificado na linha de comando. Depois disso, fork - exec s uma chamada de sistema para o% realssh com sua linha de comando. Se ele criou seu próprio arquivo de configuração, ele adiciona uma opção -F à sua linha de comando para garantir que ssh leia o arquivo de configuração recém-criado. Finalmente, o processo pai wait s para a bifurcação ssh terminar, após o qual remove o arquivo de configuração ssh temporário.

Aviso de isenção

Este código não foi testado. Tente por sua conta e risco. Faça o backup do seu arquivo de configuração primeiro!

Editar

O código, como foi escrito anteriormente, quebrará com um erro "Bad port specification" quando você não fornecer uma porta numérica via -p , então eu adicionei código para comentar a parte LocalForward caso não seja necessário. Também assegurei que a substituição no arquivo de configuração não ocorreria a menos que também houvesse uma opção -N , porque você pode querer especificar uma porta via -p sem precisar de encaminhamento (por exemplo, para ssh em uma caixa que usa um porta não padrão).

    
por 12.07.2013 / 05:01