Wim*_*eka 5 ssh shell awk parsing ssh-config
我正在编写一个 shell 脚本,我需要IdentityFile从 ssh 配置文件中获取 。ssh 配置文件如下所示:
\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\nRun Code Online (Sandbox Code Playgroud)\n\nIdentityFile我想根据给定获取后面的字符串Hostname并将其放入变量中。主机名将由名为 的 shell 变量提供${HOSTNAME}。
我能够使用Bash extract user for a certain host from ssh config fileIdentityFile的答案来读取配置文件,并根据单个特定的 grep 获取单个特定的内容Hostname,但我无法掌握将变量传递到awk。
到目前为止我已经尝试过
\n\nSSH_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"\nRun Code Online (Sandbox Code Playgroud)\n\n这是有效的,因为我给出了要解析的确切主机名。\n但是使用
\n\nSSH_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: ""\nRun Code Online (Sandbox Code Playgroud)\n\n不起作用。我知道一个事实${HOSTNAME}正在被设定,因为我正在设定自己(并回应它)。我想传递一个变量,因为我不希望对主机名进行硬编码,并且在调用脚本之前不会知道该值是什么。
我还被困在使用旧版本的 ssh (OpenSSH_6.6.1) 中,它没有方便的ssh -G HOSTNAME选项。
当涉及到 awk 变量时,我缺少什么?有一个更好的方法吗?
\n我很欣赏脚本尝试,但 OpenSSH 客户端已经知道如何解析配置:
ssh -G $hosname | grep identityfile | awk '{print $2}' | head -n 1
Run Code Online (Sandbox Code Playgroud)
请注意,它还会列出默认身份,但IdentitiesOnly=yes应将配置中的身份列为第一个身份。
使用 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
| 归档时间: |
|
| 查看次数: |
1936 次 |
| 最近记录: |