Como parametrizar a opção LocalForward no ssh_config?

Como parametrizar a opção LocalForward no ssh_config?

Estou começando com este comando ssh totalmente funcional:

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

Essa configuração me dá parte da simplificação que procuro:

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

Posso me conectar com este comando, que é muito melhor:

$ ssh -f -N tunnel

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

$ ssh -f -N tunnel -p 3306

ou:

$ ssh -f -N tunnel -p 5678

Aliás, no meu exemplo acima, estou usando o mesmo número de porta em ambos os lugares de propósito. É disso que preciso neste caso. (Mas também gostaria de saber como parametrizá-lo caso as portas sejam 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 Especificação de encaminhamento incorreta

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

Responder1

Não é a maneira mais elegante, mas eis como eu faria:

  • Substitua as especificações da porta no 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 sshlinha de comando e, se encontrar uma -popção seguida por uma especificação de porta numérica, criará uma nova ssh_configentrada /tmp/ssh_configsubstituindo cada ocorrência de myportpelo valor numérico da porta especificado na linha de comando. Depois disso, é forkuma execchamada do sistema para o real sshcom sua linha de comando. Se ele criou seu próprio arquivo de configuração, ele adiciona uma -Fopção à sua linha de comando para garantir ssha leitura do arquivo de configuração recém-criado. Finalmente, o processo pai waitpede para a sshbifurcação terminar, após o que ele remove o ssharquivo de configuração temporário.

Isenção de responsabilidade

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

Editar

O código, conforme escrito anteriormente, apresentará um erro de "Especificação de porta incorreta" quando você não fornecer uma porta numérica, -pentão adicionei código para comentar a LocalForwardparte, caso não seja necessário. Também me certifiquei de que a substituição no arquivo de configuração não ocorrerá, a menos que haja também uma -Nopção, porque você pode querer especificar uma porta -psem exigir encaminhamento (por exemplo, para sshuma caixa que usa uma porta não padrão).

Responder2

Uma maneira mais simples de fazer isso foi apenas criar uma função no meu .bashrc

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

Agora posso apenas fazer

sshfw 8890 [email protected]

informação relacionada