【问题标题】:How do I pipe the password to ssh in C++?如何在 C++ 中将密码通过管道传输到 ssh?
【发布时间】:2011-12-23 12:17:18
【问题描述】:

我有一个 C++ 类用于启动和与外部进程通信(有点类似于 Qt 的 QProcess - 我们不能使用 Qt,因为我们正在处理小型嵌入式系统)。它使用 pipe 和 dup2 系统调用来建立父进程和子进程之间的链接。问题是 - 它不适用于 ssh、scp 和其他需要密码的程序。我已经跟踪了 ssh,它似乎打开了 /dev/tty 并以某种方式使用它从命令行读取密码。有什么方法可以从我的班级输入密码或检测应用程序需要来自 stdin 以外的其他来源的输入(根本不必是可移植的)?

【问题讨论】:

  • 您不想发送密码。您要做的是让 ssh 读取和使用您在 ~/.ssh 目录中的私钥
  • 使用公钥认证或者看看 askpass 和 ssh-agent
  • sshpass

标签: c++ linux process ssh pipe


【解决方案1】:

寻找一些已经这样做的程序,例如 lftp。

或者 strace 这个 Perl 单行代码来了解你应该做什么:

perl -MNet::OpenSSH -e 'Net::OpenSSH->new(localhost, password => foo)'

它主要简化为在主进程上分配一个伪 tty 对,在执行 ssh 之前将子进程上 pty 的从属部分分叉并设置为当前 tty。

【讨论】:

    【解决方案2】:

    ssh 程序直接从终端读取密码是一种常见的做法。您需要分配一个伪终端并在该伪终端内执行 ssh 以捕获此 I/O。 pty 手册页(第 7 节,man 7 pty)是一个很好的介绍。

    我想再次声明,您通常不想为 ssh 提供密码,有很多更好的身份验证选项。对应该并且可能在没有用户输入的情况下运行的进程使用公钥身份验证。

    【讨论】:

    • +1 表示公钥建议。其他任何东西都可能会将明文密码放入程序中(错误)。
    • 您对安全漏洞的看法可能是正确的,但我只是希望我正在编写的这个库尽可能灵活。最终用户是否会以适当的方式执行 ssh 操作将取决于最终用户。
    猜你喜欢
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多