我正在用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的源代码,找到了一个解决方案