让我重新表述一下整个问题。我已经使用以下脚本获得了所有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