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 坚持从控制台而不是标准输入读取密码的主要内容,如果未能解决你的问题,请参考以下文章