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



我正在用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来提供身份验证的密码。

我读过这样的帖子,它使用ioctl()和fcntl()来调侃答案,但没有提供答案。同时,这表明它是可能的,从命令行,但我还不能翻译它

使用expect是NOT选项

使用SSH密钥是NOT选项

SSH C库是NOT选项

使用sshpass是NOT选项

如果没有这些,我唯一能想到的就是启动一个新的子进程,并重定向/关闭文件描述符来控制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所需要的。

我还没有尝试过,但我希望能够使用system()从C运行此命令。

为了记录在案,我在Ubuntu上用OpenSSH_7.2p2测试了这个。

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

最新更新