允许 SSH 在 bash 脚本中使用 ssh-agent

允许 SSH 在 bash 脚本中使用 ssh-agent

我正在为公司接管的一组系统进行侦察,他们使用的身份验证方法与我们不同。具体来说,我们使用 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-agentand 调用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 循环使用该代理会话。

相关内容