sshfs в fstab: обращение к одному и тому же серверу через разные сети

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

1
22.06.2019, 20:42
2 ответа

Вы можете сделать это прозрачным для уровня монтирования -и выполнить сетевое перенаправление на 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.

1
27.01.2020, 23:30

У меня нет эквивалентной установки для тестирования, но я представляю, как она будет работать.

Сначала удалите строки в /etc/fstabдля этого крепления.

Тогда у вас будет по паре сервисов и монтирований, которые будут выглядеть следующим образом.

  1. Для внутренней сети:

    /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,...
    
  2. Для внешней сети:

    /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,...
    

Итак, порядок здесь такой:

  1. Оба крепления являются PartOfсоответствующей проверочной службой. Таким образом, если службы проверки остановлены или перезапущены, монтирование тоже.
  2. Обе службы проверки требуют соответствующих монтирований (, поэтому их запуск также приведет к запуску монтирования ), но монтирование начнется после их запуска.
  3. Обе службы проверки требуют и запускаются послеNetworkManager-wait-online-в Ubuntu, это должно заставить их ждать, пока какое-либо сетевое устройство не подключится к сети.
  4. Службы проверки конфликтуют друг с другом (, если одна запущена, другая останавливается ).
  5. Первая проверка запускает другую, если она не удалась.
  6. Проверка внутренней сети настроена на запуск по умолчанию(WantedBy=default.target)
  7. Обе проверки имеют RemainAfterExit=yes, чтобы они оставались активными (и не останавливались )после выхода команды проверки (это нужно в данном случае дляType=oneshot). Они должны выйти из строя или быть остановлены, чтобы маунты были остановлены.

Поток должен выглядеть следующим образом:

  1. Когда сеть подключена к сети, начинается внутренняя проверка IP-адреса.
  2. Если он завершится успешно, внутреннее монтирование должно запуститься и работать нормально (, иначе оно будет остановлено из-заPartOf).
  3. Если это не удается, начинается проверка внешнего IP-адреса. Соответственно внешнее монтирование должно запуститься и запуститься после проверки.

При переключении сетейвы, вероятно, сможете запустить соответствующую службу проверки, чтобы другой размонтировался.

Здесь вам придется поиграться с зависимостями, но, надеюсь, это будет хорошей отправной точкой.

Одно потенциальное изменение :вместо Type=oneshotи RemainAfterExit, вы можете использовать Type=simpleили Type=forkingи, возможно, иметь команду, которая периодически проверяет правильность сети (петля оболочки, например ).

1
27.01.2020, 23:30

Теги

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