我正在为公司接管的一组系统进行侦察,他们使用的身份验证方法与我们不同。具体来说,我们使用 AD 身份验证和跳转服务器来访问系统,而他们使用密钥、密码和其他各种系统的混合体。
对于使用 SSH 密钥的系统,我正在尝试编写一个脚本,使我能够自动登录并运行命令来检索数据。我的密钥上有密码,因此我试图利用 ssh-agent 使我的脚本能够在几乎无需输入的情况下对系统进行身份验证。
到目前为止,问题似乎是当我运行类似下面的程序时,ssh-agent 要么 A.) 在我的 for 循环之前死亡并结束,要么 B.) 打印环境变量的命令并且不将它们拉入范围。
eval ssh-agent
ssh-add ~/.ssh/${USER}_mvc
for i in `cat ${HOSTLIST}`
do
ssh -l ${USER} ${i} -t 'uname -r'
&>${OUTDIR}/${i}.keyauthcollector
done
我知道我缺少一些东西来引入 SSH 代理生成的变量,但我似乎找不到它,当然,我在谷歌上搜索 SSH-Agent 脚本帮助时找到的所有脚本都在寻找让 ssh-agent 为您当前会话运行的方法,而不是脚本。
答案1
这ssh-agent 的手册页解释缺少的内容:
设置代理的主要方法有两种:
首先,代理启动一个新的子命令,将一些环境变量导出到其中,例如
ssh-agent xterm &
。第二种是代理打印所需的 shell 命令(可以生成 sh(1) 或 csh(1) 语法),这些命令可以在调用 shell 中进行评估,例如,
ssh-agent -s
对于 Bourne 类型 shell(如 sh(1) 或 ksh(1)),eval 以及ssh-agent -c
对于 csh(1) 及其衍生产品,eval 均可以。
第一个选项是删除eval ssh-agent
and 调用ssh-agent your-script
。第二个选项是添加缺失的$(
...)
以将捕获ssh-agent
的输出作为 eval 的输入,如中所述RalfFriedl 的回答。
答案2
ssh-agent
我还建议从脚本外部启动,这样您的脚本运行时就不需要密码。
但如果你想为你的剧本找一个经纪人,那么可以这样做
eval $(ssh-agent)
此后,您可以向代理添加密钥并使用代理进行登录。
答案3
经过反复检查,我似乎找到了解决方案,但我仍然对在脚本中实现这一点感兴趣。我能够在运行脚本之前部署 ssh-agent 和 ssh-add,并删除所有提及 ssh-agent 的相关命令(特别是我的示例中的第 1 行和第 2 行),从而使脚本正常工作。SSH 使用我在脚本之外设置的代理变量,并成功使用密钥进行身份验证。
缺点:我仍然不知道如何让它在 shell 脚本中创建 ssh-agent 会话并继续使用 for 循环使用该代理会话。