在我的某些远程服务器上,我使用 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
首先,grep
infor
循环捕获所有带有 和 的行Host
。Hostname
然后tr
将它们全部合并为一行。接下来就是解析每个单词的问题。
解析每个单词时,会对单词Host
和做出反应Hostname
(当nocasematch
为开启时不敏感),当找到这些关键词时,根据其类型将它们分配给host
和hostname
变量。由于主机名的值预计是最后一个,因此一旦主机名匹配,我们就会在那里执行命令uberspace.de
。解析完主机名后,我们取消设置值,这样我们就可以选择新的值。
要调试脚本,请按如下方式运行:bash -x ./script.sh
。
答案2
我编写了一个 Go 库,可以让你做到这一点:https://github.com/kevinburke/ssh_config