ssh 坚持从控制台而不是标准输入读取密码

Posted

技术标签:

【中文标题】ssh 坚持从控制台而不是标准输入读取密码【英文标题】:ssh is insisting on reading the password from the console rather than stdin 【发布时间】:2010-07-28 14:25:32 【问题描述】:

这就是我正在做的:

  ssh_ = new Process();
  ssh_.StartInfo.FileName = SshProvider;
  ssh_.StartInfo.Arguments = "-t -t " + Environment.UserName + "@" + serverName_;
  ssh_.StartInfo.UseShellExecute = false;
  ssh_.StartInfo.RedirectStandardInput = true;
  ssh_.StartInfo.RedirectStandardOutput = true;
  ssh_.StartInfo.RedirectStandardError = true;
  ssh_.StartInfo.CreateNoWindow = true;
  ssh_.Start();
  new Thread(new ThreadStart(ReadStdOut)).Start();
  new Thread(new ThreadStart(ReadStdErr)).Start();

我想从标准输出(或标准错误)读取密码提示并将密码写入标准输入,但 ssh 正在从我启动单声道应用程序的控制台写入和读取。我不明白为什么会这样,因为我已经在上面的代码中重定向了这些流。

【问题讨论】:

【参考方案1】:

ssh 不从标准输入读取。这是一种非常有意的行为,专门用于防止人们尝试从脚本或其他程序中传递密码。他们没有禁用此行为的标志;没有办法改变它。

执行自动登录的预期方法是使用私钥/公钥机制绕过密码提示。执行此操作的高级步骤是:

    在客户端运行ssh-keygen,创建公私密钥对。 将公钥文件(例如~/.ssh/id_rsa.pub)的内容添加到服务器的授权主机文件(例如~/.ssh/authorized_keys2)中。

通过这样做,您授权客户端使用其密钥连接到服务器,因此不需要密码。

【讨论】:

【参考方案2】:

我应该使用像 SharpSSH 或 Granados 这样的 C# SSH 库,而不是尝试与另一个进程交互。

【讨论】:

【参考方案3】:

请查看解决此问题的 python pexpect。

pexpect.sourceforge.net

http://linux.byexamples.com/archives/346/python-how-to-access-ssh-with-pexpect/

塔哈卡

【讨论】:

【参考方案4】:

比这要复杂一点。

SSH 和其他应用程序期望它们的“输入”服务比字节流多一些,它们需要终端处于活动状态。

终端提供各种服务,例如打开和关闭字符“echo”(您将其关闭以输入密码,将其打开以进行常规操作)。能够捕获某些控制序列(选择性地忽略中断或挂起信号),在显示屏上收到更改通知(ssh 需要这个,因此它可以反过来通知远程端终端大小发生了变化,并且您的远程编辑器可以正确重新显示本身)。

Unix 提供了一个名为“伪终端”(简称为“pty”)的服务来提供此功能,而 Mono 有一个 .NET 绑定,可以让您使用伪终端控制进程,您可以在此处找到代码:

http://github.com/mono/pty-sharp

其中包含一个示例。

【讨论】:

以上是关于ssh 坚持从控制台而不是标准输入读取密码的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ssh 在 WINDOWS 上从标准输入接收密码

确定子进程是不是从标准输入读取

从标准输入读取密码

从文件或标准输入读取

如何在不覆盖 TTY 的情况下将密码传递给 su/sudo/ssh?

有没有办法在标准 C++ 中直接从键盘读取输入? [复制]