linux - ssh 如何从 tty 接收密码?

标签 linux ssh tty pty sshpass

我想知道 openssh 在登录时如何获取密码,因为我陷入了自动向 linux 中的类似工具输入密码的困境,这些工具需要从 tty(如 ssh)获取密码。

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

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

最佳答案

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

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

因此该程序仅允许来自终端的密码。这样它会尝试阻止非交互式密码输入。

sshpass 只是一个工具:

fooling ssh into thinking it is getting the password from an interactive user. [from man page of sshpass]

为了欺骗 sshsshpass 创建并打开一个伪终端,并为 ssh 的标准输入提供该终端。需要 fork() 是因为 sshpass 必须通过伪终端向 ssh 写入密码。

这样ssh进程的stdin就是一个终端,isatty测试就会通过。

关于linux - ssh 如何从 tty 接收密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55351259/

相关文章:

ssh - 关闭并打开Goog​​le Cloud虚拟机(计算引擎)后,动态端口转发失败

ssh - 使用GNU并行进行ssh隧道

Linux 子系统 ssh 看不到 id_rsa.pub

GPSD 没有得到很好的修复

Linux发行版根目录中有 '/data'?

linux - Linux 中的电子邮件目录列表

linux - 通过 Node 0.10.25 安装 jshint 时出现详细的错误 json 错误

regex - 在 bash 中交换文件中的 2 个单词的最佳方法是什么

perl - 此 tty 上的选项卡有多少个空格

c - C 中带有 termios : unreliable output capitalization 的串行 I/O