我编写了一个脚本,用于查询 AWS Route53 上的 dns 区域并返回特定服务器的 IP。
目的是在启动 CloudFormation 堆栈后运行此脚本,并且该脚本将更新我的本地~/.ssh/config
包含更新的服务器 IP 的文件。
我想“捕获”配置中以 HostName 开头但与我要编辑的服务器的主机名相关的行,因此我运行了以下命令:
$ grep -A2 dev-api2.company-private ~/.ssh/config
Host dev-api2.company-private
User ec2-user
HostName 5.5.5.5
接下来,我跑了:
$ for line in $(grep -A2 dev-api2.company-private ~/.ssh/config); do echo $line ; done
Host
dev-api2.company-private
User
ec2-user
HostName
5.5.5.5
由于某种原因,输出的打印不符合我的预期,它将每个单词分成单独的行,但为什么会发生这种情况?
编辑#1:
我的想法是做类似的事情:
for line in $(grep -A2 dev-api2.company-private ~/.ssh/config)
do
if [[ $line == "^HostName.*" ]]
then
sed -i 's!$line!HostName 1.1.1.1!g' ~/.ssh/config
fi
done
编辑#2:
好的,所以相关部分~/.ssh/config
文件看起来像这样:
Host as-bastion
User ec2-user
HostName ec2-34.us-west-2.compute.amazonaws.com
IdentityFile ~/.ssh/company/bastion.pem
Host dev-api1.company-private
User ec2-user
HostName 172.51.24.171
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
Host dev-api2.company-private
User ec2-user
HostName 172.51.25.248
IdentityFile ~/.ssh/company/company.pem
ProxyCommand ssh ec2-user@as-bastion -W %h:%p
该文件包含许多与上面类似的块,但我只想 sed 只包含我在 grep (dev-api2.company-private) 中使用的字符串的块的“HostName”行。
@anubhava:您答案中的代码更改了包含字符串“HostName”的行,即使在与“dev-api2.company-private”无关的块中也是如此。
如何做呢?