请注意,这必须在一个窗口框,因为我使用C#来访问有关窗口的信息
(我需要从一个窗口框和一个Linux的盒子的信息,再加上我认为,使一个程序/脚本运行无gui和访问窗口从一个Linux的盒子没有用户干预将更加困难,如果这不是真的,请告诉我,我很乐意做这个只能运行在Windows上的窗口信息的部分* nix)。
有一个很好的c#api从窗口获取这个信息,在* nix上,它足够简单的运行一个命令,并parsing输出到我的需要。
关于从c#中使用ssh似乎没有太多像样的build议,sharpSSH和Granados似乎还没有更新多年,他们是否体面? 我应该担心安全问题吗?
(我正在检索的信息并不敏感,但如果ssh实现可能有未修补的安全漏洞(如果它们还没有更新多年),我担心有人窃取我的凭据。
有没有其他像样的c#ssh库。 如果命令输出很简单,我应该只运行plink / putty(运行windows cmd shell for plink很困难,并捕获输出(有没有办法做到这一点,而没有壳popup)?
PS,而商业图书馆看起来不错,我更喜欢免费的东西(如果可能,在成本和免费源代码)。
在没有shell弹出的情况下调用plink是很容易的。
不显示窗口的技巧是设置ProcessStartInfo.CreateNoWindow = true
。
添加一些错误处理到这一点,你就完成了。
— PlinkWrapper.cs —
using System.Collections.Generic; using System.Diagnostics; namespace Stackoverflow_Test { public class PlinkWrapper { private string host { get; set; } /// <summary> /// Initializes the <see cref="PlinkWrapper"/> /// Assumes the key for the user is already loaded in PageAnt. /// </summary> /// <param name="host">The host, on format user@host</param> public PlinkWrapper(string host) { this.host = host; } /// <summary> /// Runs a command and returns the output lines in a List<string>. /// </summary> /// <param name="command">The command to execute</param> /// <returns></returns> public List<string> RunCommand(string command) { List<string> result = new List<string>(); ProcessStartInfo startInfo = new ProcessStartInfo("plink.exe"); startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.CreateNoWindow = true; startInfo.Arguments = host + " " + command; using (Process p = new Process()) { p.StartInfo = startInfo; p.Start(); while (p.StandardOutput.Peek() >= 0) { result.Add(p.StandardOutput.ReadLine()); } p.WaitForExit(); } return result; } } }
—结束PlinkWrapper.cs —
这样称呼
PlinkWrapper plink = new PlinkWrapper("albin@mazarin"); foreach (var str in plink.RunCommand("pwd")) Console.WriteLine("> " + str);
和输出将是一样的
> /home/albin
与plink
好处是,它是很好的证明,并整合与pageant
。
示例代码
有几个用于C#的商业SSH客户端库。 以下代码显示了如何连接到* nix框,运行命令并使用我们的Rebex SSH Shell读取响应。
// create client, connect and log in Ssh client = new Ssh(); client.Connect(hostname); client.Login(username, password); // run the 'uname' command to retrieve OS info string systemName = client.RunCommand("uname -a"); // display the output Console.WriteLine("OS info: {0}", systemName); client.Disconnect();
对于高级方案(例如交互式命令),请参阅SSH Shell教程 。
参考和稳定
您可能已经在不知情的情况下使用了Rebex SSH核心库。 Rebex SFTP(使用这个SSH lib作为传输层)被微软用于包括Expression Web和Visual Studio 2010在内的多种产品。Rebex SSH Shell只是另外一层(最值得一提的是一个终端仿真器)。
您可以从http://www.rebex.net/ssh-shell.net/download.aspx下载试用版。 支持论坛使用引擎非常相似,这个网站上运行http://forum.rebex.net/
免责声明:我参与了Rebex SSH的开发
我用SharpSsh lib做一个异步目录同步程序之间的Linux和Windows之间的框(我选择SFTP安全文件传输)。 多年保持不变并不意味着不安全。
它真的很容易使用:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Tamir.SharpSsh; namespace sftpex { class Program { static void Main(string[] args) { try { SshExec exec = new SshExec(ipAddress, username, password); Console.Write("Connecting..."); exec.Connect(); Console.WriteLine("OK"); if (exec.Connected) Console.WriteLine(exec.Cipher); while (true) { Console.Write("Enter a command to execute ['Enter' to cancel]: "); string command = Console.ReadLine(); if (command == "") break; string output = exec.RunCommand(command); string[] m = output.Split('\n'); for(int i=0; i<m.Length; i++) Console.WriteLine(m[i]); } Console.Write("Disconnecting..."); exec.Close(); Console.WriteLine("OK"); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
如果您不愿意与C库互操作,我相信OpenSSH是可用于此工作的最好的库之一。
过去我使用过SharpSSH在Linux机器上执行命令。 有相当多的错误,我不得不修改代码来修复其中的一些,但最终它有点工作…
有一个商业软件IP * Works SSH可以完成这项工作。