.Ssh / config içindeki Hosts aracılığıyla yineleme


2

Uzak sunucularımın bazılarında, yaygın olarak kullanılan komut dosyalarını eşitlemek için Git'i kullanırım. Bir etki alanı aralığında bulunan tüm uzak sunucuları güncellemek için kullanabileceğim yerel bir komut dosyası kullanmak istiyorum. İşte sözde kodum:

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

Bunu bash betiğini kullanarak zarif bir şekilde nasıl yapabilirim?


~ Nedir? Bash'de, bu sizin ev dizininiz olacak. C, bu bit flip anlamına gelir. Tahminime göre matematikten bir anlam kastediyorsun: "yaklaşık olarak eşittir". Ancak, "yaklaşık" tanımlaması biraz daha zordur.
TOOGAM

Doğru, kod muhtemelen yeterince "sözde" değildi.
Amacımı

Yanıtlar:


1

Aşağıdaki betiği deneyin:

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

Öncelikle grepiçinde fordöngü ile tüm satırları yakalamaktır Hostve Hostname. O zaman trhepsini tek bir çizgide birleştiriyor. O zaman her bir kelimeyi ayrıştırma meselesi.

Her bir kelimeyi ayrıştırmak, kelimelere Hostve Hostname(açık olduklarında duyarsız bir şekilde nocasematch), bu anahtar kelimeler bulunduğunda, daha sonra atandıkları hostve hostnamedeğişkenine göre tepki verir . Ana bilgisayar adı değerinin en son olması beklendiğinden, ana bilgisayar adı eşleştikten sonra, komutumuzu orada yerine getiriyoruz uberspace.de. Ana bilgisayar adının ayrıştırılmasını bitirdikten sonra, değerleri ayarlayacağız, böylece yenisini alabilelim.

Senaryoyu hata ayıklamak için, olarak çalıştırın: bash -x ./script.sh.


Bu iyi çalışıyor, teşekkür ederim. Aslında ben henüz keşfedilmiş değil bazı gizli SSH özelliğini beklendiği, ancak bu süre kimse böyle bir şeyle gösterdiği gibi, bu kadar doğru cevabı :) kabul etmek sevindim
mcnesium

@mcnesium Başlangıçta böyle bir ssh özelliğini kontrol ettim, ancak bir şey bulamadım, bu yüzden ayrıştırmanız benim için biraz garip.
kenorb

1
Herhangi bir komutu tüm uzak ana bilgisayarlara iletebilmek için ssh -v $host "git -C bin pull"satırı değiştirdim ssh $host "$@";. Brilliant :)
mcnesium

Bu direktif dahil tanıtıcı gelmez
Cromax

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.