这就是我正在做的事情:
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正在从我启动单声道应用程序的控制台中写入和读取。我不明白为什么会这样,因为我在上面的代码中重定向了这些流。
答案 0 :(得分:3)
ssh不从stdin读取。这是一种非常故意的行为,专门用于防止人们尝试从脚本或其他程序传入密码。他们没有标志来禁用此行为;没有办法改变它。
执行自动登录的预期方法是使用私钥/公钥机制绕过密码提示。执行此操作的高级步骤是:
ssh-keygen
以创建公钥 - 私钥对。~/.ssh/id_rsa.pub
)添加到服务器的授权主机文件(例如~/.ssh/authorized_keys2
)。通过执行此操作,您授权客户端使用其密钥连接到服务器,因此无需密码。
答案 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
那里有一个样本。