首页 > 解决方案 > ssh 如何从 tty 接收密码?

问题描述

我想知道openssh在登录时如何获取密码,因为我被困在自动输入密码到linux中的类似工具中,这需要从像ssh这样的tty获取密码。

试图了解sshpass,发现sshpass fork出一个pid相同的子进程,然后在子进程下输入密码。

不知道我的猜测是否正确,即 ssh 需要检查正确的 pid,因为我无法使用另一个进程输入 ssh 密码来 stdin 到当前 tty。

标签: linuxsshttyptysshpass

解决方案


出于安全原因,许多程序需要用户以交互方式输入密码。相当多的程序在从标准输入读取密码之前使用以下类型的检查:

if (isatty(STDIN_FILENO) == 0)
{
    exit(EXIT_FAILURE); 
}

所以程序只允许来自终端的密码。这样,它会尝试防止非交互式密码输入。

sshpass 只是一个工具:

欺骗 ssh 以为它正在从交互式用户那里获取密码。[来自 sshpass 的手册页]

为了愚弄sshsshpass创建并打开一个伪终端,并为ssh. fork()需要,因为sshpass必须ssh通过伪终端写入密码。

这种处理方式stdinssh终端,isatty测试会通过。


推荐阅读