我想知道 openssh 在登录时如何获取密码,因为我陷入了在自动输入密码到 Linux 中的类似工具中,这需要从 tty 获取密码,如 ssh。
试图理解 sshpass,发现 sshpass 用相同的 pid 分叉一个子进程,然后在子进程下输入密码。
不知道我的猜测是否正确,ssh 需要检查正确的 pid,因为我无法使用另一个进程输入 ssh 密码来标准到当前的 tty。
出于安全原因,许多程序需要用户以交互方式提供密码。相当多的程序在从stdin读取密码之前使用以下类型的检查:
if (isatty(STDIN_FILENO) == 0)
{
exit(EXIT_FAILURE);
}
因此,该程序仅允许来自终端的密码。这样,它就会尝试防止非交互式密码输入。
SSHpass 只是一个工具:
欺骗SSH认为它正在从交互式用户那里获取密码。[来自 SSHpass 的手册页]
为了愚弄ssh
,sshpass
创建并打开一个伪终端,并给出 ssh
的 stdin。 fork()
是必需的sshpass
因为必须写入密码才能通过伪终端ssh
。
这样ssh
过程的stdin
就是终端,isatty
测试都将通过。