
Я начну с этой полностью рабочей команды ssh:
$ ssh -fNL 3306:localhost:3306 [email protected]
Эта конфигурация обеспечивает мне часть упрощения, к которому я стремлюсь:
Host tunnel
HostName database.example.com
IdentityFile ~/.ssh/coolio.example.key
LocalForward 3306 localhost:3306
User coolio
Я могу подключиться с помощью этой команды, которая намного лучше:
$ ssh -f -N tunnel
Мой текущий вопрос заключается в том, как мне параметризовать его, чтобы можно было сделать следующее (или подобное):
$ ssh -f -N tunnel -p 3306
или:
$ ssh -f -N tunnel -p 5678
Кстати, в моем примере выше я намеренно использую один и тот же номер порта в обоих местах. Это то, что мне нужно в данном случае. (Но я также хотел бы знать, как его параметризовать, если порты разные.)
Что я уже попробовал:
Host tunnel
HostName database.example.com
IdentityFile ~/.ssh/coolio.example.key
LocalForward %p localhost:%p
User coolio
Это приводит к ошибке:
ssh/config Неправильная спецификация переадресации
Ссылка:
http://nerderati.com/2011/03/simplify-your-life-with-an-ssh-config-file/
решение1
Не самый элегантный способ, но вот как бы я это сделал:
Замените спецификации портов в исходном файле уникальным шаблоном. Например:
LocalForward myport localhost:myport
Псевдоним
ssh
из вашего.bashrc
:alias ssh='/path/to/ssh_wrapper.pl'
Запишите файл
/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';
По сути, это проанализирует вашу
ssh
командную строку, и если он найдет-p
опцию, за которой следует числовая спецификация порта, он создаст новыйssh_config
in/tmp/ssh_config
, заменив каждое вхождениеmyport
числовым значением порта, которое вы указали в командной строке. После этого онfork
-exec
системный вызов к реальнойssh
с вашей командной строкой.Если он создал свой собственный файл конфигурации,он добавляет-F
опцию в вашу командную строку, чтобы гарантироватьssh
чтение из недавно созданного файла конфигурации. Наконец, родительский процессwait
s дляssh
завершения ветвления, после чего он удаляет временныйssh
файл конфигурации.
Отказ от ответственности
Этот код не проверен. Пробуйте на свой страх и риск. Сначала сделайте резервную копию файла конфигурации!
Редактировать
Код, как он был написан ранее, будет прерываться с ошибкой "Bad port specification", если вы не укажете числовой порт via, -p
поэтому я добавил код, чтобы закомментировать LocalForward
часть на случай, если она не нужна. Я также убедился, что подстановка в файле конфигурации не произойдет, если только не будет также указана опция, -N
поскольку вы можете захотеть указать порт via -p
без необходимости переадресации (например, ssh
в ящик, который использует нестандартный порт).
решение2
Более простой способ, которым я пошел, — просто создать функцию в моем .bashrc
sshfw () {
ssh -fNL "$1":localhost:"$1" "$2"
}
Теперь я могу просто сделать
sshfw 8890 [email protected]