如何遍历 .ssh/config 中的主机

如何遍历 .ssh/config 中的主机

在我的某些远程服务器上,我使用 Git 来保持常用脚本同步。我希望有一个本地脚本,可以触发该脚本来更新一个域范围内的所有远程服务器。这是我的伪代码:

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

我该如何使用 bash 脚本优雅地完成此操作?

答案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

首先,grepinfor循环捕获所有带有 和 的行HostHostname然后tr将它们全部合并为一行。接下来就是解析每个单词的问题。

解析每个单词时,会对单词Host和做出反应Hostname(当nocasematch为开启时不敏感),当找到这些关键词时,根据其类型将它们分配给hosthostname变量。由于主机名的值预计是最后一个,因此一旦主机名匹配,我们就会在那里执行命令uberspace.de。解析完主机名后,我们取消设置值,这样我们就可以选择新的值。

要调试脚本,请按如下方式运行:bash -x ./script.sh

答案2

我编写了一个 Go 库,可以让你做到这一点:https://github.com/kevinburke/ssh_config

相关内容