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