ssh坚持从控制台而不是stdin读取密码

时间:2010-07-28 14:25:33

标签: .net mono ssh ipc

这就是我正在做的事情:

  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();

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

4 个答案:

答案 0 :(得分:3)

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

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

  1. 在客户端上运行ssh-keygen以创建公钥 - 私钥对。
  2. 将公钥文件的内容(例如~/.ssh/id_rsa.pub)添加到服务器的授权主机文件(例如~/.ssh/authorized_keys2)。
  3. 通过执行此操作,您授权客户端使用其密钥连接到服务器,因此无需密码。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

pexpect.sourceforge.net

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

塔哈尔卡

答案 3 :(得分:0)

比这复杂一点。

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

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

Unix提供了一个名为“伪终端”(缩写为“pty”)的服务,它提供了这个功能,Mono有一个.NET绑定,可以让你使用伪终端控制进程,你可以在这里找到代码:

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

那里有一个样本。