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

Изменитесь cd в функцию для выполнения реального cd и запущенный Ваш скрипт позже.

cd () {
    if builtin cd ${1:+"$@"} && [ -r ./set_foo_env.sh ]; then
        . ./set_foo_env.sh
    fi
}

Это предполагает что:

  1. set_foo_env.sh было бы характерно для сингла каталоги, и
  2. Это set_foo_env.sh должен изменить среду существующей оболочки.

Если Вы хотите находящийся на пути с глобальным файлом, то смотрите на вопрос, который manatwork упомянул (Выполните сценарии удара при вводе каталога).

4
12.07.2013, 04:37
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 командная строка и если это находит a -p опция, сопровождаемая числовой спецификацией порта, это создаст новое ssh_config в /tmp/ssh_config путем замены каждым возникновением myport с числовым значением порта Вы указываете на командной строке. После этого, это fork-execs системный вызов реального ssh с Вашей командной строкой. Если это создало свой собственный конфигурационный файл, Это добавляет a -F опция к Вашей командной строке для обеспечения ssh чтения от недавно созданного конфигурационного файла вместо этого. Наконец, родительский процесс waits для ssh ветвление для окончания, после которого это удаляет временный файл ssh конфигурационный файл.

Отказ от ответственности

Этот код не тестируется. Попробуйте на Ваш собственный риск. Создайте резервную копию своего конфигурационного файла сначала!

Править

Код, как ранее записано, порвет с "Ошибкой" спецификации неисправного порта, когда Вы не предоставите числовой порт через -p таким образом, я добавил код для комментария LocalForward часть в случае, если это не нужно. Я также удостоверился, что замена в файле конфигурации не произойдет, если не будет также a -N опция, потому что Вы могли бы хотеть указать порт через -p не требуя передающий (например, к ssh в поле, которое использует нестандартный порт).

3
27.01.2020, 20:58
  • 1
    Ничего себе! Я испытываю большое уважение и к Вам и к Linux... –  MountainX-for-Monica 12.07.2013, 09:21
  • 2
    @MountainX Видит обновленный ответ. скорость –  Joseph R. 12.07.2013, 16:49
  • 3
    благодарит за обновление. Я не знаю жемчуг, но с Вашим объяснением и прочтением Вашего кода, я чувствую себя довольным им теперь. И Ваше обновление помогает много, таким образом, я планирую использовать это решение. (Это - очень интересный подход.) –  MountainX-for-Monica 12.07.2013, 22:47

Теги

Похожие вопросы