是否可以覆盖 SSH 期望从 C 中的 /dev/tty 输入密码

Is it possible to override SSH expecting password input from /dev/tty in C

我正在用 C 语言开发一个软件,它需要通过 SSH 连接到另一台机器并以 root 身份 运行 命令。

看起来像这样的东西:

char* GetPasswd(void);

void run(char* apnSshCommand)
{
   FILE* lphSshFD = popen(apnSshCommand,"w");
   fprintf(lphSshFD,GetPasswd());
   fflush(lphSshFD);
   fprintf(lphSshFD,"#Command to run in shell");
   fflush(lphSshFD);
}

GetPasswd() 将是对用户输入密码的 gui 的回调

我知道上面的代码是不可能的,因为 SSH 需要自己的 /dev/tty 来提供身份验证密码。

我已经阅读了诸如 this that teases an answer using ioctl() and fcntl() but does not provide one. Along with this 之类的帖子,表明可以从命令行进行操作,但我无法翻译它。

使用 expect 不是一个选项

使用 SSH 密钥不是一个选项

SSH C 库不是一个选项

使用 sshpass 不是一个选项

没有这些,我唯一能想到的就是启动一个新的子进程和 redirect/close 文件描述符来控制 ssh 可以访问的内容。

编辑:这些限制来自于我正在使用的系统非常陈旧,不包含诸如 expect、sshpass 和 SSH C 库之类的工具,并且在何时使用方面受到多重限制可以使用sshkeys

这对我有用:

创建一个名为 pwd.sh 的脚本来发出密码:

 #!/bin/bash                                                                                                                  
 echo -n mypassword

运行 在这样的新会话中使用 ssh:

 SSH_ASKPASS=/path/to/pwd.sh DISPLAY= setsid -w ssh root@192.168.1.10 <command>             

setsid的作用是运行ssh脱离控制终端,这是它尊重SSH_ASKPASS.[=16=所需要的]

我没试过,但我希望能够使用 system().

从 C 中 运行 这个命令

郑重声明,我在 Ubuntu 上用 OpenSSH_7.2p2 测试了这个。

我通过查看我发现的 sshpass 的源代码找到了一个解决方案 here