Изменитесь cd
в функцию для выполнения реального cd
и запущенный Ваш скрипт позже.
cd () {
if builtin cd ${1:+"$@"} && [ -r ./set_foo_env.sh ]; then
. ./set_foo_env.sh
fi
}
Это предполагает что:
set_foo_env.sh
было бы характерно для сингла каталоги, иset_foo_env.sh
должен изменить среду существующей оболочки.Если Вы хотите находящийся на пути с глобальным файлом, то смотрите на вопрос, который manatwork упомянул (Выполните сценарии удара при вводе каталога).
Не самый изящный путь, но вот то, как я сделал бы это:
Замените спецификации порта в своем исходном файле с уникальным шаблоном. Например:
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
-exec
s системный вызов реального ssh
с Вашей командной строкой. Если это создало свой собственный конфигурационный файл, Это добавляет a -F
опция к Вашей командной строке для обеспечения ssh
чтения от недавно созданного конфигурационного файла вместо этого. Наконец, родительский процесс wait
s для ssh
ветвление для окончания, после которого это удаляет временный файл ssh
конфигурационный файл.
Отказ от ответственности
Этот код не тестируется. Попробуйте на Ваш собственный риск. Создайте резервную копию своего конфигурационного файла сначала!
Править
Код, как ранее записано, порвет с "Ошибкой" спецификации неисправного порта, когда Вы не предоставите числовой порт через -p
таким образом, я добавил код для комментария LocalForward
часть в случае, если это не нужно. Я также удостоверился, что замена в файле конфигурации не произойдет, если не будет также a -N
опция, потому что Вы могли бы хотеть указать порт через -p
не требуя передающий (например, к ssh
в поле, которое использует нестандартный порт).