如何在C#中的SSH服务器上运行命令?

时间:2015-06-17 05:52:42

标签: c# .net ssh ssh.net

我需要使用C#代码执行此操作:

  1. 在后台打开putty.exe(这就像一个cmd窗口)
  2. 使用其IP地址登录远程主机
  3. 输入用户名和密码
  4. 一个接一个地执行几个命令。
  5. 运行另一个获得响应的命令,告诉我在成功执行之前运行的命令
  6. 所以我试着这样做:

    ProcessStartInfo proc = new ProcessStartInfo() 
    {
         FileName = @"C:\putty.exe",
         UseShellExecute = true, //I think I need to use shell execute ?
         RedirectStandardInput = false,
         RedirectStandardOutput = false,
         Arguments = string.Format("-ssh {0}@{1} 22 -pw {2}", userName, hostIP, password)
         ... //How do I send commands to be executed here ?
    };
    Process.Start(proc);
    

2 个答案:

答案 0 :(得分:15)

您可以尝试https://sshnet.codeplex.com/。 有了这个,你根本不需要腻子或窗户。 你也可以得到答案。 它会看起来......像这样。

SshClient sshclient = new SshClient("172.0.0.1", userName, password);    
sshclient.Connect();
SshCommand sc= sshclient .CreateCommand("Your Commands here");
sc.Execute();
string answer = sc.Result;

编辑:另一种方法是使用shellstream。

创建一个ShellStream,如:

ShellStream stream = sshclient.CreateShellStream("customCommand", 80, 24, 800, 600, 1024);

然后你可以使用这样的命令:

  public StringBuilder sendCommand(string customCMD)
    {
        StringBuilder answer;

        var reader = new StreamReader(stream);
        var writer = new StreamWriter(stream);
        writer.AutoFlush = true; 
        WriteStream(customCMD, writer, stream);
        answer = ReadStream(reader);
        return answer;
    }

private void WriteStream(string cmd, StreamWriter writer, ShellStream stream)
    {
        writer.WriteLine(cmd);
        while (stream.Length == 0)
        {
            Thread.Sleep(500);
        }
    }

private StringBuilder ReadStream(StreamReader reader)
    {
        StringBuilder result = new StringBuilder();

        string line;
        while ((line = reader.ReadLine()) != null)
        {
            result.AppendLine(line);
        }
        return result;
    }

答案 1 :(得分:4)

虽然@LzyPanda的答案有效,但使用SSH" shell" channel(SshClient.CreateShellStream),只允许交互式终端,不是自动执行命令的好主意。你会从中获得很多副作用,比如命令提示,ANSI序列,某些命令的交互行为等。

对于自动化,请使用SSH" exec"频道(SshClient.CreateCommand):

using (var command = ssh.CreateCommand("command"))
{
    Console.Write(command.Execute());
}

如果需要执行多个命令,请重复上述代码。你可以创建任意数量的" exec"一个SSH连接的通道。

虽然如果命令相互依赖(第一个命令修改了环境,例如后面命令使用的变量),你可以在一个通道中执行它们。使用shell语法,例如&&;

using (var command = ssh.CreateCommand("command1 && command2"))
{
    Console.Write(command.Execute());
}

如果需要连续读取命令输出,请使用:

using (var command = ssh.CreateCommand("command"))
{
    var asyncExecute = command.BeginExecute();
    command.OutputStream.CopyTo(Console.OpenStandardOutput());
    command.EndExecute(asyncExecute);
}

您还可以使用包含stdout和stderr的ExtendedOutputStream。请参阅SSH.NET real-time command output monitoring

不幸的是执行" exec" SSH.NET中的通道不允许为命令提供输入。对于该用例,您需要求助于" shell"渠道,直到这个限制得到解决。