2

На некоторых из моих удаленных серверов я использую Git для синхронизации часто используемых скриптов. Я хотел бы иметь локальный скрипт, который я могу запустить, чтобы обновить все удаленные серверы, которые находятся в одном доменном диапазоне. Вот мой псевдокод:

for every Host in .ssh/config do
    if Hostname is similar to *.uberspace.de
        ssh Host git -C bin pull
    fi
done

Как бы я сделал это элегантно, используя скрипт bash?

2 ответа2

1

Попробуйте следующий скрипт:

#!/usr/bin/env bash
shopt -s nocasematch
for word in $(grep -i "^[^#\S]*Host\(name\)\?" ~/.ssh/config | paste -s -); do
  case "$word" in
    "Host")
      type=host
      ;;
    "Hostname")
      type=hostname
      ;;
    *)
      case "$type" in
        "host")
          host=$word
        ;;
        "hostname")
          hostname=$word
          if [[ "$hostname" == *uberspace.de ]]; then
            ssh -v $host "git -C bin pull" # Connecting to $hostname
          fi
          unset host hostname
        ;;
      esac
  esac
done

Первый цикл grep for - перехватывать все строки с помощью Host и Hostname . Затем tr соединяет их все вместе в одну строку. Тогда это вопрос парсинга каждого отдельного слова.

Разбор каждого слова реагирует на слова Host и Hostname (нечувствительно, когда nocasematch ), когда эти ключевые слова найдены, то в зависимости от их типа они присваиваются переменной host и hostname . Поскольку ожидается, что значение для имени хоста будет последним, мы выполняем нашу команду там, как только имя хоста uberspace.de . После того, как мы закончим разбор имени хоста, мы сбрасываем значения, чтобы мы могли подобрать новое.

Чтобы отладить скрипт, запустите его как: bash -x ./script.sh .

0

Я написал библиотеку Go, которая позволяет вам сделать это: https://github.com/kevinburke/ssh_config

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .