是否有可能覆盖SSH期望从/ dev/tty输入密码C

问题描述:

我正在开发一个C软件,需要SSH连接到另一台计算机并以root身份运行命令。是否有可能覆盖SSH期望从/ dev/tty输入密码C

的东西,看起来像这样:

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使用ioctl()和fcntl()取笑答案,但没有提供答案。与this一起,显示它可以从命令行,但我无法翻译它。

使用想到的是选项

使用SSH密钥选项

的SSH C库是选项

使用sshpass是的选项

没有这些,关于我可以想到的是启动一个新的子进程并重定向/关闭文件描述符来控制ssh访问的内容。

编辑:这些限制来自这样一个事实,我正在使用的系统是非常古老的,不包含诸如expect,sshpass和SSH C库之类的工具,以及受sshkeys可用于

+1

'fprintf中(lphSshFD,GetPasswd())拿出一个解决方案;'看起来是错误的。 fprintf()'的格式字符串参数在哪里? – Barmar

+1

如何使用SSH公钥? – Barmar

+0

'lpSshFD'看起来不对,您是否编程Windows API? –

我能够通过查看sshpass的源代码,我发现here

这个工作对我来说:

创建一个名为pwd.sh脚本发出口令:在这样一个新的会话

#!/bin/bash                             
echo -n mypassword 

运行ssh:

SSH_ASKPASS=/path/to/pwd.sh DISPLAY= setsid -w ssh [email protected] <command>    

setsid效果是运行ssh从控制终端,它是所需要的为它尊重SSH_ASKPASS分离。

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

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

+1

注意标签:Stock Solaris doesn没有setsid命令。 – dhke

+0

它可用于OpenSolaris,因此问题可能不会无法解决。如果是这样,编译'setsid'实现需要的〜40行C就不难了。或者只是将它用作'ssh'封装的其他一些实现的基础。或者也许只是使用'nohup','&'和重定向的组合来制作类似的效果。 –