我正在尝试编写 bash 脚本,该脚本读取 .ssh/config 文件并连接到仅使用 IdentityFile 或 ssh 密钥的主机,并在远程服务器上运行命令。因此问题是配置文件包含不使用 IdentityFile 并通过密码连接的主机。如何在文件中明确 grep Host 和 IdentityFile 块并丢弃其他块?我已经编写了使用 for 循环连接到文件中的所有主机的脚本,但这不是我 100% 想要的。谢谢。我的 .ssh/config 文件如下所示:
Host centos7-mp1
Hostname 192.168.89.102
user root
IdentityFile /root/.ssh/keys/id_rsa_passwordless
Host centos6-mp2
Hostname 192.168.89.103
user root
IdentityFile /root/.ssh/keys/id_rsa_passwordless
Host centosvm-test
Hostname 192.168.56.233
user test
答案1
awk
在段落模式对于这种情况很有用 - 你有多行记录由一个或多个空行分隔,例如,要打印Host
匹配记录的键(第二个字段)的值,IdentityFile
您可以执行
awk '/IdentityFile/ {print $2}' RS= .ssh/config
如果需要IdentityFile
不区分大小写匹配,可以将其修改为
awk 'toupper($0) ~ /IDENTITYFILE/ {print $2}' RS= .ssh/config
或(使用 GNU awk)
gawk '/IdentityFile/ {print $2}' RS= IGNORECASE=1 .ssh/config
答案2
在文件内使用 grep 查找特定字符串。对于 grep:
$ grep -i 'string' ~/path/to/config/file/
如果这正是您想要的......