如何通过.ssh / config中的主机进行迭代


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脚本优雅地做到这一点?


什么〜在Bash中,这将是您的主目录。在C语言中,这意味着翻转。我的猜测是您的意思是数学上的意思:“大约等于”。但是,“近似”有点难以定义。
TOOGAM

是的,代码可能不够“伪”。更改它以阐明我的观点
mcnesium '16

Answers:


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将它们全部连接在一起。然后是解析每个单词的问题。

解析每个单词会对单词做出反应,Host并且Hostname(在nocasematch打开时不敏感地)在找到这些关键字时对其进行响应,然后根据其类型将其分配给hosthostname变量。由于主机名的值应该是最后一个,因此一旦主机名匹配,我们就在此处执行命令uberspace.de。主机名解析完成后,我们将取消设置值,因此可以选择新的值。

要调试脚本,请以方式运行它bash -x ./script.sh


效果很好,谢谢。实际上,我期望有一个尚未发现的秘密ssh功能,但是只要没人出现类似的东西,我很高兴接受这个作为正确的答案:)
mcnesium

@mcnesium我最初已经检查过这种ssh功能,但是我找不到任何功能,所以对我来说,您必须解析它也有点奇怪。
kenorb '16

1
我只是将ssh -v $host "git -C bin pull"行更改为仅ssh $host "$@";能够将任何命令传递给所有远程主机。辉煌:)
镁'16

它不处理Include指令
-Cromax,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.