是否有可能覆盖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可用于
这个工作对我来说:
创建一个名为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。
注意标签:Stock Solaris doesn没有setsid命令。 – dhke
它可用于OpenSolaris,因此问题可能不会无法解决。如果是这样,编译'setsid'实现需要的〜40行C就不难了。或者只是将它用作'ssh'封装的其他一些实现的基础。或者也许只是使用'nohup','&'和重定向的组合来制作类似的效果。 –
'fprintf中(lphSshFD,GetPasswd())拿出一个解决方案;'看起来是错误的。 fprintf()'的格式字符串参数在哪里? – Barmar
如何使用SSH公钥? – Barmar
'lpSshFD'看起来不对,您是否编程Windows API? –