Как настроить ~/.ssh/config таким образом, чтобы `ssh foo.bar `приводило к подключению к `foo.internal.bar `?

"Эффективное программирование AWK" мне очень помогло.

awk работает по правилам, правила состоят из одного шаблона и одного действия, вы можете опустить любое из них, но не оба. BEGIN и END — шаблон, {...} — действие. действие будет выполнено, если оно не имеет шаблона или соответствует шаблону.

awk 'BEGIN      {FS=OFS=","}      {print $1}'
     ^pattern + ^action           ^ action without pattern

awk '{ FS = "," }         ;        { print $1 }'
     ^action without pattern       ^ another action without pattern

В обычной программе awk:

  • BEGIN{...} выполняется перед любой записью, здесь вы можете инициализировать все, что вам нужно.
  • pattern{...} выполняется для каждой записи, это основной цикл
  • END{...} выполняется после последней записи. Основной цикл завершен, вы получаете все данные на руки, можете делать все, что хотите.
0
18.04.2020, 21:43
2 ответа

Я нашел рабочий метод. Это немного некрасиво, но это работает. Это использует директиву ProxyCommand(см. справочную страницу)в сочетании с небольшим вспомогательным сценарием bash.

  1. Добавьте такие разделы в~/.ssh/config — по одному для каждого домена, который вы хотите переназначить:
Match final host="!*.corp.foo.com,*.foo.com"
    ProxyCommand ssh_ext2int %h %p

Match final host="*.quux.biz"
    ProxyCommand ssh_ext2int %h %p
  1. Сохраните это в вашем $PATHгде-нибудь как ssh _ext2int — и chmod u+xэто:
#!/usr/bin/env bash

[ $# -eq 2 ] || exit 1
typeset -A dmap
dmap=(
  [foo.com]=corp.foo.com
  [quux.biz]=internal.qux.lan
)

d=${1#*.}
h=${1%%.*}
nd=${dmap[$d]:-$d}

/usr/bin/nc -w 120 $h.$nd $2 2>/dev/null

Теперь ssh server158247.quux.bizдолжен соединить вас сserver158247.internal.qux.lan

0
19.03.2021, 02:27

Эта конкретная вещь, о которой вы просите, невозможна с OpenSSH. Эти конструкции действительно предназначены только для простых псевдонимов, а не для сложных замен, как вы просите. Если эти серверы имеют какой-то определенный формат, вы можете сделать их псевдонимами (без имени домена):

Host server*
    Hostname %h.internal.foo.bar

Если вам нужны более сложные совпадения для псевдонимов, (скажем, у вас есть файл, содержащий все ваши хосты. Это может быть либо создано вручную, либо автоматически обновлено из DNS ), вы можете использовать что-то вроде этого

Match exec "grep %h %d/.ssh/internal_hosts"
    Hostname %h.internal.foo.bar

В крайнем случае сгенерируйте конфигурацию ssh _из приведенного выше списка/DNS, которая будет иметь все жестко закодированные элементы для всех ваших хостов. Это не обязательно должен быть основной файл конфигурации, а просто какой-то включенный. Файлы конфигурации - это просто текстовые файлы.

0
19.03.2021, 02:27

Теги

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