linux - ssh 如何从 tty 接收密码?
问题描述
我想知道openssh在登录时如何获取密码,因为我被困在自动输入密码到linux中的类似工具中,这需要从像ssh这样的tty获取密码。
试图了解sshpass,发现sshpass fork出一个pid相同的子进程,然后在子进程下输入密码。
不知道我的猜测是否正确,即 ssh 需要检查正确的 pid,因为我无法使用另一个进程输入 ssh 密码来 stdin 到当前 tty。
解决方案
出于安全原因,许多程序需要用户以交互方式输入密码。相当多的程序在从标准输入读取密码之前使用以下类型的检查:
if (isatty(STDIN_FILENO) == 0)
{
exit(EXIT_FAILURE);
}
所以程序只允许来自终端的密码。这样,它会尝试防止非交互式密码输入。
sshpass 只是一个工具:
欺骗 ssh 以为它正在从交互式用户那里获取密码。[来自 sshpass 的手册页]
为了愚弄ssh
,sshpass
创建并打开一个伪终端,并为ssh
. fork()
需要,因为sshpass
必须ssh
通过伪终端写入密码。
这种处理方式stdin
是ssh
终端,isatty
测试会通过。
推荐阅读
- java - Swagger ApiImplicitParam 有没有办法为参数和 api 定义单独的名称
- python-3.x - 将熊猫数据框转换为具有以下格式的excel
- python - pi 摄像头:摄像头已经在使用端口 0
- java - SuggestRequestBuilder.java / org.elasticsearch.action.suggest 缺失
- node.js - 将 Apollo Server NODE_ENV 设置为“生产”模式实际上(内部)做了什么?
- python - 在 Spyder 中创建子单元格
- apache-kafka - 使用 kafka 连接器在 kafka 主题之间复制数据
- r - 如何将逗号分隔的变量分组在同一列中?
- hadoop - 我们可以自动从网站下载 PDF 文件吗
- python-3.x - 用于指定主成分的 pyLDAvis 参数