使用bashshell脚本在.ssh/config文件中的特定行之后追加行



让我重新表述一下整个问题。我已经使用以下脚本获得了所有vpc的配置文件

#!/bin/bash
VPC="$(aws ec2 describe-vpcs | jq -r '.Vpcs[] | .VpcId')"
for x in $VPC
do
echo $x
aws ec2 describe-instances --filters "Name=vpc-id,Values=$x" | jq -r '.Reservations[].Instances[] | (.Tags[]//[]|select(.Key=="Name")|.Value) as $name | "Host ($name) nHostname (.PrivateIpAddress)"'
done

这给了我输出vpc-wise的主机和主机名,就像这个

vpc-agdh5j6j
Host remote-server1
Hostname 123.45.6.6
Host remote-server2
Hostname 456.4.56.7
vpc-guh5jk6y
Host remote-server3
Hostname 245.24.789.9
Host remote-server4
Hostname 457.87.1.7
.
.
.

等等现在,我将这个输出保存到一个文件中,并尝试在文件中Hostname的任何位置添加一行。

#!/bin/bash
echo "user         : "$1
VPC="$(aws ec2 describe-vpcs | jq -r '.Vpcs[] | .VpcId')"
for x in $VPC
do
echo $x
aws ec2 describe-instances --filters "Name=vpc-id,Values=$x" | jq -r '.Reservations[].Instances[] | (.Tags[]//[]|select(.Key=="Name")|.Value) as $name | "Host ($name) nHostname (.PrivateIpAddress)"' > config.txt
sed -i '/^Hostname.*/a Usert$1' config.txt
cat config.txt
done

在这里,user作为参数传递,并如上所述传递给脚本。它不是取给"0"的输入值;用户";并且仅在输出中显示为$1。它给出的输出如下。

vpc-agdh5j6j
Host remote-server1
Hostname 123.45.6.6
User $1
Host remote-server2
Hostname 456.4.56.7
User $1
vpc-guh5jk6y
Host remote-server3
Hostname 245.24.789.9
User $1
Host remote-server4
Hostname 457.87.1.7
User $1
.
.
so on

它不接受参数中给定的值。

可能不是100%适合,因为您的需求有点不清楚,但这应该会让您开始。

sed "s/^ *(HostName .*)/    1n    User ${username}n    ProxyJump ${jump}n/" ~/.ssh/config

检查输出是否如您所愿,然后将-i添加到sed以进行适当的更改。

逻辑:

  • s/—搜索/替换
  • ^ *(HostName .*)—要操作的行
    • ^ *—行的开头(^后面跟0..n个空格(
    • (--启动一个组
    • HostName—逐字逐句字符串
    • .*—空格,后跟0..n个字符(行尾(
    • )—结束组
  • /——搜索模式结束,替换模式开始
    • 1——四个空格,后跟搜索模式中的第一个(也是唯一一个(组
    • n—换行
    • User ${username}n——您的用户条目
    • ProxyJump ${jump}n——您的ProxyJump条目
  • /—替换模式结束

如果我对sed命令使用双引号,脚本就可以工作了。它采用参数中传递的变量值

sed -i "/^Hostname.*/a Usert$1" config.txt

最新更新