是否可以覆盖 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
我正在用 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()
.
郑重声明,我在 Ubuntu 上用 OpenSSH_7.2p2 测试了这个。
我通过查看我发现的 sshpass 的源代码找到了一个解决方案 here