2015-06-17 17 views
5

tôi cần phải thực hiện hành động này sử dụng một mã C#:Làm thế nào để chạy các lệnh trên máy chủ SSH trong C#?

  1. mở putty.exe ở chế độ nền (điều này cũng giống như một cửa sổ cmd)
  2. đăng nhập vào một máy chủ từ xa sử dụng địa chỉ IP của nó
  3. nhập tên người dùng và mật khẩu
  4. thực thi nhiều lệnh một lần.
  5. chạy một lệnh mà được một phản ứng nói với tôi rằng các lệnh tôi chạy trước đó nơi thực hiện thành công

Vì vậy, tôi đang cố gắng để làm điều đó như thế này:

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); 
+0

Bạn có muốn chạy cùng một bộ lệnh mỗi lần không?Nếu vậy, hãy thử thêm chúng vào tệp '.bashrc' của bạn. Nếu bạn muốn chạy các lệnh khác nhau, hãy cho chúng tôi biết. – AirPett

+0

Các lệnh tôi đang chạy là thêm địa chỉ mac của người dùng vào bộ điều khiển wifi. Vì vậy, về cơ bản các lệnh giống nhau nhưng với địa chỉ mac khác nhau mỗi lần ... Và bạn có thể vui lòng cho tôi biết tệp '.bashrc' này là gì và làm cách nào để thêm chúng vào đó? –

+0

NẾU đó là một máy chủ Linux (tôi cho rằng vì việc sử dụng ssh), trong thư mục chính của người dùng là một tệp có tên là '.bashrc' (/home/$user/.bashrc). Tập tin đó là một kịch bản lệnh shell bị xử lý mỗi lần người dùng đăng nhập. Ví dụ, tôi có một số thông tin chi tiết về hiệu năng của máy chủ luôn được đăng nhập (tức là 'df -h' và' uptime'). – AirPett

Trả lời

10

Bạn có thể thử https://sshnet.codeplex.com/ . Với điều này bạn sẽ không cần putty hoặc cửa sổ cả. Bạn cũng có thể nhận được phản hồi. Nó sẽ trông sth. như thế này.

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; 

Chỉnh sửa: Cách tiếp cận khác sẽ là sử dụng trình bao.

Tạo một ShellStream lần thích:

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

Sau đó, bạn có thể sử dụng một lệnh như thế này:

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; 
    } 
+0

Tệp đã tải xuống mà bạn đã liên kết nếu cho một dự án thư viện lớp? Vì vậy, tôi cần phải biên dịch nó và tham chiếu dll của nó trong dự án của tôi? –

+0

Bạn có thể lấy nó dễ dàng thông qua Gói NuGet. Xem [tại đây] (https://www.nuget.org/packages/SSH.NET/). Sau đó bạn chỉ cần thêm nó làm tài liệu tham khảo. – LzyPanda

+0

Bạn có thể vui lòng cho tôi biết, nếu tôi cần chạy lệnh "bật" để nhắc tôi nhập mật khẩu khác, tôi có thể chạy nó bằng mã mẫu bạn đã chỉ định ở trên không? –

1

Trong khi câu trả lời bằng cách @LzyPanda hoạt động, sử dụng một SSH "vỏ" kênh (SshClient.CreateShellStream), chỉ để cho một thiết bị đầu cuối tương tác, không phải là một ý tưởng tốt để tự động thực thi lệnh. Bạn nhận được rất nhiều tác dụng phụ từ đó, như nhắc nhở lệnh, chuỗi ANSI, hành vi tương tác của một số lệnh vv

Đối với tự động hóa, sử dụng một SSH "exec" kênh (SshClient.CreateCommand):

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

Nếu bạn cần thực thi nhiều lệnh, hãy lặp lại mã trên. Bạn có thể tạo bất kỳ số kênh "exec" nào cho một kết nối SSH.

Mặc dù nếu lệnh phụ thuộc vào nhau (lệnh đầu tiên đã sửa đổi môi trường, ví dụ: biến, được sử dụng bởi lệnh sau), bạn đã thực thi chúng trong một kênh. Sử dụng một cú pháp vỏ cho rằng, giống như && hoặc ;:

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

Nếu bạn cần phải liên tục đọc sử dụng lệnh đầu ra:

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

Bạn cũng có thể sử dụng ExtendedOutputStream, trong đó có cả stdout và stderr. Xem SSH.NET real-time command output monitoring.


Rất tiếc việc triển khai kênh "exec" trong SSH.NET không cho phép chứng minh đầu vào cho lệnh. Đối với trường hợp sử dụng đó, bạn sẽ cần phải sử dụng kênh "shell", cho đến khi giới hạn này được giải quyết.

Các vấn đề liên quan