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 novossh_config
in/tmp/ssh_config
substituindo cada ocorrência demyport
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 quessh
leia o arquivo de configuração recém-criado. Finalmente, o processo paiwait
s para a bifurcaçãossh
terminar, após o qual remove o arquivo de configuraçãossh
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).