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
sshde 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
sshe, se encontrar uma opção-pseguida por uma especificação de porta numérica, criará um novossh_configin/tmp/ssh_configsubstituindo cada ocorrência demyportcom o valor da porta numérica especificado na linha de comando. Depois disso,fork-execs uma chamada de sistema para o% realsshcom 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 quesshleia o arquivo de configuração recém-criado. Finalmente, o processo paiwaits para a bifurcaçãosshterminar, após o qual remove o arquivo de configuraçãosshtemporá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).