代码之家  ›  专栏  ›  技术社区  ›  CodeSmith

是否可以重写SSH,该SSH期望从C中的/dev/tty输入密码

  •  -2
  • CodeSmith  · 技术社区  · 9 年前

    我正在用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的回调

    我读过一些帖子,比如 this 它使用ioctl()和fcntl()来梳理答案,但没有提供答案。随着 this

    使用expect是 不是 A选项

    使用SSH密钥是 不是 A选项

    SSH C库是 A选项

    A选项

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

    编辑:这些限制来自这样一个事实:我正在使用的系统非常旧,不包含expect、sshpass和SSH C库等工具,并且在何时可以使用sshkeys方面受到多种限制

    2 回复  |  直到 9 年前
        1
  •  0
  •   Kevin Boone    9 年前

    这对我来说很有用:

    创建一个名为 pwd.sh 发出密码:

     #!/bin/bash                                                                                                                  
     echo -n mypassword
    

     SSH_ASKPASS=/path/to/pwd.sh DISPLAY= setsid -w ssh root@192.168.1.10 <command>             
    

    的影响 setsid 是要运行 ssh 与控制终端分离,这是它尊重SSH\u ASKPASS所需要的。

    我没有试过,但我希望能够使用 system() .

        2
  •  0
  •   CodeSmith    9 年前

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