为什么SSH不能在stdin上使用管道密码?

时间:2015-10-15 22:19:45

标签: unix ssh pipe

在典型的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之间发生的不同。

1 个答案:

答案 0 :(得分:1)

正如其他答案所述,安全是其中的原因。

从技术角度来看,通过执行echo password | ssh user@host,您可以将字符串推送到管道,并且字符在ssh侧等待读取。但是大多数密码提示会在显示提示之前截断此输入(并将其修改为不显示字符 - 稍后描述)。

要回答关于差异的最后一个问题,两者都是某种管道,但是当你在另一侧有终端时,你可以使用控制字符与这一侧进行通信,你可以读取/设置终端的特定属性,在echo的普通管道上显然都失败了。

错误消息是由以下事实引起的:当您从终端读取密码时,您修改终端属性,因此它不会显示写入的字符(所谓的raw mode)。如果ssh程序无法与终端通信,则会失败。