bash
entiende expresiones regulares extendidas estándar ("ERE" ), no PCRE ("Expresiones regulares compatibles con Perl -" ).
Su PCRE:
cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(?:-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD))-[a-z]
El (?:...)
en un PCRE no es un -grupo de captura (ni un grupo opcional ). No hay equivalente en un ERE y todos los grupos son de captura.
Para hacer que una expresión sea opcional, puede calificarla con ?
, como he hecho a continuación. El ?
significa que la expresión anterior debe coincidir una o cero veces.
Como ERE:
cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)(DEV|DEVL|SANDP|CAT|(SIT[a-z]|SIT[1-9])|TAT|PROD)?-[a-z]
o, contrayendo (SIT[a-z]|SIT[1-9])
en SIT[a-z1-9]
,
cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]
También puede agregar anclaje a esto:
^cell-(90|855|80|70)-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD)(-(DEV|DEVL|SANDP|CAT|SIT[a-z1-9]|TAT|PROD))?-[a-z]$
... de lo contrario coincidiríasomethingcell-...-ablahblah
Вы можете сделать это прозрачным для уровня монтирования -и выполнить сетевое перенаправление на 2 разных имени хоста на уровне ~/.ssh/config
.
В ~/.ssh/config
для монтажника:
Match host MyServerAlias exec "<shell command to return true if in local LAN>"
Hostname Local.IP.or.hostname
Host MyServerAlias
Hostname external.hostname
Port <External Port for SSH-Forward on Home Router>
Таким образом, при монтировании вы просто используете одну строку с именем хоста MyServerAlias
, и слой ssh автоматически подключится к правильному URI ssh.
Магия кроется в ключевом слове Match
, оно может связать серию команд оболочки и будет применять строки следующего блока только в том случае, если цепочка оболочки возвратила true
.
Вы можете использовать, например,. exec "timeout 0.4 nc -z %h %p 2>/dev/null"
в строке соответствия, чтобы проверить, доступен ли локальный ip и порт MyServerAlias.
Я использую (более сложную версию с интегрированным портом -, выбивая )это уже несколько лет, с тех пор, как ssh
получил match
.
С помощью afuse+sshfs
автомонтирования -, настроенного через пользовательское устройство Systemd(или через ~/.profile ), это отлично подходит для использования на ноутбуке. (и не возиться сfstab
)
Вот сообщение в блоге -с дополнительной информацией о ключевом слове Match
.
У меня нет эквивалентной установки для тестирования, но я представляю, как она будет работать.
Сначала удалите строки в /etc/fstab
для этого крепления.
Тогда у вас будет по паре сервисов и монтирований, которые будут выглядеть следующим образом.
Для внутренней сети:
/etc/systemd/system/int-ip-check.service
:
[Unit]
Description=Check for internal network
Type=oneshot
Requires=NetworkManager-wait-online.service
After=NetworkManager-wait-online.service
OnFailure=ext-ip-check.service
Conflicts=ext-ip-check.service
Wants=int-ip.mount
Before=int-ip.mount
[Service]
ExecStartPre=<command to check for internal network>
RemainAfterExit=yes
[Install]
WantedBy=default.target
/etc/systemd/system/int-ip.mount
:
[Unit]
Documentation=SSHFS mount (internal IP)
PartOf=int-ip-check.service
[Mount]
Where=/some/path
What=user@int-ip:/some/path
Type=fuse.sshfs
Options=noauto,_netdev,...
Для внешней сети:
/etc/systemd/system/ext-ip-check.service
:
[Unit]
Description=Check for external network
Type=oneshot
Requires=NetworkManager-wait-online.service
After=NetworkManager-wait-online.service
Wants=ext-ip.mount
Before=ext-ip.mount
[Service]
ExecStartPre=<command to check for external network>
RemainAfterExit=yes
/etc/systemd/system/ext-ip.mount
:
[Unit]
Documentation=SSHFS mount (external IP)
PartOf=ext-ip-check.service
[Mount]
Where=/some/path
What=user@int-ip:/some/path
Type=fuse.sshfs
Options=noauto,_netdev,...
Итак, порядок здесь такой:
PartOf
соответствующей проверочной службой. Таким образом, если службы проверки остановлены или перезапущены, монтирование тоже. NetworkManager-wait-online
-в Ubuntu, это должно заставить их ждать, пока какое-либо сетевое устройство не подключится к сети. WantedBy=default.target
)RemainAfterExit=yes
, чтобы они оставались активными (и не останавливались )после выхода команды проверки (это нужно в данном случае дляType=oneshot
). Они должны выйти из строя или быть остановлены, чтобы маунты были остановлены. Поток должен выглядеть следующим образом:
PartOf
). При переключении сетейвы, вероятно, сможете запустить соответствующую службу проверки, чтобы другой размонтировался.
Здесь вам придется поиграться с зависимостями, но, надеюсь, это будет хорошей отправной точкой.
Одно потенциальное изменение :вместо Type=oneshot
и RemainAfterExit
, вы можете использовать Type=simple
или Type=forking
и, возможно, иметь команду, которая периодически проверяет правильность сети (петля оболочки, например ).