.ssh / configでホストを反復処理する方法


2

一部のリモートサーバーでは、Gitを使用して、よく使用されるスクリプトの同期を維持しています。1つのドメイン範囲内にあるすべてのリモートサーバーを更新するために起動できるローカルスクリプトが必要です。私の擬似コードは次のとおりです。

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

これをbashスクリプトを使用してエレガントに行うにはどうすればよいですか?


〜とは?Bashでは、それがホームディレクトリになります。Cでは、ビットフリップを意味します。私の推測では、あなたは数学からの意味を意味していました:「ほぼ等しい」。しかし、「おおよそ」を定義するのは少し難しいです。
TOOGAM

そうです、コードはおそらく「疑似」ではありませんでした。私のポイントを明確にするためにそれを変更しました
-mcnesium

回答:


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

最初grepforループしてすべての行をキャッチすることですHostHostname。次にtr、それらをすべて1行に結合します。次に、個々の単語を解析します。

各単語は単語に反応の解析HostHostname(とき小文字を区別せずnocasematchにある)これらのキーワードが発見された場合、その後、彼らはに割り当てられているそのタイプに基づいてhost、およびhostname変数。ホスト名の値は最後であると予想されるため、ホスト名が一致すると、そこでコマンドを実行しますuberspace.de。ホスト名の解析が終了したら、値を設定解除して、新しい値を取得できるようにします。

スクリプトをデバッグするには、次のように実行しますbash -x ./script.sh


これは正常に動作します、ありがとう。実際、私はまだ発見していない秘密のssh機能を期待していましたが、そのようなものが
誰も現れ

@mcnesium最初にそのようなssh機能をチェックしましたが、何も見つかりませんでしたので、それを解析するのは私にとっても少し奇妙です。
ケノーブ

1
すべてのリモートホストにコマンドを渡すことができるように、ssh -v $host "git -C bin pull"行を変更しましたssh $host "$@";。ブリリアント:)
マグネシウム2016年

Includeディレクティブを処理しません
Cromax

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.