当ssh hostname提示时带有
The authenticity of host 'foobar' can't be established.
ECDSA key fingerprint is ...
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)
我很想知道为什么命令:
yes yes | ssh hostname
Run Code Online (Sandbox Code Playgroud)
不能作为一种自动回答这个问题的方法.提示仍然出现并等待stdin的输入.不应该从yes程序的stdout发送"yes"到程序的stdin ssh吗?我想更深入地了解这里发生了什么以及为什么这不起作用.
为了澄清,我对实际解决绕过提示的问题不感兴趣.我纯粹有兴趣理解为什么,从根本上说,这不起作用.可能我完全误解了作品的标准,我想了解实际发生了什么.
标准输入和交互式终端键盘输入之间存在差异.这也是你无法回复sudo提示密码的原因.
当您从标准输入读取内容时,它们将从文件描述符0(通常的数据管道或键盘输入)中读取.在终端输入的情况下,你真的在和你的伪终端设备(pty/X)交谈.这是一个很好的分裂,因为你可以做一些事情,cat some_file | ssh hostname并知道它作为数据发送.您不必关心身份验证机制,它可以在途中向您提出许多不同的问题.同样的事情适用于cat some_data | sudo command- 您不希望将数据视为您的密码,因为您甚至不知道是否会要求您提供该数据.您也可以阅读没有回复给用户的内容.
对于一般的伪终端信息,请查看https://en.wikipedia.org/wiki/Pseudoterminal或https://unix.stackexchange.com/questions/21147/what-are-pseudo-terminals-pty-tty
如果你想以这种方式与ssh交互,你需要使用(例如)expect.或者,要么直接将签名附加到known_hosts(ssh-keyscan将为您提供正确的行),要么使用ssh -o StrictHostKeyChecking=no,UserKnownHostsFile=/dev/null hostname.
从安全的角度来看,这些都是可怕的想法.如果您想摆脱最初的问题,可以在dns中发布密钥,或使用主机证书.
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |