【问题标题】:Why doesn't SSH work with a piped password on stdin?为什么 SSH 不能在标准输入上使用管道密码?
【发布时间】:2015-10-15 22:19:45
【问题描述】:

在典型的 Unix 系统上,如果我尝试通过管道将原始密码传递给 SSH,我会收到类似

的错误
$ echo password | ssh user@host
Pseudo-terminal will not be allocated because stdin is not a terminal.

同样的事情也适用于键盘输入,据我所知,它是通过标准输入以完全相同的方式提供的。

我对将原始密码传递给 SSH 不感兴趣(这太糟糕了,原因太多了,无法列出)

我想了解在这种情况下,来自键盘的标准输入和来自 Unix 管道的标准输入有什么不同。

编辑:我知道 SSH 密钥的存在以及如何使用它们。我也知道将明文密码传递给 ssh 是一个坏主意。这个问题只是关于了解管道的标准输入和键盘的标准输入之间发生了什么不同。

【问题讨论】:

  • 你为什么要使用密码?改用基于密钥的身份验证

标签: unix ssh pipe


【解决方案1】:

正如另一个答案中提到的,安全是原因。

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

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

错误信息是由于当您从终端读取密码时,您修改了终端属性,所以它不会显示写入的字符(所谓的raw mode)。如果 ssh 程序无法与终端通信,则会像这样失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多