通过 shell 脚本根据变量主机名从 ssh 配置中获取 IdentityFile

Wim*_*eka 5 ssh shell awk parsing ssh-config

我正在编写一个 shell 脚本,我需要IdentityFile从 ssh 配置文件中获取 。ssh 配置文件如下所示:

\n\n
\xe2\x80\x8bHost AAAA\n    User aaaa\n    IdentityFile /home/aaaa/.ssh/aaaaFILE\n    IdentitiesOnly yes\n    PubkeyAuthentication=yes\n    PreferredAuthentications=publickey\n\xe2\x80\x8bHost BBBB\n    User bbbb\n    IdentityFile /home/aaaa/.ssh/bbbbFILE\n    IdentitiesOnly yes\n    PubkeyAuthentication=yes\n    PreferredAuthentications=publickey\n\xe2\x80\x8bHost CCCC\n    User cccc\n    IdentityFile /home/aaaa/.ssh/ccccFILE\n    IdentitiesOnly yes\n    PubkeyAuthentication=yes\n    PreferredAuthentications=publickey\n
Run Code Online (Sandbox Code Playgroud)\n\n

IdentityFile我想根据给定获取后面的字符串Hostname并将其放入变量中。主机名将由名为 的 shell 变量提供${HOSTNAME}

\n\n

我能够使用Bash extract user for a certain host from ssh config fileIdentityFile的答案来读取配置文件,并根据单个特定的 grep 获取单个特定的内容Hostname,但我无法掌握将变量传递到awk。

\n\n

到目前为止我已经尝试过

\n\n
SSH_CONFIG="/home/aaaa/.ssh/config"\n# Note AAAA is the hostname for this case\nKEY=$(awk \'/^Host AAAA$/{x=1}x&&/IdentityFile/{print $2;exit}\' ${SSH_CONFIG})\necho "${KEY}" \n\nOUTPUT: "/home/aaaa/.ssh/aaaaFILE"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是有效的,因为我给出了要解析的确切主机名。\n但是使用

\n\n
SSH_CONFIG="/home/aaaa/.ssh/config"\nHOSTNAME=AAAA\nKEY=$(awk -vcon="${HOSTNAME}" \'/^Host con$/{x=1}x&&/IdentityFile/{print $2;exit}\' ${SSH_CONFIG})\necho "${KEY}" \n\nOUTPUT: ""\n
Run Code Online (Sandbox Code Playgroud)\n\n

不起作用。我知道一个事实${HOSTNAME}正在被设定,因为我正在设定自己(并回应它)。我想传递一个变量,因为我不希望对主机名进行硬编码,并且在调用脚本之前不会知道该值是什么。

\n\n

我还被困在使用旧版本的 ssh (OpenSSH_6.6.1) 中,它没有方便的ssh -G HOSTNAME选项。

\n\n

当涉及到 awk 变量时,我缺少什么?有一个更好的方法吗?

\n

Jak*_*uje 5

我很欣赏脚本尝试,但 OpenSSH 客户端已经知道如何解析配置:

ssh -G $hosname | grep identityfile | awk '{print $2}' | head -n 1
Run Code Online (Sandbox Code Playgroud)

请注意,它还会列出默认身份,但IdentitiesOnly=yes应将配置中的身份列为第一个身份。


Cyr*_*rus 2

使用 GNU grep 和 Perl 兼容的正则表达式:

hostname="AAAA"
grep -Poz "Host $hostname(.*\n)*?.*IdentityFile \K.*" ~aaaa/.ssh/config
Run Code Online (Sandbox Code Playgroud)

输出:

/home/aaaa/.ssh/aaaaFILE