Как параметризовать опцию LocalForward в ssh_config?

Как параметризовать опцию LocalForward в ssh_config?

Я начну с этой полностью рабочей команды 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_configin /tmp/ssh_config, заменив каждое вхождение myportчисловым значением порта, которое вы указали в командной строке. После этого он fork- execсистемный вызов к реальной sshс вашей командной строкой. Если он создал свой собственный файл конфигурации, он добавляет -Fопцию в вашу командную строку, чтобы гарантировать sshчтение из недавно созданного файла конфигурации. Наконец, родительский процесс waits для 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]

Связанный контент