Como iterar através de hosts em .ssh / config

2

Em alguns dos meus servidores remotos eu uso o Git para manter os scripts comumente usados em sincronia. Eu gostaria de ter um script local que eu possa disparar para atualizar todos os servidores remotos que estão dentro de um intervalo de domínio. Aqui está o meu pseudo código:

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

Como eu faria isso elegantemente usando o script bash?

    
por mcnesium 08.05.2016 / 12:07

2 respostas

1

Experimente o seguinte script:

#!/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

Primeiro grep em for loop é capturar todas as linhas com Host e Hostname . Então tr está juntando todos eles juntos em uma linha. Então é uma questão de analisar cada palavra individual.

A análise de cada palavra reage às palavras Host e Hostname (insensivelmente quando nocasematch está ativado), quando essas palavras-chave são encontradas e, com base em seu tipo, elas são atribuídas a host e hostname variable . Como o valor para o nome do host é esperado para ser o último, estamos executando nosso comando lá, uma vez que o nome do host corresponde a uberspace.de . Depois que terminamos a análise do nome do host, desatribuímos os valores, para que possamos pegar o novo.

Para depurar o script, execute-o como: bash -x ./script.sh .

    
por 08.05.2016 / 13:52
0

Eu escrevi uma biblioteca Go que permite fazer isso: link

    
por 28.01.2018 / 19:06

Tags