最近,我不得不解决一个边缘案例,我必须向用户添加一些服务器指纹known_hosts
(授权是通过密钥对执行的)。我认为最简单的解决方案就是调用
yes yes | ssh *login@host*
。令人惊讶的是(至少对我来说),这不起作用:ssh
仍然询问是否添加指纹,并需要手动输入。
我的问题是:为什么会这样?这种行为背后的机制是什么?
答案1
对于此提示,ssh
不使用标准输入&标准输出流 – 避免提示与远程命令的输入/输出混淆。(想象一下运行ssh host cat something.tar | tar x
,突然tar x
抱怨其输入中有垃圾。)
相反,ssh
打开特殊设备/dev/tty
,该设备始终指向其“控制终端”,在那里写入提示,并从中读取答案。
对于您的问题,OpenSSH 附带了ssh-keyscan
一个可以同时获取多个服务器公钥的工具。
ssh-keyscan host1 host2 host3 >> ~/.ssh/known_hosts
(我不确定您是否意味着known_hosts
,或者实际上authorized_keys
在这里需要。)
对于一般情况,该expect
实用程序可用于自动化通常通过 tty 执行 I/O 的程序。