
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
ssh
linha de comando e, se encontrar uma-p
opção seguida por uma especificação de porta numérica, criará uma novassh_config
entrada/tmp/ssh_config
substituindo cada ocorrência demyport
pelo valor numérico da porta especificado na linha de comando. Depois disso, éfork
umaexec
chamada do sistema para o realssh
com sua linha de comando.Se ele criou seu próprio arquivo de configuração,ele adiciona uma-F
opção à sua linha de comando para garantirssh
a leitura do arquivo de configuração recém-criado. Finalmente, o processo paiwait
pede para assh
bifurcação terminar, após o que ele remove ossh
arquivo 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, -p
então adicionei código para comentar a LocalForward
parte, 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 -N
opção, porque você pode querer especificar uma porta -p
sem exigir encaminhamento (por exemplo, para ssh
uma 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]