在典型的Unix系统上,如果我尝试通过管道将原始密码传递到SSH
,我会收到类似
$ echo password | ssh user@host
Pseudo-terminal will not be allocated because stdin is not a terminal.
完全相同的东西适用于键盘输入,据我所知,它以完全相同的方式提供给stdin。
我对将原始密码传递给SSH不感兴趣(由于列出的原因太多,这会很糟糕)
我想了解这种情况在键盘的stdin和Unix管道的stdin之间有什么不同。
编辑:我知道SSH密钥的存在以及如何使用它们。我也知道将明文密码传递给ssh是个坏主意。这个问题只是关于理解管道中的stdin与键盘中的stdin之间发生的不同。
答案 0 :(得分:1)
正如其他答案所述,安全是其中的原因。
从技术角度来看,通过执行echo password | ssh user@host
,您可以将字符串推送到管道,并且字符在ssh
侧等待读取。但是大多数密码提示会在显示提示之前截断此输入(并将其修改为不显示字符 - 稍后描述)。
要回答关于差异的最后一个问题,两者都是某种管道,但是当你在另一侧有终端时,你可以使用控制字符与这一侧进行通信,你可以读取/设置终端的特定属性,在echo
的普通管道上显然都失败了。
错误消息是由以下事实引起的:当您从终端读取密码时,您修改终端属性,因此它不会显示写入的字符(所谓的raw mode)。如果ssh程序无法与终端通信,则会失败。